crypto-js PBKDF2 比 1993 年指定的弱 1,000 倍,比当前标准弱 130 万倍

问题描述 投票:0回答:1

我对此漏洞有疑问。我想知道这实际上意味着什么。这只是 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
security cryptography cryptojs password-encryption pbkdf2
1个回答
0
投票

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 中执行操作更好。

© www.soinside.com 2019 - 2024. All rights reserved.