HMAC_SHA1(Hashed Message Authentication Code, Secure Hash Algorithm)是一种安全的基于加密hash函数和共享密钥的消息认证协议。
它可以有效地防止数据在传输过程中被截获和篡改,维护了数据的完整性、 可靠性和安全性。HMAC_SHA1消息认证机制的成功在于一个加密的hash函数、
一个加密的随机密钥和一个安全的密钥交换机制。
HMAC_SHA1 其实还是一种散列算法,只不过是用密钥来求取摘要值的散列算法。
HMAC_SHA1算法在身份验证和数据完整性方面可以得到很好的应用,在目前网络安全也得到较好的实现。
知识点:
https://www.php.net/manual/en/function.hash-hmac-algos.php
hash_hmac_algos
(PHP 7> = 7.2.0)版本小于7.2报错,注意看手册
hash_hmac_algos - 返回适用于hash_hmac的已注册散列算法列表
返回一个数字索引数组,其中包含适用于hash_hmac()的支持散列算法列表。
例子
<?php
print_r(hash_hmac_algos());
上面的例子将输出类似于:
排列
(
[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;
来源:oschina
链接:https://my.oschina.net/u/4297988/blog/3596199