我正在研究一个大项目的注册系统。
成功注册后,服务器会生成一些激活密钥,将其添加到用户的行并通过电子邮件发送给用户。为此目的使用一些密码生成器类。
问题是(我知道这听起来很抽象,但我只是想知道),如何避免重复传递生成?我的意思是,在将来的生成器中是否有可能创建db表中已存在的激活密钥?密钥生成后我应该检查重复吗?
答案 0 :(得分:3)
我建议使用PEAR中的Text_Password package。不要试图重新发明这个轮子。
不要强制密码是严格唯一的。实际上 安全。考虑一下,如果我尝试将密码设置为 xyzzy 并且该网站告诉我我不能,那就意味着现在我知道某个帐户正在使用 xyzzy 作为密码。我只需要在所有帐户上尝试使用该密码,直到找到哪一个。
不要将哈希摘要用作生成的密码。您的用户不希望键入32个字符(或更长)的十六进制字符串。我曾在2001年使用PKI和MD5哈希编写安全软件激活密钥包的经验。但没有人会使用它,因为密钥太长了。
请使用哈希摘要和盐来存储密码。我们无畏的领导者阅读本文:You're Probably Storing Passwords Incorrectly。
另请参阅我对其他一些与密码相关的问题的答案:
答案 1 :(得分:2)
试用uniqid()
。
答案 2 :(得分:1)
使用具有唯一输入的SHA或Whirlpool等哈希算法(如用户的唯一用户名)将导致预期冲突率为0的哈希值。
我不会为此推出自己的算法。如上所述,uniqid()
或md5()
是有保障的解决方案。
答案 3 :(得分:0)
你可以使用时间,但它不会“随机”,你必须添加一些随机性......
$key = md5(time());
答案 4 :(得分:0)
使用GUID作为注册码,因为它始终是唯一的并由系统
生成