我想知道是否使用substr(md5(rand()),0,17);密码重置链接足够安全吗?如果我要生成一个更长的字符串,那会使它更安全吗? MD5绝对安全吗?还是我应该做$token = sha1(uniqid($username,true));?
解决方法:
substr()或md5()的使用仅次于rand()的使用.
使用密码重置令牌的全部要点是它们不可预测,并且由于底层的LCG模型,已知rand()较弱.
最好使用系统的熵源,例如:
$rand = openssl_random_pseudo_bytes(8); // take 8 random bytes
$token = substr(md5($rand), 0, 17);
它从系统的随机源中获取字节,例如Linux上的/ dev / urandom或Windows上的相应系统.
请注意,如果没有任何特定的大小限制,则最好选择完整的sha1()输出并采用16个随机字节.
另外,在将密码重置令牌存储在数据库中时,应将其视为(临时的,有时间限制的)密码.我建议将上述令牌发送给用户,然后在将它们写入数据库之前使用password_hash()
.在以后的阶段中,您可以使用password_verify()检查给定的令牌(假设令牌没有过期).