注意:令牌是指词汇令牌,而不是加密令牌。例如,代币器可能会变成“学习”,“学习”,“学习”全部进入令牌“学习”。
如果您不需要加密,则tantivy在各个方面都更好。
使用Dioxus和Anron电子邮件集的基本GUI演示可在我的GitHub上找到。主要是为了证明搜索速度对于存储在客户端应用程序上的数据集而言是不错的。
这仍然是一项正在进行的工作。在实施,概念上或其他方面,没有保证该库或其依赖关系。从未进行过安全审核。自行使用。
搜索或索引中的每个关键字都被标记化。此令牌名称及其出现在其中的表格,用Blake2B-128哈希,然后在存储或用于查询之前,先用AES-128-ECB进行加密。
Encrypt(Hash(token + table_name))
欧洲央行模式用于加密。欧洲央行会导致相同的明文变得相同,但这并不关心诸如令牌和表名的哈希(Hash of a Hash)的独特价值。这意味着如果在单独的表中发生相同的令牌,则它将具有不同的密文。
文档ID使用AES-128-ECB进行加密。然后,这与32位计数器相关联。
由于文档ID出现多次,并且文档ID的数量远小于128位列举的文档ID,因此可以压缩文档ID。
假设有1,000个独特的令牌 /文档,存储在文档中的代币发生的成本是:
| 文件 | 不优化 | 32位 |
|---|---|---|
| 1000 | 16MB | 4MB |
| 10k | 160MB | 40MB |
| 50k | 800MB | 200MB |
| 100k | 1.6GB | 400MB |
| 250k | 4GB | 1GB |
| 百万 | 16 GB | 4GB |
| 十亿 | 16TB | 4TB |
差异表示序列中的值是它们之间的差异。这会创建可以用更少的位来表示的值,从而可以更紧密地包装。
BitPacking Crate用于128个整数的差异和咬合块。
分类值时,差异最有效,但是在添加订单输入输入时,维护分类和位数的值将需要重新编码所有值。使用与订单值集合一起使用的摊销方法可以通过摊销它们来降低变化的成本。
| 层号 | 包装方案 | 排序 | 差异 |
|---|---|---|---|
| 0 | 无-32位(<128 ints) | 没有任何 | 不 |
| 1+ | BitPacker4x(128 ints) | 在全球上方层上方0 | 是的 |
压缩了大约9,000-10,000个较短的安然电子邮件,使用32位编码的FTS DB大小为235MB。使用摊销的差异和分层的bit包装将其更改为21MB。
删除文件是...昂贵...摊销todo
Todo探索。像RocksDB可记住的或雪橇一样。存储内存中的更改,然后每500ms或达到内存限制时冲洗一次。
Bucket Sort单词由前3或4个字符(不象征化),压缩?并加密。块加密具有带有CBC或GCM(授权加密)的扩散的东西。这意味着自动完成将在3或4个字符后开始。这仍处于概念阶段。
数据完整性是可选的,可以在关闭时间放置数据库文件并存储哈希的加密版本。
加密文档ID没有扩散。添加扩散将需要使用随机生成的IV加密文档ID。这也将使压缩不可能。存储IV将添加每个令牌和文档对(用于AES CBC)的128位。
攻击者没有钥匙可见以下内容:
对于医生办公室的患者清单上的索引,没有钥匙的攻击者可以看到病人的数量和文档中使用的令牌的分布。他们看不到任何明文,例如名称或其他标识符,甚至看不到任何患者的文档ID。他们可以看到两个患者是否共享搜索令牌,但对患者或共享信息是什么。
例如,如果搜索指数仅建立在一个具有通用姓氏(例如越南)的国家的名称上,则您可以进行频率分析,并找出姓氏Nguyen(占越南人口的38%)的可能患者数量。这取决于您的先前(姓氏分布)对手头数据集有效。它也只能对公共名称有效,这是没有识别的,并且不太可能会自信地将包含第二个文件的文件与越南第三大常见的姓氏区分开(Tran为11%,LE为10%)。
一旦将更多信息添加到搜索索引中,例如年龄,家乡,地址,描述等,进行频率分析的能力实际上消失了。
一个问题可能是对存储唯一数据集的替代性,在该数据集中,可以使用大型已知明文数据集的频率分析来表明,除了合理的疑问,给定的设备具有索引数据集。这似乎只会影响威权国家或罪犯的持不同政见者。当设备关闭时,可以通过完整的磁盘加密来减轻这一点。
令d1为具有令牌t1的文档。令t2为一个令牌,其哈希与t1相撞,而不是文档d1的象征。
如果搜索包含t2而不是t1 ,则假阳性在搜索结果中包括其他无关结果,可能会发生d1 。
仅在删除了一个文档的一个碰撞令牌时,才能发生虚假负面因素,只有在搜索结果中省略了相关结果。这将导致另一个令牌也被“删除”。
误报或负面因素仅适用于具有碰撞令牌之一的文档,而另一个碰撞令牌则存在于搜索查询中。这使得如此碰撞的赌注非常低。
对于128位哈希,碰撞的实际风险很小(请参阅Wikipedia上的生日问题)。
64位加密仅导致一些非常大的索引节省的空间节省。英语的单词约为1,000,000个,令牌较少。 6400万位仅为8MB。鉴于在语言中看到的幂定律类型分布,其中排名前一百的单词可以构成一半的频率,因此实际的节省将大大降低。