【问题标题】:Is there any equivalent JavaScript function for PHP`s hash_hmac()?PHP`s hash_hmac() 是否有任何等效的 JavaScript 函数?
【发布时间】:2021-05-11 17:55:03
【问题描述】:

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

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

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

$signature = hash_hmac('sha256', $random_number, $secret, true);

双方(网站和 CloudFront 功能)都有硬编码的密钥。

CloudFront 收到请求后,
“CloudFront 功能”(新的 AWS 功能)正在验证令牌。
CloudFront 函数只能使用 JavaScript(不是 NodeJS 也不是 Python)。
https://aws.amazon.com/blogs/aws/introducing-cloudfront-functions-run-your-code-at-the-edge-with-low-latency-at-any-scale/

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

我们在 StackOverflow 上进行了广泛检查,但找不到等效的 JS 函数。
我们的发现:
Google 的 Crypto-JS 库已弃用。
由于我们使用纯 JavaScript,因此无法使用 NodeJS Crypto 模块。

有人可以分享关于如何在 JavaScript 上运行 hash_hmac 的链接或代码 sn-p 吗?

【问题讨论】:

  • 这能回答你的问题吗? How can I hash a string with SHA256 in JS?
  • @biesior 我不确定这是否符合“客户端”的要求,因为脚本是在 CloudFront 边缘位置上执行的,而不是在请求浏览器中。

标签: javascript php amazon-web-services


【解决方案1】:

是的,有一个原生的API

(async function () {
  const someData = 'Very genuine data';

  const key = await window.crypto.subtle.generateKey({
    name: "HMAC",
    hash: {
      name: "SHA-256"
    }
  },
      true,
      ["sign", "verify"]);

  let enc = new TextEncoder().encode(someData);

  const signature = await crypto.subtle.sign('HMAC', key, enc);

  console.log(signature); // ArrayBuffer(32)
  
  const valid = await crypto.subtle.verify('HMAC', key, signature, enc);
  
  console.log(valid);
  
})();

【讨论】:

  • 确实,当我再次阅读您的问题时,使用 HMAC 没有任何意义,因为密钥(据说是私有的)实际上是公开的,因为包含在前端中
【解决方案2】:

所以一种方法是使用 JS crypto.subtle.sign 作为上面提到的@Guerric P。

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

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

一般来说,我们不能在 JavaScript 代码中添加 NodeJS 模块。

但是,CloudFront 函数(仅使用纯 JS)也支持 NodeJS Crypto 模块:
https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/functions-javascript-runtime-features.html#writing-functions-javascript-features-builtin-modules-crypto

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

【讨论】:

    猜你喜欢
    • 2017-02-14
    • 1970-01-01
    • 2011-12-25
    • 2012-04-01
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 2010-10-30
    • 2011-02-09
    相关资源
    最近更新 更多