Nodejs createCipher vs createCipheriv

and*_*snn 13 security encryption algorithm openssl node.js

我目前正在尝试使用NodeJS加密静态数据,我已经阅读了createCipher推荐的Node API文档.

crypto.createCipher()的实现使用OpenSSL函数EVP_BytesToKey导出密钥,摘要算法设置为MD5,一次迭代,无盐.缺少盐允许字典攻击,因为相同的密码始终创建相同的密钥.低迭代计数和非加密安全散列算法允许非常快速地测试密码.

根据OpenSSL建议使用pbkdf2而不是EVP_BytesToKey,建议开发人员使用crypto.pbkdf2()自行派生密钥和IV,并使用crypto.createCipheriv()创建Cipher对象.

createCipher仍然在静止数据加密一个可行的和安全的方式?该方法是否应被视为弃用?知情的攻击者是否可以对数据进行潜在解密?

应该createCipheriv始终优先使用解决方案createCipher吗?

任何其他细节或建议表示赞赏.

Maa*_*wes 5

createCipher 仍然是一种可行且安全的静态数据加密方法吗?

尽管当然不建议使用已弃用的 API 调用,但可以使用createCipher. 为此,给定的“密码”必须足够强大以承受离线攻击以及可能的并行攻击。为此,给定的密码必须具有足够的熵(必须足够随机)以免被猜测。例如,您可以使用密码管理器创建约 80 位或更高的密码并使用这些密码。

使用always 的解决方案是否createCipheriv应该优先createCipher

是的,如果只是因为作者已经警告过您,并且对您的代码的任何审查都必须重新考虑是否createCipher仍然可行。如果该方法从 CryptoJS 中删除(不太可能,但它毕竟已被弃用),那么您的代码将不再运行。

尽管如此,使用 的安全性createCipheriv仍低于直接使用密码作为密钥。您仍应使用基于正确密码的密钥派生函数(例如 PBKDF2)来派生输出密钥材料 - 如更新的文档中所示。createCipher

任何其他细节或建议表示赞赏。

在大多数情况下,您希望使用更高端的加密/解密方法,例如加密消息语法(CMS,在 PKCS#7 中指定)、PGP 或类似的高端协议/容器格式。

如果您确实需要直接使用密码,您应该尝试看看是否可以选择经过身份验证的加密(例如 GCM 提供的加密)。