使用 AES 加密十進制值
我在數據庫表中有一個名為“Amount”的列,它將儲存使用 AES 加密的十進制值。表中的多行中很可能存在相同的數量並使用相同的密鑰進行加密。此外,大多數將被加密的明文值都小於 5000。是否有任何特定因素我需要考慮或意識到可能會影響這種情況下的安全性,而不是我儲存一些其他數據類型(例如具有唯一和不可預測值的字元串)的情況?更具體地說,我想知道這種情況是否容易受到已知的明文攻擊。
您通常不會僅使用 AES 加密任何內容。AES 是一種分組密碼,需要使用適當的操作模式才能安全地加密一般數據。
一般而言,有兩種操作模式:傳統模式,如 CBC、CFB、OFB 和 CTR,僅保護數據免受竊聽對手的被動攻擊,以及保護數據免受主動篡改的身份驗證模式。雖然傳統的操作模式可能足以滿足您的特定需求,但我的建議是盡可能使用經過身份驗證的模式,例如 AES-SIV。它更安全,沒有真正的缺點。
在任何情況下,只要您使用具有安全操作模式的 AES,具有該模式要求的隨機和/或唯一 IV/nonce,並遵守任何其他相關約束,例如使用單個加密的明文的最大數量AES 密鑰(例如高達 $ 2^{48} $ AES-SIV 的明文),並註意對 AES 密鑰保密,那麼您就可以免受任何已知的明文(或者,對於經過身份驗證的模式,甚至是選擇的明文)攻擊。有關詳細資訊,請參閱您選擇的操作模式的定義和任何相關標准文件(例如RFC 5297 for AES-SIV)。
**附言。**許多分組密碼操作模式列表,例如我上面連結到的維基百科頁面,也包括“ECB 模式”。這種模式的存在是為了提供對底層分組密碼的直接訪問,除了實現其他操作模式(或 MAC 或其他類似的基於分組密碼的密碼算法)外,通常不應使用此模式。特別是,它通常不能抵禦已知明文攻擊。
在您的特定案例中,所有要加密的消息都由小數字組成,您可以定義各種自定義方案,這些方案可以提供已知明文甚至選擇明文攻擊抵抗力,而無需使用傳統的操作模式(從而可能避免他們需要的少量儲存成本)。
例如,您可以將數字編碼為 64 位整數,將每個整數與唯一的 32 位 nonce 值(理想情況下,該數字所屬的數據庫行的唯一 ID)和固定的 32 位檢查字元串(例如全零),並使用原始 AES 塊密碼(即“ECB 模式”)加密生成的 128 位塊。這將產生一個 128 位的密文,它保證是唯一的(只要你所有的 nonce 都是不同的),它與它所屬的數據庫行相關聯(通過 nonce),以便從一行移動加密值到另一個總是可以被檢測為偽造,並且即使無法檢查隨機數,它也能很好地抵抗偽造攻擊(因為偽造的密文只有一個 $ 1/2^{32} $ 解密為具有正確校驗值的東西的機會)。
然而,雖然這樣的方案確實應該是安全的,但我通常不會推薦它,因為它沒有標準化(因此需要額外的實施工作和額外的安全審查)並且缺乏標準操作模式的靈活性。
特別是,使用 AES-SIV(以行 ID 作為 nonce)實現了相當的安全級別,需要不到兩倍的儲存空間(128 + $ d $ 位,在哪裡 $ d $ 是被加密欄位的大小),並允許您將密文與任意關聯數據(例如列名、時間戳、事務 ID 和/或任何其他相關的未加密元數據)連結,並使用相同的方法加密其他數據任意類型和大小。它也是許多加密庫提供的標準結構,希望任何審查您的設計的人都熟悉它。