我应该如何在MySQL中存储我的sha512加盐哈希密码?

15

大家好,

我正在使用以下的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


1
这可能会有所帮助.. https://dev59.com/ZEzSa4cB1Zd3GeqPkCle. - tjm
1
为什么你不使用第三个参数来指定字符串重新哈希的次数? - zzzzBov
5
不要将SHA512用于密码! - Scott Arciszewski
@ScottArciszewski - 这是一个老问题,但依然存在:为什么不用SHA512?如果不用的话,那用什么? - JDelage
如何安全地存储用户密码。不要使用像SHA512这样的快速哈希函数,而是应该使用“密码哈希”来代替。 - Scott Arciszewski
显示剩余4条评论
3个回答

27

SHA512始终返回512位哈希值,两个参数的hash()方法将其作为十六进制数字返回,因此这是512位/每字节8位*每字节2个十六进制数字=128个十六进制数字

所以你需要一个 CHAR(128)


1

我一直使用一个比需要长度更长的varchar字段。如果将来你想改变你的算法怎么办?你必须修改表格,这很麻烦。

SHA512会产生一个128个字符的字符串,所以至少给字段这么多长度。

此外,我必须指出你正在浪费很多处理时间。通过反复迭代相同的盐和哈希,你并没有增加太多安全性。最终,你仍然需要一个盐和密码,算法的其他方面保持不变。


3
在这种情况下,尺寸是众所周知的,就像GUID一样。它不是某个人的名字,因此没有“叫什么名字我有父母想开玩笑的先生”。如果需求后来发生变化,则更改模式...稍后再说。 - user166390
此外,我必须指出您正在进行大量的浪费处理。通过一遍又一遍地迭代相同的盐和哈希值,您并没有增加太多安全性。 - JDelage
尽管如此,我不知道是否可以使用SHA-2/SHA-512而不是SHA-1...但我不是密码学专家。 - user166390
@JDelage 他们正在使用可变数量的运行,而你的则保持不变。可以将哈希排序想象成取导数:所有常量数据都不再重要,因为你正在表示一种变化率。在数据安全方面,这同样适用,因为即使你迭代50次,这也不会影响到其他需要进行哈希的项目。 - SamT
很有趣 - 我完全错过了那个。 - JDelage

1

如果有人知道你的盐值,他们可能已经拥有了你的源代码,从而指导他们重复50次。在这种情况下,考虑到使用固定计数进行递归重新哈希的微不足道的安全性好处,我建议使用MySQL 5.5.5+中的SHA2()作为更简洁的替代方案:

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

这将是您准备好进行INSERT/UPDATEVARCHAR(128)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接