所有
这是一个相当具体的问题,我怀疑没有完美的答案。
目标:对于网站,我想在用户注册期间生成 增量< 字符串 增量< / strong> (所以没有GUID )。此字符串将成为数据库中用户表的主键,并且还将用于在散列之前对密码进行加密。用户看不到userID - 它仅用于内部目的。
问题:我应该在哪里以及如何生成字符串?我正在考虑的选项是:
1 - 使用uniqid(“”)在PHP代码中生成 我可以设置一个循环,只要插入失败就重新尝试插入新记录(即,当用户ID已经存在时,如果两个用户试图准确地注册相同的微秒......)。 优点:
骗局:
2 - 使用自动增量标识或类似字段在MySQL中生成 优点:
缺点:
我没有足够的知识或经验来衡量这些利弊,我相信我错过了一些。如果您有任何帮助,我将不胜感激......
干杯,
JDelage
答案 0 :(得分:1)
可能不是你想要的答案,但鉴于盐应该由随机位组成,我不确定使用递增整数或字符串是最好的事情。为什么不直接使用用户表的(自动递增)PRIMARY KEY作为用户ID并使用单独生成的盐进行散列?我认为这也将解决您在问题中注意到的许多权衡因素。
编辑:考虑到这一点,将盐作为用户ID完全失败了,无论如何,如果您的数据库被泄露,那么任何黑客都可以访问您的盐。我认为更好的计划是使用单个salt,可能在代码中进行硬编码(因此不在db中)来散列所有用户密码。
答案 1 :(得分:1)
您希望MySQL将其作为自动增量进行管理。
在PHP中执行此操作意味着随着用户数据库的增长,您需要运行的查询数量才能确定下一个可用数字的增长情况。如果您有50,000个用户,那就要运行很多查询。并且存在碰撞问题。
关于使用MySQL自动增量的缺点
mysql_insert_id ()
通常,您最好为每个用户创建一个独特的随机盐。这将解决所有上述问题,并且更安全。
答案 2 :(得分:0)
请参阅Ahmet alp Balkan对我的其他问题的回复:PHP - Is uniqid("") a good practical solution to generate a unique and sequential key server side?。答案表明uniqid(“”)是正确的方法,因为在给定的微秒期间碰撞的风险很小甚至不存在。