【问题标题】:Is MD5 a good way to generate account verification codeMD5是生成账户验证码的好方法吗
【发布时间】:2011-04-10 01:20:01
【问题描述】:

当用户注册帐户时,他们会收到一封包含验证码的电子邮件,他们可以点击该验证码来验证他们的帐户。

这就是我生成验证码的方式。

md5(rand(0,1000)

使用下面的方法是不是一个糟糕的选择?它会生成一个介于 0-1000 之间的随机数。由于只有 1000 个选项,并且它们的 MD5 哈希值是已知的,因此攻击者应该只需要 1000 次试验就可以验证帐户,而不是真正属于他们

【问题讨论】:

  • “攻击者应该只需要 1000 次试验来验证帐户,而不是它真正属于他们”这就是为什么你也需要速率限制。
  • @NullUserException 你限制什么速率?攻击者将使用多个 IP 地址并尝试注册多个帐户...

标签: php security registration


【解决方案1】:

只需用攻击者不知道的东西播种即可:

md5(rand(0,1000).'helloworld234');

你的疯狂程度没有限制

md5(md5(time().'helloguys'.rand(0,9999)));

太多了,但你明白了。

【讨论】:

  • 熵越多越好。我至少会尽可能精确地输入注册人的用户 ID 或电子邮件,以及时间。
  • @John 好吧,我教过我建议一些由原子自旋产生的种子,但你知道成本等等。
  • rand() 太可怕了,永远不应该用于安全性,mt_rand() 更好。攻击者也知道 time(),他是创建帐户的人。
  • @Rook:mt_rand 也是按时间播种的。攻击者仍然很难将时间猜测到毫秒(并猜测盐“helloguys”)。
  • @Olhovsky 是的,但是 /dev/random 更好。
【解决方案2】:

这个帖子How to generate a verification code/number? 对这个问题有一些好的想法。散列、可逆散列、校验位......根据您的需要有很多选择。

【讨论】:

    【解决方案3】:

    rand(1,1000) 是 10 位熵。 MD5ing 它不添加任何内容。平均而言,攻击者需要 500 次尝试来验证帐户。再多的速率限制都无济于事,因为熟练的攻击者会租用或已经拥有用于验证帐户的僵尸网络。

    谨慎行事,并在您的验证链接中包含 128 位熵。在 PHP 中,openssl_random_pseudo_bytes(16, true) 是获取加密强随机字节的可移植方式,但如果您在某些 Linux 发行版或其中一个 BSD 操作系统下托管,读取 /dev/urandom 也是一个可接受的选择。

    同样质疑验证帐户是否明智,许多人正是为此使用无法追踪的一次性电子邮件(而且您的黑名单永远不会是最新的)。

    【讨论】:

      猜你喜欢
      • 2011-10-01
      • 2012-05-15
      • 2015-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      • 2022-10-01
      • 2017-04-20
      相关资源
      最近更新 更多