【问题标题】:How best to use the encryption method for confirm code如何最好地使用确认码的加密方法
【发布时间】:2013-06-18 08:18:53
【问题描述】:

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

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

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

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

【问题讨论】:

  • 安全性取决于您使用什么作为输入来生成哈希,例如,如果您使用REMOTE_ADDR,那么任何人都可以猜到。

标签: php encryption cryptography md5 sha1


【解决方案1】:

这里有两个主要选择:

  1. 生成一些随机数据,将其存储在与该配置文件关联的数据库中,并仅将这些数据放在链接上;
  2. 根据用户 ID 生成某种安全哈希,然后在链接上同时传递用户 ID 和该哈希

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

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

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

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

请注意,此机制会在 url 中公开您正在验证的数据。如果数据是机密的(即,假设您想将包含用户名和密码的链接发送给用户,而在他单击链接之前根本不在数据库中保存任何内容),则必须使用Authenticated Encryption,即加密算法(保证没有人可以读取数据)和身份验证算法(保证没有人可以修改加密数据以产生有意义的东西——只有您的服务器能够生成这样的代码)的混合。

【讨论】:

  • 正如您的回答正确解释的那样,第二种方法涉及大量仔细计划,并且很容易出错(因为复杂性是安全性的敌人)。它提出了是否值得付出所有努力的问题,特别是考虑到迄今为止大多数有用户的网站已经拥有某种数据库。该数据库可用于第一种方法。
  • HMAC 不是单侧加密吗?如何将其解码回纯字符串?
  • HMAC 不是一种加密算法,它是一种 MAC 算法。您不会“将其解码回纯字符串”,这是 MAC 算法的本质。另外,我不确定您所说的 “单面加密” 是什么意思。
【解决方案2】:

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

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

【讨论】:

  • 我是否还需要使用 salt 和其他参数,或者您可以只使用 md5(uniqid(rand(), true)) ?
  • 使用散列函数根本不会增加数据的熵——它只是将它分散到特定的长度上。您应该只从安全的随机数生成器中读取字节。看到这个:stackoverflow.com/questions/1182584/…
  • 那么,我必须生成一个随机的字符序列吗?
  • @ntoskrnl 从可猜测性的角度来看,输出哈希的长度就是有效熵,只要输入长度大于哈希输出长度,这也是我推荐大盐的原因。
  • @frops 如果您关心实际随机性,请不要使用 rand();它是确定性和可攻击的。从安全的随机数生成器中读取; /dev/random 通常足够好。
猜你喜欢
  • 2012-09-25
  • 2013-04-13
  • 1970-01-01
  • 2012-05-15
  • 2015-09-30
  • 2011-08-12
  • 2023-03-10
  • 2020-06-03
  • 2010-11-20
相关资源
最近更新 更多