使用 md5 哈希作为注册字符串令牌是否安全?

Is secure to use a md5 hash as registering string token?

我开始在我的项目上开发用户注册。用户将通过电子邮件发送 link 来确认他们的注册。

我想我可以使用表单中插入的电子邮件,加上一个随机盐,然后散列这个连接的字符串,这样每个字符串标记都是唯一的。 link 会是这样的:

http://www.example.com/register/7ddf32e17a6ac5ce04a8ecbf782ca509

我认为它很好并且易于构建,但我不确定它是否足够安全。

我正在使用 CakePHP 2.7 和 SQL Server 2014 开发这个项目。

这实际上取决于您如何生成 MD5。只要确保您的数据是随机的。我不使用 MD5 来生成这些类型的哈希值,而是会做类似的事情:

$email_token = openssl_random_pseudo_bytes(16);
$token = bin2hex($email_token);

就个人而言,如果使用 PHP7,我会选择使用 random_bytes 这样的东西。

$email_token = bin2hex(random_bytes($length));

PHP5 有可用的 polyfill:https://github.com/paragonie/random_compat

您应该考虑如果潜在的攻击者能够生成不属于他的令牌,然后确定 MD5 哈希值是否足够好,他会做什么。

如果我没记错的话,您只想验证用户的电子邮件地址,并且只有在用户确实拥有该电子邮件地址的情况下才创建一个帐户。如果攻击者使用伪造的电子邮件创建 1000 个帐户,这对您或地址所有者是否不利?

一如既往,安全取决于具体情况,IMO。

安全起见,不要让您的令牌依赖于用户数据。生成一个完全随机的令牌并将其保存在数据库中的待定注册旁边。

使用您在注册时生成的完全随机用户值,运行通过'sha1'或'sha2' ,将其存储在数据库中,并在电子邮件中使用它。然后你只需检查该值是否在数据库中。如果您还想将哈希与另一个数据点(例如他们的电子邮件)相关联,那就更好了。