当用户注册帐户时,他们会收到一封包含验证码的电子邮件,他们可以点击该验证码来验证其帐户。
这是我生成验证码的方式。
md5(rand(0,1000)
使用下面的方法是一个糟糕的选择吗?它生成0-1000之间的随机数。由于只有1000个选项,并且他们的MD5哈希值已知,因此攻击者只需1000次审判即可验证帐户,而不会真正属于他们
答案 0 :(得分:5)
这个帖子How to generate a verification code/number?对此事有一些好的想法。哈希,可逆哈希,校验位......根据您的需要提供多种选择。
答案 1 :(得分:2)
用攻击者无法知道的东西播种:
md5(rand(0,1000).'helloworld234');
你可以去的方式没有限制
md5(md5(time().'helloguys'.rand(0,9999)));
方式太多,但你明白了。
答案 2 :(得分:2)
rand(1,1000)是10位熵。 MD5它没有增加。平均而言,攻击者需要500次尝试来验证帐户。没有任何速率限制可以帮助您,因为熟练的攻击者将租用或已经拥有将用于验证帐户的僵尸网络。
安全播放并在验证链接中包含128位熵。在PHP openssl_random_pseudo_bytes(16, true)中是获取加密强随机字节的可移植方式,但如果您在某些Linux发行版或某个BSD OS下托管,则读/ dev / urandom也是可接受的选择。
还要质疑验证帐户的智慧,许多人正在使用无法追踪的一次性电子邮件(并且没有任何黑名单赢得最新版本)。