我正在创建一个脚本,其中包含名称和电子邮件地址列表,并发送一封电子邮件邀请他们注册我们部门的安全网站。名称和电子邮件列表可在同一站点的公共页面上找到。我需要一种方法来为他们提供一个唯一的令牌,当他们按照电子邮件中的链接注册帐户时,会识别他们。用户只会使用一次令牌,以创建帐户并设置其初始密码。
生成令牌的最佳方法是什么?存储在数据库中的随机字符串?从用户信息和一些盐生成的哈希?别的什么?我知道这种方法的安全性取决于个人电子邮件邀请的隐私,这是我理解的一点点。
答案 0 :(得分:10)
有许多不同的哈希算法。您可以查看此链接以查看是否可以更好地为您工作,因为您不需要安全哈希。您还可以查看SSL lib如何生成8个字符的md4哈希值。
答案 1 :(得分:3)
为什么它需要特别是哈希?只需将新用户的用户名作为链接的一部分,然后随机生成任意长度的身份验证令牌,并将其存储在数据库中,并链接到用户名,直到他们进行身份验证。
因此,他们在电子邮件中收到的链接如下:
http://domain.com/confirm.php?user=Chad&t=AB14CD05
如果发生任何碰撞真的没关系,无论如何这都是一个相当低风险的事件。什么可能出错,其他人可以...确认他们的电子邮件地址?你在乎什么?也许如果你更详细地解释整个过程,我会更好地理解你的要求。
答案 2 :(得分:2)
为什么不分配一个随机的64位数字来发送用户的id。取64位数字,将其分成5位块,并使用每个5位块索引成32个字符的字母:23456789ABCDEFGHJKLMNPQRSTUVWXYZ(方便地省略01IO)。使用64位数字和5位/代码(最后一个除外),您将获得一个13个字符的slug用于识别用户。你可以用2个随机字符填充它,如果你愿意,可以给3组5个字符。
制作登录网址的id和slug部分。检查与数据库中的id一起存储的slug的值,以确保它们是相同的。我认为在大多数情况下,这将是一个足够大的值,使得它极难猜测 - 毕竟数字是随机的 - 哪个slug与哪个用户id相关。使用加密强大的随机数生成器,我认为你甚至不可能为任何用户获得重复的数字。
看起来像是:
http://example.com/activate?userid=bgates&validate=GY45M-RHQBN-32GYM
使用已知值的散列实际上可能会让某人猜测正确的代码比使用随机数更容易。使用哈希值只需要猜测你正在使用哪些比特并通过各种哈希算法运行它们。如果某人能够将这些组合在一起,比如给出一些示例和足够的时间来尝试各种组合,那么他们所要做的就是破解某人的代码就是确定给定人员的(可能)众所周知的属性并使用它们来模仿他们并创建一个帐户。随着每个人分配一个强大的随机数,他们只会遭受暴力攻击。
答案 3 :(得分:1)
查看gperf。
GNU gperf是一个完美的哈希函数 发电机。对于给定的列表 字符串,它产生一个哈希函数 和哈希表,以C或C ++的形式 代码,用于查找取决于值的值 在输入字符串上。哈希函数 是完美的,这意味着哈希 表没有冲突和哈希 表查找需要一个字符串 仅比较。
还有CMPH - C Minimal Perfect Hashing Library
有几个相关的SO问题: