我对此漏洞有疑问。我想知道这实际上意味着什么。这只是 GitHub Dependabot 的一些幻想,还是真的很危险?
如果我用它来加密我的加密私钥,有人能够解密它们(在不知道我的密码的情况下)吗?您能否简单地解释一下这个漏洞实际上是什么?
import CryptoJS from 'crypto-js';
export const encryptPrivateKey = (privateKey: string, password: string) => {
const privateKeyBytes = CryptoJS.enc.Hex.parse(privateKey);
const key = CryptoJS.PBKDF2(password, CryptoJS.SHA256(password), { keySize: 256 / 32 });
const ciphertext = CryptoJS.AES.encrypt(privateKeyBytes, key, { mode: CryptoJS.mode.ECB });
return String(ciphertext);
};
export const decryptPrivateKey = (encodedKey: string, password: string) => {
const key = CryptoJS.PBKDF2(password, CryptoJS.SHA256(password), { keySize: 256 / 32 });
const decryptedBytes = CryptoJS.AES.decrypt(encodedKey, key, { mode: CryptoJS.mode.ECB });
const decryptedHex = decryptedBytes.toString(CryptoJS.enc.Hex);
if (decryptedHex[0] == decryptedHex[1] && +decryptedHex[0] == 0) {
const decrypt = decryptedHex.substring(0, 1) + 'x' + decryptedHex.substring(2);
return decrypt;
}
return decryptedHex;
};
您能从加密版本中获取原始私钥吗?
sEf9jM/BCXfQ94758EMFGcru3jut3U2vKhcZlyqL7xTU+/eeBkoJsQoiKQ6XQm0i
PBKDF2 以带有盐的迭代方式使用具有 HMAC 的加密哈希函数。
在本例中,它使用的是 SHA-1,该算法容易受到碰撞攻击,不应再使用,但我们认为当前的攻击无法在 PBKDF2 的上下文中被利用。 (请注意,尽管有些人这么说,HMAC-SHA-1 并不总是安全的;例如,使用 HMAC-SHA-1 作为承诺方案是完全不安全的。)
这个版本的 CryptoJS 似乎也有默认的 1 次迭代,这一直是不安全的。在这种结构中,只需调用一次 HMAC-SHA-1,这种方法非常便宜,并且使用密码列表或其变体可以轻松破解最简单的密码,只需很少的努力。由于使用密码哈希的部分目标是为弱密码提供额外的安全性,因此这不被认为是可接受的配置。
一般来说,现代密码哈希的首选算法(例如 Argon2 和 scrypt)是内存困难的,这意味着它们需要一定量的内存用于计算,以减少 GPU 上的并行化。 PBKDF2 不是这样的算法,强烈建议使用较新的内存困难函数(例如 Argon2id)。如果您只需要针对 FIPS 算法,那么 PBKDF2 是您唯一的选择,但您通常还需要使用 FIPS 认证的库,而 CryptoJS 则不是。
如果您绝对必须使用 PBKDF2,则应将其与强大的加密哈希函数(例如 SHA-256 或 SHA-512,而不是 SHA-1)一起使用,并使用适当的迭代次数。现在,诸如 250,000 之类的数字适用于某些机器,但随着时间的推移,需要增加。
此外,如果您使用加密库,则应该使用维护的库,甚至比常规库更是如此。正如文档中提到的,大多数现代 JavaScript 环境都提供加密功能,最好尽可能使用它。您还可以使用安全的 Rust 加密库(例如 RustCrypto 库)来实现 Argon2 并通过 WASM 调用它,这也可能比使用 CryptoJS 在 JavaScript 中执行操作更好。