我正在开发一个与位于VPS上的数据库通信的应用程序。 我需要在我的数据库中存储使用AES-256加密的信息。
如果我更正,当我加密时,会产生一个IV参数,该参数对于每次加密都是不同的。但是当我解密时,我没有这个参数,因为我只有DB中的密钥和加密文本。
我该怎么做才能解决这个问题?
答案 0 :(得分:3)
您必须将初始化向量存储在某处。因为,从概念上讲,在CBC模式中,IV是"第0"密文块,有些人将其存储为密文的前缀。但是,大多数低级别的解密库并不期望这样,因此应用程序通常需要提供一个包装器来处理加密后添加此前缀并在解密之前将其删除。
理想情况下,您应该使用一些元数据存储加密值,这些元数据指定所使用的加密算法,所需的任何参数,并指示使用的是哪个键(注释如下!)。这将包括使用CBC的分组密码的IV。标准格式是加密消息语法或PKCS#7。因为它是一个标准,所以你可能会有一些开源库来处理这种格式。
通过包含此元数据,您可以执行诸如随时间旋转密钥或将数据迁移到新算法之类的操作。您不必使用相同的密钥以相同的方式加密每个值。
注意:当我说元数据表示使用的密钥时,这并不意味着密钥本身也包括在内!对于预共享密钥,它只是一个标签,告诉您大密钥环上的哪个密钥将解密有效负载。对于基于密码的加密,将提供有关如何从隐含密码派生正确密钥的信息。
答案 1 :(得分:1)
您可以将IV与密文(其长度已知且常量)连接,或者您可以将它们彼此相邻地存储在数据库中。 IV不是秘密;它只是确保按加密方式对块密码进行不同的初始化,以便强制执行一个文件解密不会影响所有其他文件。