在網絡安全和數據完整性驗證中,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相關資源。