Hash

對加密數據庫的頻率攻擊

  • October 3, 2019

我正在嘗試建構一個我們無法信任數據庫管理器的加密數據庫。而且由於以確定性方式加密數據是不好的,攻擊者可以通過頻率攻擊恢復資訊,我有以下想法:

|Names         |bucket|
|0xF32(Michael)|2     |
|0x321(Simon)  |1     |
|0xG3F(Simon)  |1     |
|0xT2A(Ana)    |1     |

如您所見,Names 以隨機方式加密,並且使用 f(Simon) = 1 的某個函式計算儲存桶;現在如果客戶想要獲取數據庫中的所有 Simons,他將執行 f(Simon) =1 並查詢儲存桶值 = 1 的數據庫。這樣,數據庫將給客戶 Simon 和 Ana 的值。並且客戶將丟棄安娜。這樣,數據庫將不知道西蒙對應的是什麼值。

我的主要問題是獲得一個函式的方法,它會給我帶來碰撞但不是很多。

問題

頻率攻擊是數據庫的一個大問題。例如,這兩篇1 2文章代表了CryptDB中的攻擊。這可能會產生嚴重的後果,特別是如果您認為加密就足夠了。如果您搜尋,您可以找到更多關於頻率攻擊的資訊。如果您必須查詢加密數據並且不了解列的分佈,則沒有乾淨的解決方案。

先驅工作

Hacıgumüş 等。al 是這方面的先驅;在數據庫服務提供者模型中對加密數據執行 SQL。他們的工作使用將數據分區到桶中。第一列etuple包含以連接形式加密的列,並且這些列被分桶。您查詢儲存桶列並根據返回的查詢結果解密etuple。在第 2.1 節中,您可以找到分區範例函式。

使用雜湊

起初使用修剪過的散列函式似乎是一種解決方案,但不是必需的。我們不受散列函式輸出的控制。列中兩個最頻繁的數據可能具有相同的修剪散列結果。因此需要檢查桶。

另一個不夠的解決方案

有一篇關於我找不到的文章1建議將數據分成大小相等的桶。這項工作需要預先了解頻率。

該技術簡單來說就是將數據標準化到與您的解決方案不同的儲存桶中。例如; 假設我們在具有以下名稱和數量的列中有 5 個不同的數據; $ {(a,5),(b,10),(c,20),(d,40),(e,25)} $ 然後他們提出劃分為最多可以包含 10 個元素的桶;

$$ {(a,5,10), (b,10,10),(c_1,10,10),(c_2,10,10), (d_1,10,10),(d_2,10,10),(d_3,10,10),(d_4,10,10), (e_1,10,10),(e_2,10,10),(e_3,5,10) } $$其中子索引是相同值的不同加密,可以通過每個桶的 CBC 模式的固定 IV 來滿足。

對於查詢,您必須將儲存桶資訊儲存在您的應用伺服器中。等待; 如果攻擊者看到從數據庫返回結果的行數,他們可以辨識出一些桶。例如,如果您查詢 $ a $ 他們可以知道它是 $ a $ 和 $ b $ .


**注1:**如果不仔細分桶,行數也會有類似分桶的結果。對於這一點,可以假設攻擊者在攻擊上的時間有限,並且可以說只有少數查詢可能被洩露。這完全取決於您的風險分析。

**注2:**如果數據的頻率隨時間變化,可能需要重新分桶


1如果有一天我能找到,我會連結。

引用自:https://crypto.stackexchange.com/questions/67338