在网络安全和数据完整性验证中,HMAC(基于哈希的消息认证码)是一种常用且有效的技术。它结合了哈希函数和密钥,用于验证消息的完整性和身份认证。PHP 内置的 hash_hmac() 函数为我们生成 HMAC 提供了便捷的工具,但本文将介绍如何使用更基础的 hash() 函数,手动实现 HMAC。
HMAC 的核心思想是在消息前后拼接密钥,然后对拼接后的字符串做哈希运算。相比单纯的哈希值,HMAC 可以有效防止消息被篡改,且不容易被伪造。
HMAC 计算公式:
HMAC(key, message) = hash((key ⊕ opad) || hash((key ⊕ ipad) || message))
其中:
|| 表示连接操作
⊕ 表示按位异或
opad 是外部填充,0x5c重复填充
ipad 是内部填充,0x36重复填充
下面示范如何用 PHP 的 hash() 函数,手动实现 HMAC:
<?php
function hmac_hash($algo, $key, $data) {
$blocksize = 64; // 大部分hash函数块大小是64字节
if (strlen($key) > $blocksize) {
$key = hash($algo, $key, true); // 如果密钥过长,先hash成固定长度的二进制串
}
$key = str_pad($key, $blocksize, chr(0x00)); // 将密钥填充到块大小
$ipad = str_repeat(chr(0x36), $blocksize);
$opad = str_repeat(chr(0x5c), $blocksize);
$inner = $key ^ $ipad;
$outer = $key ^ $opad;
$inner_hash = hash($algo, $inner . $data, true); // 内层哈希,输出二进制格式
$hmac = hash($algo, $outer . $inner_hash);
return $hmac;
}
// 测试
$key = "secretkey";
$message = "The quick brown fox jumps over the lazy dog";
echo "HMAC-SHA256: " . hmac_hash('sha256', $key, $message);
?>
以上代码用 SHA-256 算法对消息和密钥进行了 HMAC 计算,返回的是十六进制字符串。
推荐使用 PHP 自带的 hash_hmac() 函数,效率更高且安全。
密钥长度一般推荐与哈希块大小一致。
使用二进制输出(第三个参数设为 true)有利于拼接操作。
HMAC 主要用于消息认证,密钥需要安全管理。
尽管 PHP 已有便捷的 hash_hmac() 函数,理解并掌握用基础 hash() 函数实现 HMAC 的原理,有助于更好地理解安全哈希机制,进而提升安全编程能力。
如果想了解更多信息,可以访问 https://gitbox.net 相关资源。