Я делаю сайт объявлений с Zend Framework (да, я знаю, что в мире нет места для "еще одного клона Craigslist").Я пытаюсь реализовать возможность публиковать / редактировать / удалять без необходимости в учетной записи.
Чтобы сделать это, я чувствую, что мне нужно создать одноразовый номер после отправки и сохранить в базе данных.Затем отправьте по электронной почте ссылку на пользователя, который отправляет GET-запрос на удаление, например:
http://www.somesite.com/post/delete/?id=123&nonce=2JDXS93JFKS8204HJTHSLDH230945HSLDF
Только у пользователя есть этот уникальный ключ или одноразовый номер,и после отправки я проверяю базу данных под идентификатором сообщения и проверяю соответствие одноразовых номеров перед удалением.
Моя проблема заключается в том, насколько безопасным является одноразовый номер.Если я использую Zend Framework Zend_Form_Element_Hash
, он создает хеш следующим образом:
protected function _generateHash()
{
$this->_hash = md5(
mt_rand(1,1000000)
. $this->getSalt()
. $this->getName()
. mt_rand(1,1000000)
);
$this->setValue($this->_hash);
}
Читая о mt_rand (), один комментатор сказал" Эта функция имеет ограниченную энтрофиюТаким образом, если вы хотите создать случайную строку, она выдаст только около 2 миллиардов различных строк, независимо от длины строки. Это может быть серьезной проблемой безопасности, если вы используете такие строки для идентификаторов сеансов, паролей и т. Д."
Из-за срока действия одноразового номера / токена в приложении, который может занять несколько дней или недель, прежде чем пользователь решит удалить сообщение, я думаю, что для потенциального взлома будет выделено более чем достаточно времени.
Я понимаю, mt_rand()
- это огромное улучшение с rand()
, как видно на , это визуальное отображение пикселей с rand
слева и mt_rand
справа.Но достаточно ли этого?Что делает « 2 миллиарда различных строк » проблемой безопасности?
И, в конечном счете, как я могу увеличить энтропию для nonce / token / hash?