我正在尝试转换 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。
最佳答案
您正在做出的一些决定将对您的敏感值的安全产生不利影响:
- 您使用的是静态全零 IV。对于使用特定 key 加密的每条消息,IV 必须是唯一且不可预测的。然后,IV 可以添加到密文之前,并在不 protected 情况下传输到接收者,在接收者中它被切片并用于解密。
- 您的 key 派生函数 (KDF) 很弱 - SHA-256 可以在 23 billion attempts per second on commodity hardware 处破解。使用 key 拉伸(stretch)算法,如 PBKDF2具有高迭代计数,或 bcrypt或scrypt对于内存硬度。
- 您的密文未经身份验证 - AES/CBC 提供 secret 性,但不提供完整性或身份验证。拦截器可以操纵传输中的密文并尝试解密它。这可能会导致未经授权的解密(即将恶意明文注入(inject)您的应用程序)或填充预言机攻击,并最终导致密文恢复。使用经过身份验证的加密(带有关联数据)(AE 或 AEAD)密码模式来缓解这种情况,或者在密文上使用单独的 key 添加强大的 HMAC 结构,并在使用恒定时间等于方法进行解密之前进行验证。
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/