Поэтому, по существу, вопрос в том, могу ли я использовать хэш 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,000000000000000000000000000000000000000000000000000000%.
С 12,8 квадриллионными блоками ваши шансы составляют 0,00000000000001110223024625156540423631668090820313%. Чтобы иметь 12,8 квадриллионов блоков, вам необходимо 95 EB с кусками в 8 КБ, 190 EB с кусками в 16 КБ или 290 EB с кусками в 24 КБ.
См. Также: https://pthree.org/2014/03/06/the-reality-of-sha1/
В заключение, да, это довольно безопасно.
При этом убедитесь, что вы сольете свой хэш, иначе их можно легко восстановить. Насколько случайным и безопасным вам нужна эта соль, зависит от вас.
SELECT user_id FROM users WHERE verification_hash = :hash
и получить идентификатор таким образом (поскольку мы предполагаем, что хеш-код уникален). Наличие в URL двух факторов (id / hash, email / hash и т. Д.) Предотвращает угадывание множества хэшей и авторизацию случайных пользователей. Это нужно ? Возможно нет. Полезно ли включать что-то еще? Вероятно.
$verifyHash = sha1[$uid.$email.date('r').mt_rand()];
?