javascript - 如何在nodejs的createcipheriv中存储用于创建密码的iv,以供将来解密?

标签 javascript node.js encryption initialization-vector node-crypto

我是密码学新手,我正在使用 Nodejs 来服务应用程序。

我的应用程序使用了我想在生产之前对其进行加密的配置文件,当nodejs服务器需要这些文件(在生产中)时,它将解密它们。

我正在使用 crypto.createCipheriv(algo, key, iv) 进行加密。算法是:“aes-256-ctr”。 key 是使用密码创建的:

const key=crypto.createHash('sha256').update(String(password)).digest('base64').substr(0,32)

iv 的生成方式为:

const iv = crypto.randomBytes(16)

所以如果我想解密文件,我需要 key 和 iv。我存储用于生成 key (散列)的密码,并将其与用户给定的密码进行匹配,但是如何存储和检索 iv?

当我将 iv (使用 fs.writefile 和 iv const)写入文件并尝试读取它时,当我尝试解密时,我看到错误:

Error: Invalid key length

即使当我在服务器中生成并使用 iv 时,它的加密/解密也没有任何问题。

所以我的问题是:如何存储我使用的 IV 以便稍后解密文件?稍后尝试解密时如何使用它?

是否有更好的方法/实践来加密配置文件并解密它们? 我想为我的应用程序提供加密/散列的个人数据,例如配置数据、用户/密码等。

我的方法是好的还是方向错了?我将感谢一些精通加密的用户可以帮助我......

谢谢

最佳答案

So my quetion is: How do I store the IV that I used in order to decrypt the files later? How do I use it later when trying to decrypt?

您可以将 IV 存储为密文的预填充部分。解密时,先读取iv,然后解密其余部分

示例:

base64(iv)+'.'+base64(encrypted_data)
base64(iv + encrypted_data)
...

Is there a better way/practice to encrypt configuration files and decrypt them?

SO 上有很多关于此的问题/答案。加密配置文件的问题在于应用程序需要手头的解密 key 。因此,一旦有人访问服务器,他也可以访问解密 key 。但至少您不会将配置凭据留在显眼的地方。

理论上 - 可以使用 TPM 来加密加密 key 本身,但我不知道您是否可以在 NodeJS 中使用 TPM,并且您的应用程序将绑定(bind)到特定的主板(通常您不希望那个)。

I want to serve my app with encrypted/hashed personal data, such as configuration data,

要将数据传递给应用程序,只需使用 SSL。不要用自己的自定义加密使其复杂化。您仍然可能想要加密静态数据(存储在文件或数据库中),这就是加密应该发生的地方。

user/password etc.

永远不要存储用户密码。甚至加密。验证用户身份的正确方法是 salted slow hash 。这不是最佳的事件,但它是我们拥有的最好的事件。

关于javascript - 如何在nodejs的createcipheriv中存储用于创建密码的iv,以供将来解密?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53829872/

相关文章:

html - 如何使用node.js单击提交按钮后将响应发送到同一html页面

iphone - 无法解密通过 iPhone 上的 OpenSSL 编码的数据

用户首次访问页面时使用 JavaScript LightWindow 而不是弹出窗口

node.js - 使用 async/await 在 firebase 中运行查询

javascript - expressJS : No overload matches this call 的 TypeScript 错误

c# - 尝试导出 X509 私钥的 RSAParameters 时出现 CryptographicException "Key not valid for use in specified state."

ruby - 为什么我不能使 "OpenSSL with Ruby"和 "Command line OpenSSL"互操作?

c# - 我的按钮没有回发?我将它与 Javascript 绑定(bind)在一起,而 Javascript 又与 div 绑定(bind)在一起

javascript - 如何同步更多的gif图片?

javascript - 没有 Node 的 Require.js 优化?