我正在尝试使用SubtleCrypto在javascript(firefox)中加密字符串。问题是,加密仅适用于短输入。一旦字符串(testdata)超过190个字符,它将失败并出现OperationError。 为什么SubtleCrypto的表现如此,我该如何解决呢?
代码:
function str2ab(str) {
var encoder = new TextEncoder('utf-8');
return encoder.encode(str);
}
function ab2str(buf) {
var decoder = new TextDecoder('utf-8');
return decoder.decode(buf);
}
var keypair;
var algorithmKeyGen = {
name: 'RSA-OAEP',
modulusLength: 2048,
publicExponent: new Uint8Array([1,
0,
1
]), // Equivalent to 65537
hash: {
name: 'SHA-256'
}
};
var crypter = window.crypto.subtle;
function encrypt(buffer) {
return crypter.encrypt(algorithmKeyGen, keypair.publicKey, buffer).then(
function(data) {
alert(ab2str(data));
},
function(error) {
alert(error);
}
);
}
var testdata = "aasasadasdaasasadasdaasazzzzzzzzzzzzzzzzzzzzuuuuuuuuuuuuuuuuuuuuuuuzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzuuuuudddsdfssssssssssdddddddddddzzzzzzzzzzzzzzzzzzzzzzzzzzzzzppppppggppppppppppppppppssssstt"
crypter.generateKey(algorithmKeyGen, true, [
'sign',
'encrypt',
'decrypt',
'verify',
'deriveKey'
]).then(function(res) {
keypair = res;
encrypt(str2ab(testdata));
}, console.error.bind(console, 'Unable to generate a key'));
答案 0 :(得分:4)
RSA 不适用于批量加密。可以使用RSA加密的特定数据量取决于密钥大小和您使用的填充。
2048位密钥允许 256字节 OAEP填充 42字节,留下 214字节用于加密数据。
通常,您可以使用 RSA 加密对称密钥,然后将其用于加密实际数据。通常称为hybrid encryption。
答案 1 :(得分:0)
经过一些研究,我发现了以下可能导致问题的原因:
特定于浏览器:
https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/encrypt
加密数据时:
https://www.w3.org/TR/WebCryptoAPI/
考虑到这一点,我被引导相信问题不在你的文本中加密,而是在你如何调用函数。
另一个可能的原因(尽管我不会把钱花在上面)是加密一个长时间为浏览器生成变量的字符串的事实。请查看此讨论: