盐和密码

Fab*_*ook 22 php passwords salt

可能重复:
PHP密码的安全散列和盐

警告不要将MD5用于密码,请使用像bcrypt这样的替代方法


对于我的密码,我应该使用这样的盐(盐对每个用户都是唯一的,而不是直接用密码存储)...

$salt = sha1(md5("coders gonna code"));
$password = md5($salt.$password);
Run Code Online (Sandbox Code Playgroud)

或者如果我刚才使用它会没关系:

$password = md5($password);
Run Code Online (Sandbox Code Playgroud)

因为如果我使用盐,即使用户填写密码这样的密码也不重要,因为盐(在这种情况下)将是145ac26ff093c6e1317f7d5fb4c9fd11c77be975如此密码的条目将145ac26ff093c6e1317f7d5fb4c9fd11c77be975password根据http://howsecureismypassword.net/它需要3亿十亿年到破解....所以意见?或者我应该更糟糕的去吧

$password = md5($salt.$password.md5($salt));
Run Code Online (Sandbox Code Playgroud)

如果这个人已经走得足够远以获得盐哈希,那么任何东西都可以停下来再进一步吗?<更多声明此最后一个密码


对于那些说每个用户都应该这样做的人......我知道,这只是一个例子.

Jon*_*Jon 12

你完全错误地使用盐.盐应该是不可预测的; 你的盐与之完全相反(固定).由于固定哈希绝对没有任何好处,因此您似乎也指望攻击者不知道盐.这是通过默默无闻的安全定义,这是另一个不好的做法.

你应该做的是:

  1. 使用不可预测的合理长度的字符串作为盐.从池中随机生成的8个字符的字符串,如大写/小写字母和数字都可以.
  2. 为每个用户使用不同的salt,并在每次更改密码时更改它.
  3. 从MD5(被认为已损坏)移动到另一个更适合此应用程序的哈希函数.SHA-1更好,因为它不被认为是破碎的; bcrypt是最好的,因为它具有可配置的负载系数.


Stu*_*tLC 12

您应该更改盐,使其特定于每个用户,而不是系统范围的常量.这将使彩虹表攻击您的密码哈希更加不方便.

特洛伊·亨特(Troy Hunt)在本文中对腌制的演变进行了很好的阐述.

编辑

$salt每个密码记录都有一个独特的东西,它为它增加了很多熵.这通常是随机的字节序列,与用户帐户一起存储.

Hashing传统上是在salt+ 的连接上完成的password.

$passwordHash = hash($salt.$password);
Run Code Online (Sandbox Code Playgroud)

正如其他人所说,不要使用MD5进行散列.它被打破.

建议不要在散列之前将其他专有算法应用于密码或盐.相反,请看一个行业强度解决方案,如PBKDF2,除了腌制之外,还需要许多(通常> 10k)重复迭代,这将进一步减缓攻击者的速度.

如果采用OWASP指南,则应定期增加哈希数(以抵消摩尔定律).每个用户也应该保留哈希的数量,这意味着您需要存储哈希密码,盐和迭代次数的三倍.

  • 我认为这回答了最好的问题,因为对我而言,OP似乎并不清楚为什么他应该将盐与他的密码一起使用.如果你使用固定盐,那么通过暴力破解密码是否需要30亿年并不重要,因为攻击者只会查看你的数据库表,看到有3000个密码具有相同的哈希值,猜猜它是'密码'或'12345'或其他什么.您使用动态哈希,因此无法通过统计方法猜测散列和计划密码. (2认同)

Dar*_*ren 8

  1. 不要使用MD5哈希算法,使用更安全的东西,SHA256甚至是bcrypt.

  2. 肯定会对密码加密,如果有人确实进入了您的数据库,他们将无法撤消常见哈希的密码或使用彩虹攻击等技术.

http://michaelwright.me/php-password-storage

http://en.wikipedia.org/wiki/Bcrypt

  • 大家都觉得这是对的吗?我认同? (2认同)