如何最好地使用加密方法在电子邮件通知上确认代码:md5、sha1 或 sha256
我通过电子邮件发送电子邮件通知以确认某些操作;
我用盐和一些参数生成了确认代码。
如何最好地使用确认码的加密方式?
如何最好地使用加密方法在电子邮件通知上确认代码:md5、sha1 或 sha256
我通过电子邮件发送电子邮件通知以确认某些操作;
我用盐和一些参数生成了确认代码。
如何最好地使用确认码的加密方式?
您在这里有两个主要选择:
第一个选项是安全的(假设您使用的是实随机数生成器或非常非常好的伪随机数生成器),但您必须将数据存储在数据库中。
我通常更喜欢第二种选择,因为不需要在数据库上存储任何东西,也不需要查询数据库来检查链接是否有效。
选择一个只有您的服务器知道的密钥,然后准确定义您要在 URL 中验证的参数(例如,只有用户 ID 可能就足够了;但是如果您希望链接过期,您可以添加时间戳到url 并使用您的哈希验证用户 ID 和时间戳)。将您的密钥与参数混合,基于此生成一个散列,并创建一个指定参数和散列的链接。当用户单击链接时,您从 url 中获取参数,再次将它们与密钥组合,对结果进行散列并与 url 附带的散列进行比较。
一种安全的方法是使用HMAC,它是基于哈希的消息验证码。请参阅: http: //php.net/manual/en/function.hash-hmac.php。
请注意,此机制会公开您在 url 中验证的数据。如果数据是秘密的(即,假设您想将包含用户名和密码的链接发送给用户,而在他单击链接之前根本没有在数据库中保存任何内容),您必须使用Authenticated Encryption,这是一个混合加密算法(保证没有人可以读取数据)和身份验证算法(保证没有人可以修改加密数据以产生有意义的东西——只有您的服务器能够生成这样的代码)。
如果您只是生成“随机”确认码,则无需担心您使用的是哪个哈希函数;您并不真正关心散列信息的安全性,只关心确认码的不可猜测性。这意味着熵的位数越多,您的确认码就越安全(和唯一)。MD5 产生 128 位熵,SHA1 产生 160 位,SHA256 产生 256 位。使用大盐(>= 1024 位应该没问题)并称之为好。
如果您希望它真正安全,则从or中读取n个字节(其中n是一个很大的数字,24+)(前者仅在您运行 egd 之类的东西时,否则您可能容易受到 DOS 攻击)和对它们进行 hex 或 base64 编码,将它们存储在您的用户记录中,并将其设置为您的确认码。这完全消除了猜测性,并且没有像普通辣椒那样的单点攻击。/dev/random
/dev/urandom