2

我是密码学新手,我正在使用 nodejs 来提供应用程序。

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

crypto.createCipheriv(algo, key, iv)用来加密。算法是:'aes-256-ctr'。密钥是使用密码创建的:

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

iv 是通过以下方式生成的:

const iv = crypto.randomBytes(16)

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

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

错误:无效的密钥长度

即使当我在服务器中生成和使用 iv 时,它也会毫无问题地加密/解密。

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

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

我的方式是好的还是我走错了方向?我会很感激一些精通加密的用户可以帮助我......

谢谢

4

1 回答 1

4

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

您可以将 IV 存储为预先添加到密文的部分。解密时,您应阅读iv然后解密其余部分

例子:

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

有没有更好的方法/实践来加密配置文件并解密它们?

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

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

我想为我的应用程序提供加密/散列的个人数据,例如配置数据,

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

用户/密码等

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

于 2018-12-18T10:43:21.843 回答