Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.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
Javascript 如何在nodejs'中存储用于创建密码的iv;s createcipheriv,用于将来的解密?_Javascript_Node.js_Encryption_Initialization Vector_Node Crypto - Fatal编程技术网

Javascript 如何在nodejs'中存储用于创建密码的iv;s createcipheriv,用于将来的解密?

Javascript 如何在nodejs'中存储用于创建密码的iv;s createcipheriv,用于将来的解密?,javascript,node.js,encryption,initialization-vector,node-crypto,Javascript,Node.js,Encryption,Initialization Vector,Node Crypto,我对密码学是新手,我正在使用nodejs为一个应用程序提供服务 我的应用程序使用我想在生产前加密的配置文件,当nodejs服务器需要这些文件(在生产中)时,它将解密它们 我正在使用crypto.createCipheriv(algo,key,iv)加密。算法是:“aes-256-ctr”。密钥是使用密码创建的: const key=crypto.createHash('sha256').update(String(password)).digest('base64').substr(0,32)

我对密码学是新手,我正在使用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常量)写入文件并尝试读取它时,当我尝试解密时,我看到错误:

错误:无效的密钥长度

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

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

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

我的路是好的还是走错了方向?我会很感激一些精通加密的用户能帮我

谢谢

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

您可以将IV存储为密文的预标部分。解密时,您应阅读iv,然后解密其余内容

示例:

base64(iv)+'.'+base64(encrypted_data)
base64(iv + encrypted_data)
...
是否有更好的方法/实践来加密和解密配置文件

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

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

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

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

用户/密码等


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

将iv和加密数据base64存储在一个字符串中。例如,
base64(iv)+.+base64(加密数据)
base64被认为是安全的吗?@yishain11安全的原因是什么?Base64是编码(不同的表示),而不是加密(请研究差异)。Base64是一种将二进制数据存储为string@gusto2我应该对数据库中的数据加密两次还是一次就足够了?我使用的是aes 256cbc@kd12345加密两次没有意义。如果加密一次会有任何已知的弱点,那么即使加密100x也不会有帮助。