Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Nodejs createCipher vs createCipheriv_Node.js_Algorithm_Security_Encryption_Openssl - Fatal编程技术网

Node.js Nodejs createCipher vs createCipheriv

Node.js Nodejs createCipher vs createCipheriv,node.js,algorithm,security,encryption,openssl,Node.js,Algorithm,Security,Encryption,Openssl,我目前正在尝试用NodeJS加密静态数据,我在NodeAPI文档中读到,createCipher不是 createCipher()的实现使用 OpenSSL函数EVP_BytesToKey,摘要算法设置为MD5, 一次迭代,没有盐。缺少盐允许字典攻击 因为相同的密码总是创建相同的密钥。低迭代 计数和非加密安全哈希算法允许密码 要非常迅速地进行测试 根据OpenSSL的建议,使用pbkdf2而不是 EVP_BytesToKey建议开发人员派生一个密钥和 他们自己使用crypto.pbkdf2()和

我目前正在尝试用NodeJS加密静态数据,我在NodeAPI文档中读到,
createCipher
不是

createCipher()的实现使用 OpenSSL函数EVP_BytesToKey,摘要算法设置为MD5, 一次迭代,没有盐。缺少盐允许字典攻击 因为相同的密码总是创建相同的密钥。低迭代 计数和非加密安全哈希算法允许密码 要非常迅速地进行测试

根据OpenSSL的建议,使用pbkdf2而不是 EVP_BytesToKey建议开发人员派生一个密钥和 他们自己使用crypto.pbkdf2()和crypto.createCipheriv()来 创建密码对象

createCipher
仍然是加密静态数据的可行且安全的方法吗?此方法是否应视为已弃用? 信息灵通的攻击者有可能解密数据吗

使用
createCipheriv
的解决方案是否总是优于
createCipheriv

任何其他细节或建议,敬请谅解。

iv-代表
首选CreateCippheriv/createDecipheriv, 用法示例:


const crypto=require('crypto')
函数加密(文本){
var cipher=crypto.createCipheriv('aes-256-cbc',
新缓冲区('passwordpasswordpassword')、新缓冲区('vectorvector1234'))
var crypted=cipher.update(文本“utf8”、“十六进制”)
crypted+=cipher.final('hex')
返回加密
}
函数解密(文本){
var decipher=crypto.createDecipheriv('aes-256-cbc',
新缓冲区('passwordpasswordpassword')、新缓冲区('vectorvector1234'))
var dec=解密.更新(文本'hex','utf8')
dec+=最终破译('utf8')
返回十二月
}

现在折旧的
createCipheriv
函数不允许使用唯一的
iv
,这就是为什么首选
createCipheriv

当使用任何密钥派生功能派生密钥时,它无助于保护密文免受
iv
防止的字典攻击

CreateChipher仍然是加密静态数据的可行且安全的方法吗

虽然当然不建议使用不推荐使用的API调用,但是可以使用
createCipher
创建安全系统。为此,给定的“密码”必须足够强大,能够抵御脱机攻击,甚至可能是并行攻击。为此,给定的密码必须有足够的熵(必须足够随机)不被猜测。例如,您可以使用密码管理器创建约80位或更高的密码并使用这些密码

使用
createCipheriv
的解决方案是否总是优于
createCipheriv

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

但是,如果您直接将密码用作密钥,则使用
createCipheriv
的安全性将低于
createCipheriv
。您仍然应该使用正确的基于密码的密钥派生函数(如PBKDF2)来派生输出密钥材料-如更新的文档中所示

任何其他细节或建议,不胜感激

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


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

为什么更可取?如果使用
createCipher
“在常见分组密码模式(例如CTR)中,IV重用”是一个巨大的安全问题,这对“机密性”是灾难性的。而且不推荐使用的
createCipher
api似乎并不阻止使用这些密码模式。请参阅:--Ah看起来像是在计数器模式下使用密码的IV重用现在在该方法的文档中提到了,并且发出了警告。用户不应在crypto.createCipher()中使用计数器模式的密码(例如CTR、GCM或CCM)。当使用它们时会发出警告,以避免导致漏洞的IV重用风险。有关IV在GCM中重用的情况,请参阅Nonce Disrespecting Pharmies以了解详细信息。