注意:令牌是指詞彙令牌,而不是加密令牌。例如,代幣器可能會變成“學習”,“學習”,“學習”全部進入令牌“學習”。
如果您不需要加密,則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。鑑於在語言中看到的冪定律類型分佈,其中排名前一百的單詞可以構成一半的頻率,因此實際的節省將大大降低。