當前位置: 首頁> 最新文章列表> 使用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相關資源。