Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP的hash_hmac()是否有等效的JavaScript函数?_Javascript_Php_Amazon Web Services - Fatal编程技术网

PHP的hash_hmac()是否有等效的JavaScript函数?

PHP的hash_hmac()是否有等效的JavaScript函数?,javascript,php,amazon-web-services,Javascript,Php,Amazon Web Services,我们正在开发一个在线课程网站 课程有音频和文本(无视频) 音频文件存储在Amazon S3上,并通过AWS CloudFront交付 每当用户想要播放课程音频文件时, 网站(服务器端)向CloudFront发送请求以获取音频文件 每个请求还包括一个签名和一个随机数 我们使用PHP hash_hmac生成签名,如下所示: $signature = hash_hmac('sha256', $random_number, $secret, true); 双方(网站和CloudFront功能)都有硬编

我们正在开发一个在线课程网站
课程有音频和文本(无视频)
音频文件存储在Amazon S3上,并通过AWS CloudFront交付

每当用户想要播放课程音频文件时,
网站(服务器端)向CloudFront发送请求以获取音频文件
每个请求还包括一个签名和一个随机数

我们使用PHP hash_hmac生成签名,如下所示:

$signature = hash_hmac('sha256', $random_number, $secret, true);
双方(网站和CloudFront功能)都有硬编码的密钥

一旦CloudFront收到请求,
“CloudFront功能”(新AWS功能)正在验证令牌
CloudFront函数只能使用JavaScript(而不是NodeJS或Python)

我们希望CloudFront函数使用JavaScript简单地运行hash_hmac() 然后比较签名,但我们找不到等效的JS函数。

我们详细检查了StackOverflow,但找不到等效的JS函数
我们的发现:
Google的Crypto JS库已被弃用
无法使用NodeJS加密模块,因为我们使用纯JavaScript

有人能分享一个关于如何在JavaScript上运行hash_hmac的链接或代码片段吗?

是的,有一个本机:

(异步函数(){
const someData=‘非常真实的数据’;
const key=wait window.crypto.minute.generateKey({
名称:“HMAC”,
散列:{
名称:“SHA-256”
}
},
是的,
[“签字”、“核实”];
设enc=newtextcoder().encode(someData);
常量签名=等待加密微妙签名('HMAC',密钥,enc);
console.log(签名);//ArrayBuffer(32)
const valid=等待加密微妙验证('HMAC',密钥,签名,enc);
console.log(有效);

})();所以一种方法是使用上面提到的JS crypto.division.sign@Guerric p

事实证明,还有另一种方法可以实现这一目标
阅读完整的CloudFront开发者指南后,
我发现了以下内容:

NodeJS有一个很棒的模块,叫做Crypto。

通常,我们不能向JavaScript代码中添加NodeJS模块。

但是,CloudFront函数(仅使用普通JS)也支持NodeJS加密模块:

加密模块(crypto)提供标准哈希和 基于散列的消息身份验证代码(HMAC)帮助程序。你可以加载 使用require('crypto')的模块。该模块提供以下功能 方法的行为与其对应的Node.js完全相同


这回答了你的问题吗@biesior我不确定这是否符合“客户端”,因为脚本是在CloudFrontEdge位置执行的,而不是在请求的浏览器中。事实上,当我再次阅读您的问题时,使用HMAC是没有意义的,因为密钥(假定是私有的)实际上是公开的,因为包含在前端中