php中的hmac,JavaScript通过CryptoJS等效实现php中hash_hmac函数加密raw_output配置

在一个项目中,客户需要从前端签名,加密插件使用的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;

}

这样生成的签名就可以通过校验了。

JavaScript通过CryptoJS等效实现php中hash_hmac函数加密raw_output配置

更多精彩,敬请关注本博微信公众号:hsu1943

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值