HMAC_SHA1(Hashed Message Authentication Code, Secure Hash Algorithm)是一種安全的基於加密hash函數和共享密鑰的消息認證協議。php
它能夠有效地防止數據在傳輸過程當中被截獲和篡改,維護了數據的完整性、 可靠性和安全性。HMAC_SHA1消息認證機制的成功在於一個加密的hash函數、算法
一個加密的隨機密鑰和一個安全的密鑰交換機制。
HMAC_SHA1 其實仍是一種散列算法,只不過是用密鑰來求取摘要值的散列算法。
HMAC_SHA1算法在身份驗證和數據完整性方面能夠獲得很好的應用,在目前網絡安全也獲得較好的實現。數組
知識點:安全
https://www.php.net/manual/en/function.hash-hmac-algos.php網絡
(PHP 7> = 7.2.0)版本小於7.2報錯,注意看手冊函數
hash_hmac_algos - 返回適用於hash_hmac的已註冊散列算法列表加密
返回一個數字索引數組,其中包含適用於hash_hmac()的支持散列算法列表。spa
<?php
print_r(hash_hmac_algos());.net
上面的例子將輸出相似於:code
排列 ( [0] => md2 [1] => md4 [2] => md5 [3] => sha1 [4] => sha224 [5] => sha256 [6] => sha384 [7] => sha512 / 224 [8] => sha512 / 256 [9] => sha512 [10] => sha3-224 [11] => sha3-256 [12] => sha3-384 [13] => sha3-512 [14] => ripemd128 [15] => ripemd160 [16] => ripemd256 [17] => ripemd320 [18] =>漩渦 [19] => tiger128,3 [20] => tiger160,3 [21] => tiger192,3 [22] => tiger128,4 [23] => tiger160,4 [24] => tiger192,4 [25] => snefru [26] => snefru256 [27] => gost [28] => gost-crypto [29] => haval128,3 [30] => haval160,3 [31] => haval192,3 [32] => haval224,3 [33] => haval256,3 [34] => haval128,4 [35] => haval160,4 [36] => haval192,4 [37] => haval224,4 [38] => haval256,4 [39] => haval128,5 [40] => haval160,5 [41] => haval192,5 [42] => haval224,5 [43] => haval256,5 )
注意:
在PHP 7.2.0以前,獲取支持的哈希算法列表的惟一方法是調用hash_algos(),它還返回不適合hash_hmac()的哈希算法。
(PHP 5> = 5.1.2,PHP 7,PECL哈希> = 1.1)
hash_hmac ( string $algo
, string $data
, string $key
[, bool $raw_output
=FALSE
]): string
algo
所選散列算法的名稱(即「md5」,「sha256」,「haval160,4」等)。請參閱hash_hmac_algos()以獲取支持的算法列表。
data
要散列的消息。
key
用於生成消息摘要的HMAC變體的共享密鑰。
raw_output
設置爲時TRUE
,輸出原始二進制數據。 FALSE
輸出小寫的十六進制。
返回包含計算的消息摘要的字符串做爲小寫的十六進制,除非raw_output
設置爲true,在這種狀況下返回消息摘要的原始二進制表示形式。未知FALSE
時返回algo
或是非加密哈希函數。
例:hash_hmac("sha1", $str, $key, true);
/** * @使用HMAC-SHA1算法生成oauth_signature簽名值 * * @param $key 密鑰 * @param $str 源串 * * @return 簽名值 */ function get_signature($str, $key) { $signature = ""; if (function_exists('hash_hmac')) { $signature = base64_encode(hash_hmac("sha1", $str, $key, true)); } else { $blocksize = 64; $hashfunc = 'sha1'; if (strlen($key) > $blocksize) { $key = pack('H*', $hashfunc($key)); } $key = str_pad($key,$blocksize,chr(0x00)); $ipad = str_repeat(chr(0x36),$blocksize); $opad = str_repeat(chr(0x5c),$blocksize); $hmac = pack( 'H*',$hashfunc( ($key^$opad).pack( 'H*',$hashfunc( ($key^$ipad).$str ) ) ) ); $signature = base64_encode($hmac); } return $signature;