正确使用SHA512加密的方法

时间:2015-01-27 13:01:16

标签: php security passwords sha512

我正在尝试使用功能crypt来在PHP中使用SHA512算法。

我的盐:

$salt = base64_encode(substr(str_shuffle("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012345‌​6789"), 0, 12));

我得到这样的东西:

Q4CALzJNenFaZnNK

我不知道为什么在指定12时我的长度是16。

要哈希密码,我使用它:

$hashed = crypt('myPassword', '$6$rounds=5000000$'.$salt);

输出是这样的:

$6$rounds=5000000$Q4CALzJNenFaZnNK$9QTP6C.BZ9Z.U85UIEAVX1dEIdShHFoYGgTMvgv9Cx/XZY1mK/n2rY4FuHSoigjgIXfqGZftZSxrrF.cDBzt8/

长度:121

所以我的问题是可以将这个密码存储在数据库中,还是应该像我在几个例子中看到的那样剥离$ sign?

此外,我已经将密码存储在VARCHAR(255)中,我想知道是否可以将输出设置为两倍,即接近255个字符?

这种方式比Blowfish更安全吗?


我的发现:

哈希密码的长度并不像我原先想象的那么重要(60个字符足以存储而不是128或256)。

最好使用password_hash函数,忘记生成自己的盐 - php.net知道他们做了什么。

所以我最终以这种方式散列密码:

$hash = password_hash($password, PASSWORD_BCRYPT, array("cost"=>15));

PASSWORD_BCRYPT是Blowfish算法,默认成本为10(运行算法的次数等)。 10是减缓蛮力攻击的好数字。我想说明如何手动更改费用。

4 个答案:

答案 0 :(得分:1)

你有这个:

$salt = base64_encode(substr(str_shuffle("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"), 0, 12));

您只需从中移除base64_encode即可获得12个字符的盐。另请注意,在您的版本中,您在5和6之间有一些非ascii,不可打印的字符。这可能会导致二进制输出。试试这个:

$salt = substr(str_shuffle("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"), 0, 12);

答案 1 :(得分:1)

  1. 由于base64_encode会将你的12个字符串放大到16个字符的字符串(它的编码就是这样),你会得到更大的回盐。
  2. 您可以将字符串完全存储在一个字段中,但如果您想要轻松访问盐,则可以将盐存储在另一个字段中。 (如果用户密码输入正确,则需要再次检查salt - salt只确保相同密码的哈希值不会给出相同的哈希值)
  3. SHA512比Blowfish更安全吗?正如erickson on stackoverflow所说,它们都足以达到目的

答案 2 :(得分:0)

  

所以我的问题是可以将此密码存储在数据库中

是的,只需将整个内容存储在数据库中,包括$6$rounds=5000000。这样就可以在将来切换到另一种哈希类型,您只需在整个密码上使用crypt进行检查即可。

答案 3 :(得分:0)

  

此外,我已经将密码存储在VARCHAR(255)中,我想知道是否可以将输出设置为两倍,即接近255个字符?

原则上越长越好,所以SHA512优于SHA256。但是,一个120字符的哈希已经很长了,没有任何优势可以让它更长。你可以增加盐的长度,但不要试图通过附加另一个哈希或类似的东西来延长哈希值。