我应该如何储存我的sha512盐渍和在MySQL中散列密码?

时间:2011-06-02 21:34:52

标签: php mysql security

所有

我使用以下PHP函数来加盐和放大Web应用程序的哈希用户密码:

function stringHashing($password,$salt){
 $hashedString=$password.$salt;
 for ($i=0; $i<50; $i++){
  $hashedString=hash('sha512',$password.$hashedString.$salt);
  }
 return $hashedString;
}  

将结果字符串存储在MySQL中的最佳方法是什么?我想这是一个固定的CHAR字段?我该如何计算合适的长度?

谢谢,

JDelage

3 个答案:

答案 0 :(得分:26)

好吧,SHA512将始终返回512位散列,双参数hash()方法将其返回为十六进制数字,因此每字节512位/ 8位*每个字节2位十六进制数= 128位十六进制数< / p>

CHAR(128)应该是您需要的

答案 1 :(得分:1)

我总是使用一个超过需要长度的varchar字段。如果您希望改变算法,那该怎么办?你必须改变桌子,这很烦人。

SHA512将生成一个128字符串,因此至少给该字段。

另外,我必须指出你正在做很多浪费的处理。你不是通过反复遍历相同的盐和哈希来添加过多的安全性。最终,你仍然需要一个盐和密码,关于算法的其他一切都保持不变。

答案 2 :(得分:1)

如果有人知道你的盐,他们可能有你的源代码,引导他们重复50次。有鉴于此,考虑到使用固定计数的递归重新散列的微不足道的安全性好处,我想我建议使用MySQL 5.5.5+中的SHA2()作为更简洁的替代方案:

mysql_query("SELECT SHA2(CONCAT('$password','$salt'), 512) AS `hash`;");

您的VARCHAR(128)准备好INSERT / UPDATE