AEADs不應該用於一次加密大量數據。該API旨在阻止這一點。
在單個操作中加密大量數據意味着:a)所有數據都必須保存在內存中,或者b)API必須以流方式運行,方法是返回未經驗證的明文。
返回未經身份驗證的數據是危險的,它是not hard找到因特網上的人建議諸如gpg -d your_archive.tgz.gpg | tar xz
之類的事情,因爲gpg命令還提供了流式接口。
對於像AES-GCM這樣的結構,當然,如果應用程序不處理 驗證它, 可以隨意操作明文。即使應用程序謹慎 不建議將純文本「發佈」爲用戶界面,直到建立真實性 ,流式設計將暴露更多程序攻擊面。
通過標準化大密文和流API,下一個 協議更有可能使用它們而不會意識到問題並因此問題依然存在。
優選地,明文輸入將被分成合理大的部分(比如16KiB)並分開加密。塊只需要足夠大,以致額外的驗證器的開銷可以忽略不計,即 。通過這樣的設計,可以逐步處理大量消息,而不必處理未經驗證的明文,並且可以更安全地使用AEAD API。 (且不說更大的消息可以 因爲AES-GCM加工爲一體,具有64GiB限制爲單個 明文。)
需要一些想法,以確保組塊處於正確 順序,即通過計數nonces,第一個塊應該是第一個,即通過在零處開始亂碼,並且最後一個塊應該是 最後,即通過附加具有特殊 附加數據的空白終止塊。但這並不難。例如,請參閱miniLock中使用的組塊。
即使有這樣的設計,攻擊者仍然可以導致消息被可檢測地截斷。如果你想瞄準更高的目標,可以使用全有或全無轉換,儘管這需要兩個輸入的 通過,並不總是可行的。
來源
2016-09-12 16:55:19
agl
謝謝!作爲一個建議,我認爲這個解釋可以添加到golang文檔中。 –