【问题标题】:Is the raw output returned by PHP's hashing functions the same as pack('H*')?PHP 的散列函数返回的原始输出是否与 pack('H*') 相同?
【发布时间】:2015-03-13 21:55:51
【问题描述】:

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;
}

它们都产生相同的密钥大小,但它们都在做同样的事情吗?考虑到我将其用于加密,是否比另一个更安全?

【问题讨论】:

  • 您是在谈论侧通道还是pack('H*', $key); 是否正常工作?
  • 我在加密后添加了一个 HMAC,所以我认为(?)它可以抵抗侧信道攻击。我真的很想知道上面的两个键是否以完全相同的方式产生。 IE。 $raw_output = true 是否与上述上下文中的 pack('H*') 相同?
  • 我查看了代码,它们都基于不同的功能。 hash_pbkdf2 使用 bin2hex 而pack 自己来反转bin2hex。
  • 谢谢。当加密/解密比另一个更好? PHP 站点 (php.net/manual/en/function.mcrypt-encrypt.php) 上的示例使用了 pack。不过,我没有发现这个例子有很好的记录。

标签: php encryption mcrypt


【解决方案1】:

如果你想得到原始的二进制结果,你应该使用hash_pbkdf2 和$raw_output = true。它将生成您想要的字节,无需任何编码。

hash_pbkdf2 内部使用bin2hex 将二进制字符串编码为十六进制。这是一项附加操作。然后,当您使用pack 将十六进制解码为二进制字符串时,您还有另一个不必要的操作。

使用十六进制输出并将其解码回二进制不会提高您的安全性。如果有的话,它可能会减少它,因为密码黑客可能不会使用这些不必要的步骤。

如果您担心bin2hex 是否实际上反转了pack("H*"),您应该使用hex2bin,因为它们可能是相互反转的companion functions。

【讨论】:

  • 很好,只是为了清楚起见:版本 1 只是将其保留为原始二进制,版本 2 转换为十六进制,然后再转换回二进制,即两个浪费的操作。对吗?
猜你喜欢
  • 1970-01-01
  • 2015-04-09
  • 2012-08-06
  • 2021-11-12
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
相关资源
最近更新 更多