【发布时间】:2017-03-20 23:28:43
【问题描述】:
我编写了一个使用 CryptoJS 实现的系统。
写完代码后,我发现crypto.subtle.encrypt 是浏览器内置的 AES 实现。
我想将我的代码从使用 CryptoJs 改为使用 crypto.subtle.encrypt。
以旧方式 (CryptoJS) 编码的数据必须与新方式 (crypto.subtle.encrypt) 兼容。
我怎样才能做到这一点?
当我编写原始代码时,它看起来很像这样:
function cryptojs_encrypt(message) {
var key = "my password";
return CryptoJS.AES.encrypt(message, key).toString());
}
传入的“key”只是一个字符串。根据我从其他 stackoverflow 问题中了解到的内容,CryptoJS 将此字符串转换为“key”和“iv”。这究竟是如何实现的?我尝试浏览 CryptoJS 源代码,但找不到我要查找的内容。
similar.crypt.encrypt 的工作方式是您必须明确地传递密钥和 iv。这是我的代码:
function subtle_encrypt(message) {
var msg = new TextEncoder().encode(message);
var pass = new TextEncoder().encode('my password');
var alg = { name: 'AES-CBC', iv: pass };
crypto.subtle.importKey('raw', pass, alg, false, ['encrypt']).then(function(key){
crypto.subtle.encrypt(alg, key, msg).then(function(ctBuffer){
var string = btoa(ctBuffer);
console.log("result", string);
});
});
}
这可行,但返回不同的结果。我需要修改进入alg 的参数,这些参数与您传入字符串时 CryptoJS 使用的参数相匹配。我该怎么做?
【问题讨论】:
-
您必须实现 OpenSSL 的
EVP_BytesToKey函数,该函数也需要 MD5。这不是您想要重新实现的东西,因为它并不真正安全。此外,看起来 MD5 在 WebCrypto API 中不可用 -
添加到 @ArtjomB。说,crypto-js 以与 OpenSSL 兼容的方式将您的密码短语输入转换为密钥和 IV(请参阅此处的互操作性部分:code.google.com/archive/p/crypto-js)。此处描述了密码短语的 OpenSSL 转换:security.stackexchange.com/questions/29106/…。令人失望的是,crypto-js 与来自 OpenSSL 的不太理想的安全算法进行互操作。
标签: javascript cryptography aes cryptojs webcrypto-api