【问题标题】:getting crypto.subtle.encrypt to work like CryptoJS.AES.encrypt让 crypto.subtle.encrypt 像 CryptoJS.AES.encrypt 一样工作
【发布时间】: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


【解决方案1】:

我为此创建了一个小型库。

在您的文档中嵌入WebCrypto.js(缩小版)。

像这样使用它:

// Initialize the library
initWebCrypto();

// Encrypt your stuff
WebCrypto.encrypt({
    data: btoa("my message"),
    password: "my password",
    callback: function(response){
        if( !response.error ){
            console.log(response.result); // Compatible with CryptoJS
        }else{
            console.error(response.error);
        }
    }
});

有关更多示例,请参阅https://github.com/etienne-martin/WebCrypto.swift/blob/master/www/index.html

源码:https://github.com/etienne-martin/WebCrypto.swift/blob/master/source.js

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2019-09-09
    • 2013-10-14
    • 2016-01-14
    • 2011-06-18
    • 2012-10-02
    • 1970-01-01
    • 2021-08-30
    • 2019-07-05
    • 1970-01-01
    相关资源
    最近更新 更多