当前位置: 首页> 最新文章列表> 使用 PHP hash() 函数生成 HMAC(Hash-based Message Authentication Code)

使用 PHP hash() 函数生成 HMAC(Hash-based Message Authentication Code)

gitbox 2025-07-01

在网络安全和数据完整性验证中,HMAC(基于哈希的消息认证码)是一种常用且有效的技术。它结合了哈希函数和密钥,用于验证消息的完整性和身份认证。PHP 内置的 hash_hmac() 函数为我们生成 HMAC 提供了便捷的工具,但本文将介绍如何使用更基础的 hash() 函数,手动实现 HMAC。

什么是 HMAC?

HMAC 的核心思想是在消息前后拼接密钥,然后对拼接后的字符串做哈希运算。相比单纯的哈希值,HMAC 可以有效防止消息被篡改,且不容易被伪造。

HMAC 计算公式:

HMAC(key, message) = hash((key ⊕ opad) || hash((key ⊕ ipad) || message))

其中:

  • || 表示连接操作

  • 表示按位异或

  • opad 是外部填充,0x5c重复填充

  • ipad 是内部填充,0x36重复填充

PHP 中用 hash() 函数实现 HMAC

下面示范如何用 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 相关资源。