RFC 2104 的第 2 节定义了 HMAC 中使用的密钥应该用零字节填充,直到底层哈希算法的块长度。这不是一个潜在的安全漏洞,因为任何以零字节结尾的密钥都会产生与没有最后一个字节的密钥相同的结果吗?
以下 PHP 代码说明了该示例:
$key = "key";
$message = "message";
var_dump(hash_hmac("SHA256", $message, $key));
var_dump(hash_hmac("SHA256", $message, $key.chr(0x00)));
并产生以下输出:
string(64) "6e9ef29b75fffc5b7abae527d58fdadb2fe42e7219011976917343065f58ed4a"
string(64) "6e9ef29b75fffc5b7abae527d58fdadb2fe42e7219011976917343065f58ed4a"
我知道同一 RFC 的第 3 节推荐了最小长度的密钥,这将消除这个问题,就像某种散列密钥生成步骤一样。但是,在我看来,这可能是一个潜在的问题,还是我过于偏执?