Node.js 按照OpenSSL对“crypto”库(nodejs)的crypto.createCipher()的建议正确实现密钥派生

Node.js 按照OpenSSL对“crypto”库(nodejs)的crypto.createCipher()的建议正确实现密钥派生,node.js,encryption,cryptography,pbkdf2,Node.js,Encryption,Cryptography,Pbkdf2,我正在修理这个。阅读这篇文章会让你对问题有一个更好的了解,尽管如此,我还是用我自己的语言写了这篇文章 这是系统应该如何工作的: 用户输入文本和密码,经过强加密后保存到文件中。当用户输入encryptedText和password时,它返回已解密的文本。目前,使用node.js的Crypto库处理加密,函数使用createCipher 问题:该解决方案与CreateChipher配合使用效果很好,但它没有采用任何类型的salt机制。Openssl建议使用pbkdf2来派生密钥。我理解为什么这是必要

我正在修理这个。阅读这篇文章会让你对问题有一个更好的了解,尽管如此,我还是用我自己的语言写了这篇文章

这是系统应该如何工作的:

用户输入文本和密码,经过强加密后保存到文件中。当用户输入encryptedText和password时,它返回已解密的文本。目前,使用node.js的Crypto库处理加密,函数使用createCipher

问题:该解决方案与CreateChipher配合使用效果很好,但它没有采用任何类型的salt机制。Openssl建议使用pbkdf2来派生密钥。我理解为什么这是必要的,因为否则文本的加密值将始终相同。使用相同密码加密1234将始终导致xyz,这使得彩虹表攻击变得容易/可能

我正在尝试的解决方案:我开始实现Openssl的建议,即使用pbkdf2实现密钥派生机制,但我不太明白应该如何正确地完成。请帮助我理解并找出解决此问题的正确方法。我正在考虑采用以下方法,但似乎遗漏了很多东西

deriveKeypassword:使用随机salt和任何哈希算法为密码字符串创建哈希,迭代次数=64000。 derivedKey=crypto.pbkdf2Syncpassword,salt=crypto.randomBytes256,迭代次数,512,'sha256'

encrypttext,derivedKey,cb:

使用derivedKey创建cipherObject: cipherObject=createCipherivalgo=aes-256-cbc,derivedKey,iv2=randomBytes256,。。。 应用加密: cipherText=cipherObject.updatetext,。。。 存储加密文本: 1:盐;iters:IV:本地文件中的密文感谢@bartonjs让我理解了这一点 DecryptedText,密码: 所以要解密的文本如下所示:1:salt;iters:IV:密文 从已保存的配置中派生: derivedKey=pbkdf2Syncpassword,salt,iters,'sha256' 使用相同的算法和derivedKey以上创建解密对象:decipherObject=createDecipherIvaes-256-cbc,derivedKey,IV。。。 更新decipherObject以最终获取原始文本: text=decipherObject.UpdateDecipherText,。。。 我的三大问题按优先顺序排列

我在概念上做的一切都对吗? 我需要考虑安全问题吗? 我是否遵循最佳实践?还有什么可以改进的。 顺便说一句,我不是密码学专家,如果能从中得到一些意见会很有帮助

对于解密,我想我将不得不节省盐的derivedKey以及与iv。我不知道这是否会危及安全。解决方案应该是什么

一种盐,来自:

在加密过程中使用的非秘密值,通常用于 确保攻击者不能重用一个实例的计算结果

资料来源:SP 800-63;CNSSI-4009

因为它被定义为非秘密值,所以将其写在IV旁边不会影响安全性

注意,您还应该为PBKDF2编写迭代计数

salt;iters:IV:cipherText

Startup,IV,密文由冒号分隔,Startup由分号分解为salt和迭代计数,因此随着结构的发展,解析不会含糊不清。。。为了获得最佳结果,在开始时,文件格式的v1应该是一个模式值,比如数字1,比如1:salt;iters:IV:cipherText.

我假设你不想自己实现它,如果你不需要的话。正如CodeCaster所说,如果你对它没有扎实的知识,你真的不应该成为实现它的人

我的建议是使用which

查看他们的演示页面,该页面允许您使用密码和随机密码对消息进行加密:

这里有一个指向演示源代码的链接,您可以从中了解如何在其库中实现它:

编辑从注释到答案的跳变正如josh3736在注释中指出的,不需要第三方库。节点的加密模块本机支持pbkdf2。他提供了以下链接作为示例:

我没有足够的加密知识-那就不要使用自己的文件加密实用程序。-1-这个问题是关于nodejs的,其中pbkdf2支持内置于加密模块中。没有必要使用第三方库。很公平,哈哈,你打算发布一个详细的答案吗?谢谢@bartonjs,这对我来说很有意义。你能回顾一下我问题中的解密部分并给出反馈吗