【问题标题】:Random salt + hashed pass or a random salt + crypt()'ed pass?随机盐 + 散列通行证还是随机盐 + crypt() 通行证?
【发布时间】:2011-08-14 22:16:38
【问题描述】:

我正在尝试为我的网站创建一个或多或少安全的登录系统,我没有太多时间来保护东西,所以我边走边学。想听听一些关于以下哪个更好以及为什么的观点。 (或者我在某个地方犯了错误?)

$staticsalt = '$%*#)$*)^A#$#543667ggfdf\#$%x';  
$random = md5(uniqid(mt_rand(), true));
$salt = hash('sha512',$random.$_POST['password'].microtime().$staticsalt);

或者(不需要在数据库中使用 $salt...)

$password = crypt($_POST['password'], '$2a$12$'.$salt);   

或者(我也需要数据库中的 $salt...)

$password = hash('sha512',$salt.$_POST['password']);

【问题讨论】:

  • 您是否打算存储要添加的microtime(),以便将其添加回您的密码检查中?
  • 不,我不需要,第一种情况生成的 $password 已经有盐的副本(即检查你只需要 $password = crypt($_POST['password'], $password); ),第二种情况 $salt 为每个用户存储在数据库中。
  • 从这似乎表明,如果您不保存生成的microtime() 值,您将永远无法检查生成的哈希值,包括它。您必须能够重建整个输入。
  • @Jared 他正在使用 microtime 作为随机发生器生成 salt。起初我也忽略了这一点......
  • 您可以使用mcrypt_create_iv 生成随机盐。它使用来自/dev/random/dev/urandom 的数据。

标签: php security hash salt bcrypt


【解决方案1】:
  1. SHA512 是一种相当快的算法,这通常是密码散列算法的不良属性。
  2. 使用可预测的值(例如 microtime)作为 salt 的随机种子可能让您面临一些更随机的值可以阻止的高级攻击。

我推荐 phpass,这是一个很好的密码哈希系统的现有实现。
http://www.openwall.com/phpass/

【讨论】:

  • 不使用crypt的时候,salt显然和$password一起保存在数据库中。
  • @wark 是的,对不起,我完全误解了你用盐做的事情。我删除了这些点。
  • @wark91 - 如果您保留它,还可以选择使用用户创建的日期/时间。那么你就不需要保留盐了。
  • @Jared 那么日期/时间基本上就是盐,而且熵非常低。
  • 我说的是用同样的方式生成盐,只是插入一个创建的时间戳而不是microtime()。我只是不知道我想将盐存储在数据库中的密码旁边。但是,老实说,我不知道哪个会更不安全。
【解决方案2】:

不要那样撒盐。

crypt 的 Blowfish 散列采用 22 个字符的 base64 编码字符串(使用字符 [./0-9A-Za-z])作为盐,相当于 128 位熵。

您用于创建盐的 SHA-512 哈希具有 512 位熵。但是您丢弃了超过 80% 的内容,因为 crypt 现在只使用 22 个小写十六进制字符。尽管你正在做所有花哨的随机生成,这让你只剩下大约 85 位的熵。

如果 85 位对你来说足够好,你不妨这样做:

$salt = str_replace("+", ".", base64_encode(md5(uniqid(mt_rand(), true), true)));

我真的不敢就如何生成使用完整 128 位的盐给你任何建议,因为我不是密码学专家。

【讨论】:

  • 我原来用的是 $password = hash('sha512',$salt.$_POST['password']);对我来说,当加上一些延迟+限制后续尝试和每天尝试等时,这听起来不错。至于我写的内容,我知道长度,但不管有兴趣了解两者的哪种方式会成为更好的选择。
【解决方案3】:

实际上没有必要宣传如此多的安全性。你必须知道你的系统是做什么用的。如果只是一些聊天,那么使用 md5 就可以了。如果它的银行系统,那么你必须有一些真正的身份验证系统,我的意思是一些带有盐或代码生成器的卡。

编辑:我不认为有一个好的安全策略。想一想,上面的答案很棒。

【讨论】:

  • 安全是双向的。问题是许多用户在整个互联网上使用相同的密码。如果您的聊天系统数据库落入坏人之手,并且密码可以被逆向工程,那么您的“md5 对我来说足够好”的心态已经损害了其他网络服务用户的安全性。是的,这是用户重复使用相同密码的问题,但这是事实,对来说是不好的宣传。
  • 应该区分过度设计/设计不良的系统和实施适当安全技术的系统。因此,可能不需要用于聊天设置的两因素登录(使用随机密钥加密狗或其他什么),但应谨慎存储密码并使用可靠和现代的技术。让新手负责登录系统可能会导致更多的 Rube Goldberg 机器,这没有用。但事实并非如此。
  • 阿格利。但是 md5 和一些 slat 还不错,直到您知道要保护您的所有网站。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-06
  • 2015-03-27
  • 1970-01-01
相关资源
最近更新 更多