Encryption 确定性加密-从密码密钥生成IV

Encryption 确定性加密-从密码密钥生成IV,encryption,cryptography,Encryption,Cryptography,我需要加密文件和目录名/路径,但我需要加密是确定性的。我需要与云存储提供商同步本地文件,因此我不能使用概率加密 知道在加密文本时不应使用静态IV,这是一种可接受的解决方法: 通过scrypt运行密码短语并存储结果输出 从scrypt获取结果输出并对其进行散列(例如使用MD5) 取散列的前16个字节,并将其用作IV来加密目录和文件名 我唯一能想到的是: 使用概率加密 从云服务提供商和本地目录读取目录/文件结构 将所有加密的云提供商名称与其解密值映射 将所有加密的本地名称与其解密值映射 基于上

我需要加密文件和目录名/路径,但我需要加密是确定性的。我需要与云存储提供商同步本地文件,因此我不能使用概率加密

知道在加密文本时不应使用静态IV,这是一种可接受的解决方法:

  • 通过scrypt运行密码短语并存储结果输出
  • 从scrypt获取结果输出并对其进行散列(例如使用MD5)
  • 取散列的前16个字节,并将其用作IV来加密目录和文件名
我唯一能想到的是:

  • 使用概率加密
  • 从云服务提供商和本地目录读取目录/文件结构
  • 将所有加密的云提供商名称与其解密值映射
  • 将所有加密的本地名称与其解密值映射
  • 基于上面找到的映射进行同步

唯一的问题是,在使用不同的云服务提供商时,这非常耗时,而且很难实现。

为了安全地加密数据,您需要为每条消息使用不同的密钥/IV对。如果你不这样做,你会泄露很多关于加密的信息,而且它会变得非常脆弱。但是,如果您有一个从不重复的递增计数器,则不太难做到:

  • 生成一个随机salt(32字节)并将其与其余数据一起存储。这是公开的
  • 将计数器的当前版本作为32位或64位整数
  • 在密码短语中使用scrypt,对于salt,将salt和计数器连接起来。取出足够的字节,用于密钥和IV
  • 使用生成的密钥和IV加密文件或目录名(如果可能,最好使用AEAD,如AES-GCM或ChaCha20-Poly1305)。将计数器前置为整数
  • 递增计数器并存储新计数器
只要每次使用不同的salt,使用诸如scrypt之类的密钥派生函数来生成密钥和IV是安全的。通过生成一个可用于整个项目的随机盐,然后附加一个计数器,您生成的盐与其他人使用的盐既不同又不同。仅仅使用计数器是不够清晰的

您提出的想法将为每个文件名加密使用相同的密钥/IV对,这将很弱。无论您如何生成相同的密钥/IV对,使用相同的密钥/IV对都会很弱。在我上面的建议中,您也决不能重用计数器,否则您将从scrypt生成相同的密钥/IV对。不过,如果更改随机盐,您可以重复使用相同的计数器


请注意,您应该避免出于任何原因使用MD5。SHA-256或BLAKE2b在所有情况下都是更好的选择。

为了安全地加密数据,您需要为每条消息使用不同的密钥/IV对。如果你不这样做,你会泄露很多关于加密的信息,而且它会变得非常脆弱。但是,如果您有一个从不重复的递增计数器,则不太难做到:

  • 生成一个随机salt(32字节)并将其与其余数据一起存储。这是公开的
  • 将计数器的当前版本作为32位或64位整数
  • 在密码短语中使用scrypt,对于salt,将salt和计数器连接起来。取出足够的字节,用于密钥和IV
  • 使用生成的密钥和IV加密文件或目录名(如果可能,最好使用AEAD,如AES-GCM或ChaCha20-Poly1305)。将计数器前置为整数
  • 递增计数器并存储新计数器
只要每次使用不同的salt,使用诸如scrypt之类的密钥派生函数来生成密钥和IV是安全的。通过生成一个可用于整个项目的随机盐,然后附加一个计数器,您生成的盐与其他人使用的盐既不同又不同。仅仅使用计数器是不够清晰的

您提出的想法将为每个文件名加密使用相同的密钥/IV对,这将很弱。无论您如何生成相同的密钥/IV对,使用相同的密钥/IV对都会很弱。在我上面的建议中,您也决不能重用计数器,否则您将从scrypt生成相同的密钥/IV对。不过,如果更改随机盐,您可以重复使用相同的计数器


请注意,您应该避免出于任何原因使用MD5。SHA-256或BLAKE2b在所有情况下都是更好的选择。

如果使用计数器,则有必要列出所有文件,以确定哪个文件具有哪个计数器值。如果时间推移,将删除一些中间值并添加附加值。不能更改仍然存在的文件的计数器值。虽然这是一个很好的解决方案,但它要求在远程计算机创建任何文件之前与所有计算机共享salt。如果出于某种原因,Comp1创建了一个新的salt和新文件,但无法访问internet,因此无法同步到云。然后Comp没有看到公共salt或文件,因此它还创建了一个同名的salt和文件。现在,当两人上网时,他们都有不同的公共盐。另外,我相信这也会导致计数器重叠。这是一个很好的建议,可能对某些人有效,但不幸的是,它在我的情况下不起作用。在我的建议中,计数器在加密文件名之前,因此它可以从数据中恢复,因此不必列出所有文件。但是,为了安全地使用密码短语进行加密,您需要一个不可预测的salt,除非该密码短语是CSPRNG(编码或其他)的输出。您可以尝试为每个节点生成一个salt,并为此使用一个计数器(您需要