我正在尝试使用功能crypt来在PHP中使用SHA512算法。
我的盐:
$salt = base64_encode(substr(str_shuffle("./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"), 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是减缓蛮力攻击的好数字。我想说明如何手动更改费用。
答案 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)
答案 2 :(得分:0)
所以我的问题是可以将此密码存储在数据库中
是的,只需将整个内容存储在数据库中,包括$6$
和rounds=5000000
。这样就可以在将来切换到另一种哈希类型,您只需在整个密码上使用crypt
进行检查即可。
答案 3 :(得分:0)
此外,我已经将密码存储在VARCHAR(255)中,我想知道是否可以将输出设置为两倍,即接近255个字符?
原则上越长越好,所以SHA512优于SHA256。但是,一个120字符的哈希已经很长了,没有任何优势可以让它更长。你可以增加盐的长度,但不要试图通过附加另一个哈希或类似的东西来延长哈希值。