2016-02-21 41 views
3

我开始在我的项目上开发用户注册。用户将通过电子邮件发送的链接确认他们的注册。安全使用md5散列作为注册字符串标记?

我以为我可以使用表单上插入的电子邮件,加上一个随机盐,并对这个连接的字符串进行散列,这样就可以使每个字符串标记都是唯一的。链接将是这样的:

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

我认为这是很好,很容易建立,但我不知道它是否足够安全。

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

+1

查看https://github.com/cakephp/cakephp/pull/8297 - 这也将很快在2.x.如果您使用Tools插件,那么您可以在那里使用[Tokens](http://www.dereuromark.de/2010/06/25/tools-plugin-part1-codekey/),因为它们已经内置了它。 – mark

回答

6

这真的取决于你如何生成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

+0

这是一个非常好的主意,但是这在计算上并不昂贵吗?每次创建令牌时,我都必须在数据库中验证该令牌是否尚未创建。 –

+0

将用户插入数据库时​​生成令牌的成本要比MD5高一点,但除非您谈论严重的流量/使用情况,否则您不会真正注意到这种差异。至于在用户验证他们的电子邮件时检查密钥,这不会花费比检查MD5更多的资源。你只是检查,看看他们是否匹配。 – BugHunterUK

+0

我明白了。我认为这是我寻找的解决方案,因为它与其他答案一致。非常感谢。 –

2

你应该想想一个潜在的攻击者可以做,如果他是能够产生不属于他,然后决定是否MD5哈希令牌够好了。

如果我得到它正确,你只是想验证用户的电子邮件,只有当用户真正拥有电子邮件地址创建一个帐户。如果攻击者使用伪造的电子邮件创建1000个帐户,那么对于您或该地址的所有者是否会造成不良影响?

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

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

+0

这就是盐的想法。盐将是一个随机字符串,我会连接用户的电子邮件和散列它。 –

+0

是的,但如果攻击者知道你的盐,他可以为任何电子邮件生成有效令牌。如果您为每个注册生成一个完整的随机标记,这是不可能的。 – siegi

+0

我明白了。你是对的。我不会使用用户的数据来创建令牌。 –

2

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

+0

如果初始值是完全随机的,则对它进行散列没有意义;它不会增加任何安全性。当然,这一切都取决于随机函数,但这是一个完全不同的问题。 – JvO

+0

在电子邮件中使用unhahed版本。哈希存储的版本可以防止任何数据泄漏,从而使攻击者可以使用这些值。 – SilverlightFox