如何解决客户端 (Chrome/V8) 上 JavaScript 中的哈希计算
在 Node.js 中,我可以借助 crypto
模块计算散列:
import crypto from "crypto";
const myHash = await crypto.createHash("SHA3-512").update("myText","utf8").digest("base64");
由于 Node.js 基于 V8,我假设这段代码应该适用于任何 V8 驱动的浏览器(Chrome、Edge、Opera 等)。但看起来好像不是这样。
根据 Web Crypto API,crypto.subtle.digest
不支持开箱即用的 SHA3-512
,为了获得正确的哈希字符串,我需要处理 digest()
结果( ArrayBuffer
) 手动,例如:
const buf = await crypto.subtle.digest("SHA-512",new TextEncoder("utf-8").encode("myText"));
const myHash = Array.prototype.map.call(new Uint8Array(buf),arrItem => (("00" + arrItem.toString(16)).slice(-2))).join("");
这种“API 不一致”非常令人惊讶,是否有任何替代方案,允许将 Node.js crypto
模块 API 体验带给 V8 驱动的客户端?
解决方法
crypto
模块不是由 V8 实现的;它由相应的嵌入器(Chrome/Node/...)提供。这意味着没有技术原因会强制所有嵌入器提供相同的 API。 (从好的方面来说,这也意味着客户端是基于 V8 还是其他 JS 引擎构建无关紧要——所有现代浏览器都支持相同的 Web Crypto API。)我不知道为什么 Node 选择提出自己的API,也许是因为它比 Web Crypto API 存在的时间更长?
看起来 Node 15.0 添加了 Web Crypto API 的实现:https://nodejs.org/api/webcrypto.html。所以你可以用它来让你的代码在服务器和客户端上都能工作。
作为替代方案,您可以编写一个小 shim 来抽象差异。或者您可以查找现有的软件包;例如快速搜索出现 https://www.npmjs.com/package/crypto-browserify(没有个人经验,因此没有特别认可)。
无论采用何种方法,在浏览器中,您都将受限于 Web Crypto API 支持的算法,目前包括 SHA-512 但不包括 SHA3-512。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。