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


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

我开始在我的项目中开发用户的注册。用户将通过电子邮件发送的链接确认其注册。

我想我可以使用表单上插入的电子邮件,加上随机盐,并哈希这个连接的字符串,这样每个字符串令牌都是唯一的。链接将是这样的:

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,有一个可用的填充代码:https://github.com/paragonie/random_compat

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

如果我正确理解,您只想验证用户的电子邮件,并且仅在用户真正拥有电子邮件地址时才创建一个帐户。如果攻击者使用伪造的电子邮件创建 1000 个帐户,对您或地址所有者会不利吗?

与往常一样,安全取决于情况,海事组织。

如果你想安全起见,不要让你的代币依赖于用户数据。生成一个完全随机的令牌,并将其保存在数据库中待处理的注册旁边。

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