По сути, вопрос в том, могу ли я использовать хэш SHA1 для отправки электронного письма с подтверждением новому пользователю с небольшим шансом дублирования хэша?
Я хочу отправить пользователю это письмо: www.example.com/verify.php?hash=[40 digit sha1 hash]
в отличие от отправки им этого Emai: www.example.com/verify.php?user=123456&hash=[40 digit sha1 hash]
Я хочу избежать отправки второго пользовательского параметра.
Хеш создается так:
$verifyHash = sha1[$uid.$email.date('r')];
куда $uid
уникален, $email
уникален и date('r')
настолько уникален, насколько это возможно с меткой времени Unix.
Как вы думаете, каковы шансы создания дублирующих хешей?
Достаточно близко к нулю, чтобы игнорировать.
Тем не менее, вы должны дополнительно добавить случайность, используя mt_rand
, Точное время на вашем сервере легко угадать, а адрес электронной почты и UID известны злоумышленникам.
Что-нибудь менее 12,8 квадриллионов блоков, и ваши шансы
0,00000000000000000000000000000000000000000000000000%.С 12,8 квадриллионом блоков ваши шансы
0,00000000000001110223024625156540423631668090820313%. Чтобы иметь 12,8 квадриллионов блоков, вам нужно 95 ЭБ с кусками по 8 КБ, 190 ЭБ с 16 КБ.
куски, или 290 ЭБ с кусками по 24 КБ.
Смотрите также: https://pthree.org/2014/03/06/the-reality-of-sha1/
В заключение, да, это довольно безопасно.
Это, как говорится, убедитесь, что вы поваренная соль ваш хэш, иначе их можно легко восстановить. Насколько случайной и безопасной вам нужна эта соль, зависит от вас.