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


How best to use the encryption method for confirm code

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

我用email通知来确认一些动作;

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

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

这里有两个主要选项:

  1. 生成一些随机数据,将其存储在与该配置文件相关的数据库中,并仅将此数据放在链接上;
  2. 生成某种基于用户id的安全哈希,然后将用户id和该哈希传递到链接

第一个选项是安全的(假设您正在使用一个真正的随机数生成器或一个非常非常好的伪随机数生成器),但是您必须将数据存储在数据库中。

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

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

一种安全的方法是使用HMAC,即基于哈希的消息认证码。见:http://php.net/manual/en/function.hash-hmac.php。

注意,该机制公开了您在url中验证的数据。如果数据是秘密的(例如,假设你想发送包含用户名和密码的链接给用户,而在他点击链接之前没有在数据库中保存任何东西),你必须使用身份验证加密。它是加密算法(保证没有人可以读取数据)和身份验证算法(保证没有人可以篡改加密数据以产生有意义的东西——只有您的服务器能够生成这样的代码)的混合。

如果你只是生成一个"随机"确认码,你不需要担心你使用的是哪个哈希函数;您并不真正关心散列信息的安全性,只关心确认码的不可猜测性。这意味着熵的比特数越多,你的确认码就越安全(也越独特)。MD5的熵值为128位,SHA1的熵值为160位,SHA256的熵值为256位。用大的盐(>= 1024比特就可以了),可以说是好的。

如果你想让它真正安全,那么从/dev/random/dev/urandom读取n字节(其中n是一个很大的数字,24+)(前者仅在你运行像egg这样的东西时,否则你可能容易受到DOS攻击)并对它们进行十六进制或base64编码,将它们存储在你的用户记录中,并将其设置为你的确认码。这完全消除了猜测性,而且不像普通的辣椒那样只有一个攻击点。