1、在php中hash_hmac函数就能将HMAC和一部分哈希加密算法相结合起来实现HMAC-SHA1 HMAC-SHA256 HMAC-MD5等等算法。函数介绍如下:
string hash_hmac(string $algo, string $data, string $key, bool $raw_output = false)
algo:要使用的哈希算法名称,可以是上述提到的md5,sha1等
data:要进行哈希运算的消息,也就是需要加密的明文。
key:使用HMAC生成信息摘要是所使用的密钥。
raw_output:该参数为可选参数,默认为false,如果设为true,则返回原始二进制数据表示的信息摘要,否则返回16进制小写字符串格式表示的信息摘要(注意是16进制数,而非简单的字母加数字)。
另外:如果algo参数指定的不是受支持的算法,将返回false。
2、钉钉签名算法:
先看一下php的实现:
//毫秒
list($msec, $sec) = explode(' ', microtime());
$timestamp = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
$app_id = '111111111';
$app_key = '222222222';
$s = hash_hmac('sha256',$timestamp,$app_key,true);
$signature = base64_encode($s);
//http_build_query已经urlencode,所以这里不需要再次urlencode
$result = http_build_query(
array(
'signature'=>$signature,
'timestamp'=>$timestamp,
'accessKey'=>$app_id
)
);
得到的result再拼接到指定的url上,然后带上请求包结构体以post方式发起请求。
钉钉服务端会根据timestamp和保存的app_key再算一次signature,对比两个signature的值是否一致。如果一致则请求成功,否则返回错误。