javascript - 使用加密库将 Java AES 加密转换为 Javascript

标签 javascript java node.js encryption aes

我正在尝试转换 java 库 - AESCrypt-Java 到 JavaScript。

这是迄今为止我对解密函数的实现。我无法解密文本。有人能找出我哪里出错了吗?

function decrypt(password, base64text) {
    key = generateKey(password);
    var decodedCipherText = new Buffer(base64text, 'base64')
    var iv = new Buffer(16);
    iv.fill(0);
    var decipher = crypto.createDecipheriv("aes-256-cbc", key, iv)
    let decrypted = decipher.update(decodedCipherText, 'base64', 'utf-8');
    decrypted += decipher.final('utf-8')
    return decryptedBytes
}

function generateKey(password) {
    return crypto.createHash('sha256').update(usr_id).digest();
}

var encryptedText = '1+2yFMDH1C/uIc1huwezbrsQ==';
var password      = '8AVrWtyabQ';
decrypt(password, encryptedText)

预期的纯文本输出是 Wordpress。

最佳答案

您正在做出的一些决定将对您的敏感值的安全产生不利影响:

  1. 您使用的是静态全零 IV。对于使用特定 key 加密的每条消息,IV 必须是唯一且不可预测的。然后,IV 可以添加到密文之前,并在不 protected 情况下传输到接收者,在接收者中它被切片并用于解密。
  2. 您的 key 派生函数 (KDF) 很弱 - SHA-256 可以在 23 billion attempts per second on commodity hardware 处破解。使用 key 拉伸(stretch)算法,如 PBKDF2具有高迭代计数,或 bcryptscrypt对于内存硬度。
  3. 您的密文未经身份验证 - AES/CBC 提供 secret 性,但不提供完整性或身份验证。拦截器可以操纵传输中的密文并尝试解密它。这可能会导致未经授权的解密(即将恶意明文注入(inject)您的应用程序)或填充预言机攻击,并最终导致密文恢复。使用经过身份验证的加密(带有关联数据)(AE 或 AEAD)密码模式来缓解这种情况,或者在密文上使用单独的 key 添加强大的 HMAC 结构,并在使用恒定时间等于方法进行解密之前进行验证。
  4. new Buffer(string, encoding)new Buffer(size) 已弃用并且 Buffer.from(string, encoding)Buffer.alloc(size)应该使用。您创建一个 Buffer包含所提供的以 Base64 编码的密文。我感觉您的编码出现了问题(您没有提供任何示例输出供我们查看)。 Here is an example使用 Buffer 进行加密和解密对象。

    function encrypt(buffer){
      var cipher = crypto.createCipher(algorithm,password)
      var crypted = Buffer.concat([cipher.update(buffer),cipher.final()]);
      return crypted;
    }
    
    function decrypt(buffer){
      var decipher = crypto.createDecipher(algorithm,password)
      var dec = Buffer.concat([decipher.update(buffer) , decipher.final()]);
      return dec;
    }
    
    var hw = encrypt(new Buffer("hello world", "utf8"))
    // outputs hello world
    console.log(decrypt(hw).toString('utf8'));
    

    如您所见,cipher.update(buffer)在内部处理编码,因此您不需要这样做。

关于javascript - 使用加密库将 Java AES 加密转换为 Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41726976/

相关文章:

javascript - Coldfusion 中提交的表单会发生什么?

javascript - react Bootstrap : TypeError: Unable to get property 'bool' of undefined or null reference

javascript - 概念 - `this` 在 addEventListener 回调中指的是什么?

javascript - 错误: Cannot find module 'http-errors' on local npm

node.js - 使用 Handlebars 比较迭代值

javascript - 为什么使用类时我的 var 未定义?

javascript - 使用 jQuery 从二维数组创建表

java - 适用于网络的高性能pdf查看器

java - 使用 HtmlUnit 在 DomNode 上调用 getByXPath

java - 我的应用程序直接进入 MainActivity