PHP的各种散列函数,如md5()
,sha1()
,hash()
,hash_pbkdf2()
和hash_hmac()
,允许您设置$ raw_output = false并获取原始二进制数据
我已经整理了一个使用mcrypt
和hash_pbkdf2
进行加密的课程。创建密钥时,以下两个代码都可以正常工作:
// Version 1
private function createKey($salt, $password) {
// Hash the key
$key = hash_pbkdf2('sha256', $password, $salt, 5000, 32, true);
return $key;
}
// Version 2
private function createKey($salt, $password) {
// Hash the key
$key = hash_pbkdf2('sha256', $password, $salt, 5000);
// Pack the key into a binary hex string
$key = pack('H*', $key);
return $key;
}
它们都产生相同的密钥大小,但它们都做同样的事情吗?考虑到我将其用于加密,是否比另一个更安全?
答案 0 :(得分:1)
如果您希望获得原始二进制结果,则应使用hash_pbkdf2
$raw_output = true
。它将生成您想要的字节而无需任何编码。
hash_pbkdf2
在内部使用bin2hex
然后将二进制字符串编码为十六进制。这是一项额外的操作。然后,当您使用pack
将十六进制解码为二进制字符串时,您还有另一个不必要的操作。
使用十六进制输出并将其解码回二进制文件不会提高您的安全性。如果有的话,可能会减少它,因为密码黑客可能不会使用这些不必要的步骤。
如果您担心bin2hex
是否实际反转pack("H*")
,则应使用hex2bin
,因为{{1}}可能会相互颠倒。