如何最好地使用加密方法来确认代码

时间:2013-06-21 08:52:42

标签: php encryption cryptography md5 sha1

如何最好地使用加密方法确认电子邮件通知代码:md5,sha1或sha256

我通过电子邮件发送电子邮件通知以确认某些操作;

我使用salt和一些参数生成了确认代码。

如何最好地使用加密方法来确认代码?

2 个答案:

答案 0 :(得分:2)

这里有两个主要选项:

  1. 生成一些随机数据,将其存储在与该配置文件关联的数据库中,并仅将此数据放在链接上;
  2. 根据用户ID生成某种安全哈希,然后在链接上传递用户ID和哈希值
  3. 第一个选项是安全的(假设您使用的是真正的随机数生成器或非常非常好的伪随机数生成器),但您必须将数据存储在数据库中。

    我通常更喜欢第二个选项,因为不需要在数据库上存储任何内容,也不需要查询数据库来检查链接是否有效。

    选择只有您的服务器才知道的密钥,然后准确定义您要在URL中验证的参数(例如,只有用户ID可能就足够了;但是如果您希望链接过期,您可以添加url的时间戳,并使用您的哈希验证用户ID和时间戳。将您的密钥与参数混合,基于此生成哈希,并创建指定参数和哈希的链接。当用户单击链接时,您从URL中获取参数,再次使用密钥将它们组合,对结果进行散列并与URL附带的散列进行比较。

    安全的方法是使用 HMAC ,这是基于哈希的邮件验证代码。请参阅:http://php.net/manual/en/function.hash-hmac.php

    请注意,此机制会公开您在网址中验证的数据。如果数据是保密的(即,假设您要将链接发送给包含用户名和密码的用户,而不是在点击链接之前在数据库中保存任何内容),则必须使用Authenticated Encryption,这是一种加密算法(保证没有人可以读取数据)和一种认证算法的混合(保证没有人能够利用加密数据来产生有意义的东西 - 只有你的服务器才能生成这样的代码)。

答案 1 :(得分:0)

如果您只是生成“随机”确认代码,则无需担心您正在使用的哈希函数;你并不真正关心散列信息的安全性,只是在确认代码的不可猜测性方面。这意味着熵越多,您的确认代码就越安全(和唯一)。 MD5产生128位熵,160位的SHA1和256位的SHA256。使用大盐(> = 1024位应该没问题)并称之为好。

如果您希望它真的安全,那么从/dev/random或{{读取 n 字节(其中 n 是一些大数,24 +) 1}}(前者只有当你运行像egd这样的东西,否则你可能会受到DOS攻击)并对它们进行十六进制或base64编码,将它们存储在你的用户记录中,然后将其设置为你的确认码。这完全消除了可猜测性,并且没有像普通胡椒那样的单点攻击。