描述
我想在Javascript中用SHA256在本地散列一个字符串。我一直在四处寻找,以为会有某种官方库或函数,但我发现的都是不同项目的负载,每个项目都有不同的脚本,我不太确定脚本是否值得信任(因为我不是Maven,肯定没有资格评估它们),也不知道如何实现它们。**编辑:**我需要文本输出,而不是hexes,抱歉,如果我在发布原始问题时没有解释这一点。
代码
以下是我目前所做的尝试:
async function sha256(message) {
// encode as UTF-8
const msgBuffer = new TextEncoder('utf-8').encode(message);
// hash the message
const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);
// convert ArrayBuffer to Array
const hashArray = Array.from(new Uint8Array(hashBuffer));
// convert bytes to hex string
const hashHex = hashArray.map(b => ('00' + b.toString(16)).slice(-2)).join('');
console.log(hashHex);
return hashHex;
}
sha256(passwordInput);
控制台输出:
未捕获(在承诺中)TypeError:无法读取未定义的属性'digest'
我是javascript的新手,我愿意接受所有的建议,所以是的。
更新
虽然您的大多数建议都有效,但对于那些希望使用Web Crypto API的人,答案在第5行。我需要将crypto.subtle.digest
更改为window.crypto.subtle.digest
9条答案
按热度按时间mrzz3bfm1#
如果你是一个学者,你会想看看这篇文章:https://www.movable-type.co.uk/scripts/sha256.html
纯JavaScript:
来源:https://geraintluff.github.io/sha256/
d4so4syb2#
2021更新-SHA 256现在包含在当前浏览器中
正如您在问题中提到的,您不需要自定义Crypto实现来实现这一点。
WebCrypto is supported in all current browsers。使用
window.crypto.subtle.digest
生成SHA 256哈希。如果你想要同步的东西,例如
sha.js
每月有1280万次下载,并且是积极维护的。ef1yzkbh3#
请查看:https://github.com/brix/crypto-js
您可以使用下列项目:
或者不需要:
2vuwiymt4#
你可以使用SubtleCrypto.digest()来帮助你。
它需要一个Uint8Array
如果您的数据是Blob
如果数据是字符串,请使用TextEncoder.encode()转换为Uint8Array
下面是一个可运行的示例,供您参考。
7z5jn7bk5#
Cannot read property 'digest' of undefined
当调用crypto.subtle.digest
时意味着subtle
在crypto
内不可用;因此digest
不可能存在,因为它的包含模块不存在。从逻辑上讲,
crypto.subtle
在此范围内一定不可用,实际上,在浏览器**anywhere outside of a secure context中也是如此。**什么情况下上下文是安全的?-developer.mozilla.org
当上下文被安全地(或本地地)传递,并且当它不能被用来向不安全的上下文提供对安全API的访问时,上下文将被认为是安全的。实际上,这意味着对于具有安全上下文的页面,它和沿着其父级和打开器链的所有页面必须已经被安全地传递。
例如,如果通过TLS安全传递的页面具有未被安全传递的父文档或祖先文档,则该页面不被视为安全上下文;类似地,如果TLS传递的文档由不安全的上下文在新窗口中打开,而没有指定noopener,则打开的窗口不被认为是安全上下文(因为opener和打开的窗口可以通过postMessage通信)。
本地传送的文件(如http://localhost* 和 file:// 路径)被视为已安全传送。
非本地的上下文必须通过 https:// 或 wss:// 提供服务,并且其中使用的协议不应被视为过时。
在安全的上下文中,您的代码可以完美地工作😄
**1:**安全上下文-Web security | MDN
**2:**什么情况下上下文被认为是安全的?-安全上下文- Web安全|MDN网络
**3:**窗口.postMessage()-Web APIs | MDN
**4:**窗口功能特性-Window.open()- Web API| MDN网络
gstyhher6#
代码很好。最后一行应该看起来像这样:
zpgglvta7#
上面的ofundefined的答案有很多遗漏的分号和错误。我已经清理了代码,所以你可以把它作为一个函数调用。我不确定它是否能和unicode字符一起工作。可能需要把unicode转换成普通的ascii才能工作。但是,正如链接的文章所说.... a.这不应该在生产环境中使用。另外,看起来这个代码的原始版本确实支持unicode,所以也许使用unicode比使用这个函数更好。
上面的文章(似乎支持unicode)显示了这个函数,它与下面发布的函数不同...
https://www.movable-type.co.uk/scripts/sha256.html
使用方法
输出
已使用PHP哈希测试-输出
这不是上面链接页面中的FULL函数,它可以“原样”处理非Unicode字符,正如你在上面的例子中看到的。
fkvaft9z8#
另请参考如何在浏览器JavaScript中计算字符串的SHA散列
您可以使用CDN库。
https://cdnjs.com/libraries/crypto-js
请在html中引用以下脚本标记:
有关如何使用库中的方法,请参阅以下网站:
https://cryptojs.gitbook.io/docs/
下一页显示了我的建议来源的一个示例:
https://codepen.io/omararcus/pen/QWwBdmo
mm9b1k5b9#
快回答: