Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.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
File 加密哈希映射密钥,同时保持恒定的查找速度_File_Security_Encryption_Cryptography - Fatal编程技术网

File 加密哈希映射密钥,同时保持恒定的查找速度

File 加密哈希映射密钥,同时保持恒定的查找速度,file,security,encryption,cryptography,File,Security,Encryption,Cryptography,我想用AES256 CBC分别加密哈希映射的密钥和值。 挑战在于加密密钥,同时保持恒定的查找速度和安全性(主要针对字典攻击) 我读过关于盲索引的文章,但是这些索引在创建时需要一些随机性(salt,nonce),并且查找函数在搜索时不可能重新创建nonce。在查找时,我们需要知道从何处获取特定密钥的nonce,这最终意味着在其他地方容易受到攻击 到目前为止,我只能想到两个选择 首先是不加密密钥,尽管我更愿意这样做 第二个是通过应用如下变换获得盲指数 blind_index(key) = encry

我想用AES256 CBC分别加密哈希映射的密钥和值。 挑战在于加密密钥,同时保持恒定的查找速度和安全性(主要针对字典攻击)

我读过关于盲索引的文章,但是这些索引在创建时需要一些随机性(salt,nonce),并且查找函数在搜索时不可能重新创建nonce。在查找时,我们需要知道从何处获取特定密钥的nonce,这最终意味着在其他地方容易受到攻击

到目前为止,我只能想到两个选择

首先是不加密密钥,尽管我更愿意这样做

第二个是通过应用如下变换获得盲指数

blind_index(key) = encrypt(digest(key))
但这里的问题是,每个密钥加密都需要一个唯一的初始化向量,这让我们再次面临上述问题:使用一个IVs表,以便查找函数能够在搜索时重建盲索引,这将同样的问题转移到了其他地方

对于第二种方法,我的想法是:由于我总是加密唯一值(密钥是唯一的,即使它们是彼此的子字符串,例如“awesome”和“awesome_key”,它们在加密之前是散列的,因此它们在“散列和未加密”形式中看起来非常不同),我可以对所有加密使用全局IV,查找功能可以很容易地访问它。由于查找功能需要加密密钥,因此只有所有者才能正确计算盲索引,并且在映射本身中,明文中相似的密钥之间没有可见的相似性

第二种方法的一个大问题是,它违反了从不将IVs用于多个加密的思想。我可以混淆IV“使其更安全”,但这又是一个坏主意,因为IV应该是纯文本的

有关情况的更多详情:

  • 移动应用程序
  • 地图将被转储到一个文件中
  • 可以通过RESTAPI访问映射以进行查找
也许我应该使用不同的算法(例如EBC)


提前谢谢

这完全属于格式保留加密(FPE)领域。然而,应用它很困难,处理好它的库也不常见。FPE获取一定数量的位,甚至一个范围,然后返回相同大小或相同范围内的加密值。该密文在给定域中是伪随机的,只要输入值是唯一的(对于哈希表中的键,它们根据定义是唯一的)

如果您可以将密文扩展为纯文本,那么您还可以查看SIV模式(AES-SIV或AES-GCM_SIV,更易于处理。它们返回一个字节数组,例如通过使用base64编码,可以将其转换为
字符串
。否则,您可以包装字节数组,并提供自己的
equals
hashCode
方法。请注意,这些方法可以相对显著地扩展明文;它们是认证模式。优点:IV是从输入中计算出来的,输入的任何变化都会使密文再次随机化

最后,您当然可以简单地使用IV或nonce生成密文并将其作为值的前缀。但是,请注意,使用相同的IV重新加密更改的值将非常危险,因为您可能会通过重复泄漏信息。在某些模式下,这可能会完全破坏提供的机密性。因此,您必须防止IV的重复使用


当然不建议对字符串使用ECB。如果输入是(或可以扩展为)单个块,则单个块加密当然可以工作。

这完全属于格式保留加密(FPE)领域但是,应用它很困难,而且处理得很好的库并不是分布在每个洗涤剂包中。如果您可以将密文扩展到纯文本,那么您还可以查看SIV模式,它更易于处理(包装您的字节数组并提供快速的
hashCode
)。顺便说一句,对于这些与协议/用例相关的问题,我更喜欢security.stackexchange.com。@MaartenBodewes谢谢你,我会检查你的建议。至于未来,我将使用security.stackexchange.com来回答这些问题,正如你所说。@MaartenBodewes在阅读了维基百科关于它的文章后,我倾向于相信这一点FPE是我确实可以使用的东西。我也会检查SIV,但总的来说,我认为这两个是正确的解决方案,所以如果你这样发布的话,我很乐意接受这个答案。可以找到全面的FPE实现