用 JavaScript 计算 SHA-256 hash值

发布于:2024-05-07 ⋅ 阅读:(19) ⋅ 点赞:(0)

SHA-256算法是一个广泛使用的散列函数,它产生256位的hash值。它用于许多安全应用程序和协议,包括 TLS 和 SSL、 SSH、 PGP 和比特币。

在 JavaScript 中计算 SHA-256 hash值使用原生 API 很容易,但是浏览器和 Node.js 之间有一些区别。由于浏览器实现是异步的,所以所提供的两个示例都使用异步promise返回。

浏览器实现

使用 Web Crypto API 中 SubtleCrypto 接口,SubtleCrypto.digest() 接口会返回给定数据的摘要,摘要以ArrayBuffer 的形式返回,需要将其转换为十六进制字符串。

const hashValue = val =>
crypto.subtle
  .digest('SHA-256', new TextEncoder('utf-8').encode(val))
  .then(h => {
    let hexes = [],
      view = new DataView(h);
    for (let i = 0; i < view.byteLength; i += 4)
      hexes.push(('00000000' + view.getUint32(i).toString(16)).slice(-8));
    return hexes.join('');
  });

hashValue(
JSON.stringify({ coder: "fe-garden", subject: 'sha-256', type: { module: "nodejs" } })
).then(console.log);
// '6c0225ba749b8701a5d051d02faafb1fdadc9457a2eaf81bf89e3353a6aaa4f1'

Nodejs实现

使用node 内置的加密库crypto实现。

import { createHash } from "crypto";

const hashValue = (val) =>
new Promise((resolve) => {
  const hash = createHash("sha256").update(val).digest("hex");
  resolve(hash);
});

hashValue(JSON.stringify({ coder: "fe-garden", subject: 'sha-256', type: { module: "nodejs" } })).then(
console.log
);
//6c0225ba749b8701a5d051d02faafb1fdadc9457a2eaf81bf89e3353a6aaa4f1

注意

  • 上述两个实现互不兼容,不能在 Node.js 中使用浏览器实现,反之亦然;

  • 两种实现应该为相同的输入产生相同的结果。

参考资料