Closed imnpc closed 1 year ago
HMAC-SM3和HMAC-SHA256在HMAC算法的基础上,只是在底层哈希函数的选择上有所区别
function myhash( $data,$digest_algo, $binary=false){
// 有些版本的php的套件自带了sm3,就可以用这个openssl_digest方法做,如不支持,就用相关的函数实现就可
return openssl_digest($data, $digest_algo,$binary);
}
function hmac($key, $data, $algorithm = 'sha256')
{
$blockSize = 64;
if (strlen($key) > $blockSize) {
die("please check key len");
}
$key = str_pad($key, $blockSize, chr(0x00));
$innerPad = str_repeat(chr(0x36), $blockSize);
$outerPad = str_repeat(chr(0x5C), $blockSize);
$innerKey = $key ^ $innerPad;
$inner = $innerKey . $data;
$hash = myhash( $inner,$algorithm, true);
$outerKey = $key ^ $outerPad;
$outer = $outerKey . $hash;
$hmac = myhash( $outer,$algorithm);
return $hmac;
}
$key = '123456'; // 密钥
$data = 'Hello,world!'; // 要进行HMAC计算的数据
$hmac = hmac($key, $data,'sm3');
var_dump($hmac);
注意这里key 要原始的字符串,可能你拿到的是 hex的,这个需要 做下hex2bin, key的长度大于16字节为宜,太长太短都不好,上面函数没有对太短做判定
注意这里key 要原始的字符串,可能你拿到的是 hex的,这个需要 做下hex2bin, key的长度大于16字节为宜,太长太短都不好,上面函数没有对太短做判定
十分感谢解答
最近发现有的对接是需要 HMAC-SM3 模式,就是有一个密钥,然后带进去加密,不知道我们这个应该如何实现,我搜索到GMSSL-PHP上有这个