所有
我使用以下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
答案 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
。