在 AES-GCM 中對經過身份驗證的數據使用數據雜湊而不是完整的原始數據
我正在序列化 JSON 對象,並且想加密一些值。我打算用 AES-GCM 來做這件事。
我還想確保整個對象的完整性。
這些要求是對整個對象的完整性、某些值的機密性以及對其他值的明文要求。
有少量已知的頂級鍵。
例如,如果我的“純文字”JSON 對像是
{ "id":"823623672", “地址”: { "line1": "2000 百老匯", "line2": "紐約", “郵編”:“12345” }, “電話”:“+1 212 555 1234”, “最後訪問”:1543946340 }
我希望“加密”對像類似於
{ "id":"823623672", "地址": "URAVvDTOrovXBehz2ms8ej9BRCaKdx8LsmuA81IkESM=", “電話”:“0gAtx7Hh/kPD7chfNGy90A==”, “最後訪問”:1543946340 }
現在,我可以輕鬆地對 and 進行序列化
address
和telephone
加密,並提供 and 的值id
作為last-accessed
關聯數據。但是,我將使用的實際對象將在“不加密”密鑰中包含更多數據。
因此,我不想直接使用和的值作為關聯數據,而是對這些值進行雜湊處理並將雜湊值用作關聯數據
id
。last-accessed
(可能是 SHA-512/256,如果重要的話。)要解密,我將從輸入數據重新創建相關數據(雜湊),然後解密每個加密密鑰;如果任何解密失敗,則整體解密失敗。
(並且使用散列意味著我可以使用散列“更新”與已知鍵的值一個接一個地創建關聯數據,而不必創建一個將所有值連接起來的單個連續數據項。在這種情況下,我會散列 823623672 然後 ‘\0’ 然後 1543946340 然後 ‘\0’;分隔符是為了確保攻擊者不能將
id
82362367 和last-accessed
21543946340 更改為例如。)(我不必擔心攻擊者添加額外的頂級密鑰;具有語義重要性的密鑰將在關聯的數據/散列中。)
在我看來,使用雜湊不應該削弱加密的安全性,但我想檢查一下。
使用散列而不是完整數據會削弱加密的安全性嗎?
如果我對您的理解正確,您將對身份驗證所需的所有內容進行雜湊處理並將其包含在 AAD 中。只要散列是安全的抗衝突散列函式,這將是安全的。但是,我不明白你得到了什麼。您可以在 AAD 中計算所有這些數據,但只發送重建所需的數據。這樣,您不必儲存/發送超出需要的任何內容。另外,GCM 認證器其實比 SHA256/SHA512 快很多,所以效率也會更高。