Node.js 这是存储第三方密码的双密钥加密的安全方法吗?

Node.js 这是存储第三方密码的双密钥加密的安全方法吗?,node.js,encryption,Node.js,Encryption,我正在构建一个连接到第三方api的系统,我必须为每个连接到该api的用户存储密码。我需要确保密码被安全地存储,所以我不想信任用户的密码作为加密密钥。但是我还需要确保我们需要用户通过输入他们的密码来验证这个密码的使用 我的想法是通过将用户的id和密码与服务器上的密钥相结合来创建密钥(只需将它们全部连接起来)。然后,我使用带有aes256的加密和新生成的密钥加密第三方密码并将其发送到存储器 我注意到createCipher文档中的文字说: 根据OpenSSL关于使用pbkdf2而不是EVP_Byte

我正在构建一个连接到第三方api的系统,我必须为每个连接到该api的用户存储密码。我需要确保密码被安全地存储,所以我不想信任用户的密码作为加密密钥。但是我还需要确保我们需要用户通过输入他们的密码来验证这个密码的使用

我的想法是通过将用户的id和密码与服务器上的密钥相结合来创建密钥(只需将它们全部连接起来)。然后,我使用带有aes256的加密和新生成的密钥加密第三方密码并将其发送到存储器

我注意到
createCipher
文档中的文字说:

根据OpenSSL关于使用pbkdf2而不是EVP_BytesToKey的建议,建议开发人员使用crypto.pbkdf2()自行派生密钥和IV,并使用crypto.createCipheriv()创建密码对象

我阅读了有关IVs和它们要防止的攻击的内容(仍然对它的工作原理非常困惑,尤其是在我的用例中),但我认为,从技术上讲,每次都会使用不同的密钥,这将不是问题


这是犹太教的吗?该系统是否存在我所缺少的漏洞?

您仍然应该使用IV,只需在每次加密时随机选取一个,并将其预编到密文中即可。它不需要隐藏。您可能应该加密两次,而不是从另外两个密钥生成密钥。用第一个密钥加密一次,再用第二个密钥加密一次。因此,您可以肯定,您的系统至少与仅使用其中一个密钥一样安全。我是否应该在两个加密步骤中使用相同的IV?不。使用两个不同的IV。抱歉,我无意冒犯您。是的,PBKDF2用于密钥,而不是IV。如果IV不是随机的,则它是无用的,因此每次加密时都应该使用CSPRNG生成IV。如果你愿意,你可以用静态盐。您没有使用PBKDF2对密码进行散列,因此这并不重要。如果您将IV用作PBKDF2的盐,则可能会遇到一些异常交互(您必须以正确的顺序生成和使用它们)。通常,最好不要将参数与您正在使用的每个密码系统重叠。您有两个PBKDF2应用程序,然后是两个AES应用程序。最好不要在每个参数之间重复任何参数,因为这样可以消除任何意外的交互。