以下代码使用生成3个随机数window.crypto.getRandomValues.根据开发人员的文档(Microsoft MSDN和Mozilla MDN),这应该适用于IE和Chrome.
但实际上它仅适用于Chrome,而不适用于Internet Explorer 11.根据Microsoft的说法,此代码应该可以运行 - 它们提供了与下面列出的相似的代码示例(请参阅上面的MSDN链接).
怎么了?它是如何修复的,以便在两种浏览器中都能正常工作?
var randomValuesArray = new Int32Array(3);
var crypto = window.crypto;
crypto.getRandomValues(randomValuesArray);
var outputString = "";
for (var i = 0; i < randomValuesArray.length; i++) {
if (i > 0) outputString += ",";
outputString += randomValuesArray[i];
}
console.log(outputString);Run Code Online (Sandbox Code Playgroud)
首先在Chrome中尝试使用此代码段,它会正确显示类似的内容
-513632982,-694446670,-254182938
在警报弹出窗口中.
然后,复制此问题的URL并在Internet Explorer 11中尝试- 它显示:
错误:{"message":"无法获取属性'getRandomValues'未定义或null>引用","filename":" https://stacksnippets.net/js ","lineno":15,"colno":2 }
一些背景:我想尝试使用这个代码在Javascript中生成Guids,然后我发现了这个问题.
(更新:根据 …
如何使用Crypto Web API(window.crypto)在浏览器中获取HMAC-SHA512(密钥,数据)?
目前我使用的是CryptoJS库,它非常简单:
CryptoJS.HmacSHA512("myawesomedata", "mysecretkey").toString();
结果是91c14b8d3bcd48be0488bfb8d96d52db6e5f07e5fc677ced2c12916dc87580961f422f9543c786eebfb5797bc3febf796b929efac5c83b4ec69228927f21a03a.
我想摆脱额外的依赖,并开始使用Crypto Web API.我怎样才能得到相同的结果?
我正在尝试使用window.crypto以下方法加密一些文本:
await crypto.subtle.encrypt(algorithm, key, dataArrayBuffer).catch(error => console.error(error));
Run Code Online (Sandbox Code Playgroud)
但是我收到这个错误AES key data must be 128 or 256 bits。我正在使用 PBKDF2 从密码创建 256 位密钥,并指定密钥长度为256:
window.crypto.subtle.deriveKey(
{
"name": "PBKDF2",
"salt": salt,
"iterations": iterations,
"hash": hash
},
baseKey,
{"name": "AES-GCM", "length": 256}, //<------------
true,
["encrypt", "decrypt"]
);
Run Code Online (Sandbox Code Playgroud)
但我最终得到这个键edi5Fou4yCdSdx3DX3Org+L2XFAsVdomVgpVqUGjJ1g=后,我exportKey就和它转换来自ArrayBuffer于一个string与长度44字节,352位...
这可以解释错误,但是如何256从window.crypto's创建一个实际的位键PBKDF2?
JSFiddle:https ://jsfiddle.net/6Lyaoudc/1/
我正在尝试哈希一个字符串.但IE11和Safari中的函数TextEncoder的替代方案是什么?
var string = "foobar";
window.crypto.subtle.digest(
{ "name": "SHA-256" },
new TextEncoder("utf-8").encode(string)).then(function (hash)
{
console.log(hex(hash)); // 'c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2'
}
);
var string = "foobar";
var buffer = new TextEncoder("utf-8").encode(string); // Uint8Array (ArrayBuffer)
var string = new TextDecoder("utf-8").decode(buffer); // string
console.log("buffer", buffer);
console.log("string '" + string + "'");
Run Code Online (Sandbox Code Playgroud)
hex是我从mozilla获得的一个函数
https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest
我正在尝试使用相应的私钥对使用公钥编码的 RSA 2048 位消息进行解码。环境是 google chrome,我正在使用window.crypto.subtleAPI。
我生成了密钥对并使用openssl工具对消息进行了编码:
# generate keys and put the private one in file private_key.pem
openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
# extract public key in file public_key.pem
openssl rsa -pubout -in private_key.pem -out public_key.pem
# encode message input.txt using the public key
openssl rsautl -encrypt -oaep -inkey public_key.pem -pubin -in input.txt -out msg_rsa.enc
# convert the encoded msg in base 64 format
base64 msg_rsa.enc > msg_rsa_64.enc
Run Code Online (Sandbox Code Playgroud)
这是我用来解码消息的 JavaScript 代码:
function …Run Code Online (Sandbox Code Playgroud) 当使用Jest进行运行单元测试时,window.crypto API会引起问题。我还没有找到一种在不安装其他软件包的情况下将加密合并到Jest中的方法,这是我做不到的。因此,无需使用其他npm软件包,就可以测试使用的功能:crypto.getRandomValues()在其中不会崩溃的Jest?任何链接,建议或技巧,不胜感激