在一个项目中,客户需要从前端签名,加密插件使用的 cryptoJS
,使用与后端一样的签名流程( HmacSHA1
后 Base64.encode
)发现并不能通过签名认证,签名校验方后端 php
代码中使用 hash_hmac
函数,先来看一下则会个函数的官网说明:
说明
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 输出小写 16 进制字符串
返回值
如果 raw_output 设置为 TRUE, 则返回原始二进制数据表示的信息摘要, 否则返回 16 进制小写字符串格式表示的信息摘要。 如果 algo 参数指定的不是受支持的算法,返回 FALSE。
api
接口加密签名代码:
/**
* @param $uri string 请求URL的path部分,如'v1/task/index'
* @param $appkey string 应用appkey
* @param $secret string 应用secret
* @param $timestamp int 时间戳
* @return string
*/
private static function generateSign($uri, $appkey, $secret, $timestamp)
{
$str = $uri . '_' . $appkey . '_' . $timestamp;
if (function_exists('hash_hmac')) {
return base64_encode(hash_hmac("sha1", $str, $secret, true));
} else {
return '';
}
}
可以看到加密函数 hash_hmac
的 raw_output
设置了 true
,及加密返回的是原始二进制数据表示的信息摘要,那么在前端这边使用 CryptoJS
如果达到同样的效果呢?
经过测试,这样的代码可以实现:
首先,引入 CryptoJS
包中的三个文件 core-min.js
, hmac-sha1.js
, enc-base64-min.js
,签名代码:
function getSign(uri, appkey, secret, timestamp){
var str = uri + '_' + appkey + '_' + timestamp;
var hash = CryptoJS.HmacSHA1(str, secret);
var base64 = hash.toString(CryptoJS.enc.Base64);
console.log(base64);
return base64;
}
这样生成的签名就可以通过校验了。
CryptoJS
包下载见项目:sytelus/CryptoJS
标题:JavaScript通过CryptoJS等效实现php中hash_hmac函数加密raw_output配置
原文链接:https://beltxman.com/2581.html
若无特殊说明本站内容为 行星带 原创,未经同意请勿转载。