2015-01-15 29 views
3

PHP的各種散列函數,如md5(),sha1(), hash(), hash_pbkdf2()hash_hmac()允許您設置$ raw_output = false並獲取原始二進制數據。PHP的散列函數返回的原始輸出是否與pack('H *')相同?

我已經放在一起使用加密和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

你說的是側通道還是'包(「H *」,$鍵);'正常工作? –

+0

我在加密後添加了一個HMAC,所以我認爲(?)它可以抵抗邊信道攻擊。我真的很想知道上面的兩個鍵是否以完全相同的方式生成。即$ raw_output = true與上述上下文中的pack('H *')相同? – texelate

+1

我查看了代碼,它們都基於不同的功能。 'hash_pbkdf2'使用'bin2hex',而'pack'是它自己的事情來反轉'bin2hex'。 –

回答

1

如果你想擁有原始的二進制結果,你應該去與hash_pbkdf2$raw_output = true。它會生成你想要的字節而不需要任何編碼。

hash_pbkdf2內部使用bin2hex到接着編碼所述二進制串爲十六進制。這是一項額外的操作。然後,當您使用pack將十六進制解碼爲二進制字符串時,您還有另一個不必要的操作。

使用十六進制輸出和解碼回二進制文件不提高安全性。如果有的話,它可能會減少它,因爲密碼黑客可能不會使用這些不必要的步驟。

如果您擔心bin2hex是否真正反轉pack("H*"),你應該使用hex2bin那些是companion functions這很可能逆轉對方。

+0

偉大的只是爲了清楚起見:版本1只是將它保留爲原始二進制文件,並將版本2轉換爲十六進制,然後再轉換爲二進制文件,即兩個浪費的操作。正確? – texelate

+1

是的....填充物 –

+0

謝謝你清理那個。 – texelate

相關問題