為了真實性目的,如何提高標準校驗和的長期持續時間?
政府公報的官方CMS(在第三世界),需要在紙、CD、DVD 等永久支持介質中發布每篇文章和每個引用的外部文件(例如全文契約)的校驗和。而且,這作為幾十年的法律證據是有效的……
但是校驗和在幾十年內都無效,在這種情況下計算校驗和的 CPU 成本並不是第一個問題……所以,問題是
如何在對現有工作流程影響最小的情況下改進標準校驗和?
範例:(
所以替代問題是“什麼是最好的?”或“為什麼不呢?”)
- 使用“最好中的最好”的截斷形式(例如,截斷的 SHA256 代替 SHA1)。
- 使用兩個校驗和,而不僅僅是“最好的”(例如 SHA1+MD5)。
- 使用兩個校驗和,第二個在一些“文件轉換”之後,例如 gzip、imagemagick(例如 png2jpg)、一些 pandoc(例如 pdf2text),它保留了主要內容。
背景和解釋
SHA1 是一種加密雜湊,已被用作校驗和,目的是為了完整性和真實性……所以,問題的背景是這種 使用加密校驗和來驗證真實性的傳統,傳統沒有替代品,請不要堅持:-)
讓我們將這個傳統及其使用的方法命名為*“真實性校驗和” 。*
上週,該主題在第一次實際攻擊中獲得了更大的吸引力,發現了一種算法,該算法可以使用與其他不同 PDF 相同的 SHA1 建構 PDF 文件……您可以在 Linux 終端中自行檢查:
wget -c https://shattered.io/static/shattered-1.pdf wget -c https://shattered.io/static/shattered-2.pdf # open each file with your PDF-viewer, see how much distinct they are. sha1sum shattered-1.pdf shattered-2.pdf # 38762cf7f55934b34d179ae6a4c80cadccbb7f0a shattered-1.pdf # ... # look at your terminal! the same SHA1 for both files!
SHA1 於 1995 年由NIST作為標準發布,在 2000 年代得到普及和強化。第一次真實和公開的攻擊是在上週,即 2017 年(當時標準是 22 歲)。第一次發表的“理論上的攻擊”展示是在 2005 年,即發射 10 年後。
MD5 是它的先例,於 1992 年作為 RFC發布,2008 年進行了理論論證,2012 年進行了實際攻擊。它的生命週期也有類似的時間線。
我們可以使用標準的時間線作為良好的時間尺度參考,幾十年和歷史事實(和摩爾定律)作為 SHA256 將存活不到十年的線索。
…因此,關於在重要的數字儲存庫中使用真實性校驗和以及具有數十年背景的數字保存。
想像一張包含大量文件名及其校驗和的CD-ROM ,一張記錄於 2004 年的 CD ,那時我們仍然相信 SHA1 的持久性。對於這個“過去的案例
”,最佳實踐是什麼,我們可以建議改進什麼?(不可能用新標準測試假設,如 SHA256,但我們可以在虛構的案例中,測試舊標準、截斷雜湊和外推結果)
在這種情況下,一個簡單的改變將提高健壯性:包括由多個函式產生的雜湊值。(如果散列數據不是完全公開的,這可能會適得其反,因為即使其他散列拒絕了,一個散列被反轉也會顯示數據。但這里數據是公開的,因此添加額外散列不會降低安全性。)
例如,今天,您應該(至少)同時包含 SHA-256 ( SHA-2 ) 和 SHA3-256 ( SHA-3 ) 雜湊。(如果您願意,也可以選擇其他尺寸,但今天沒有強有力的理由。)選擇 SHA-3 的原因之一是它使用了相當不同的技術(海綿結構,而 MD5、SHA-1 和SHA-2 都使用了Merkle-Damgård結構),因此兩者同時被破壞的可能性很小。
您可以根據keylength.com上的各種權限找到給定保護持續時間的推薦雜湊長度。只要願意提供建議,大多數人都對 256 位雜湊感到滿意。我個人傾向於通過連接 SHA-256 和 SHA3-256 來生成有效的 512 位散列。
對您的系統的主要威脅是抗二次原像(在歸檔後無法篡改法律文件),但**抗碰撞性也是一個問題**:有人可以送出帶有準備好的“陷阱”的文件(例如契約) ”這允許他們在契約簽署後製造碰撞(例如“如果你有藍色契約,你欠我們 1美元,如果你有紅色契約,你欠 1,000,000美元” - 呃 - 哦)。雜湊函式似乎更容易受到碰撞攻擊,即發現 $ M $ 和 $ M’ $ 這樣 $ H(M) = H(M’) $ ,而不是第二原像攻擊,即發現 $ M’ $ 這樣 $ H(M) = H(M’) $ . 例如,MD5 和 SHA-1 已知衝突,但沒有人知道如何找到給定消息的衝突,而不是特製消息(至少沒有人公開說過)。您可以採取以下兩件事來減輕碰撞攻擊:
- 產生碰撞的已知技術需要通過“接近碰撞”狀態來獲取散列函式,這種狀態極不可能自然發生。因此,您可以在散列單個消息時檢測到可能的衝突攻擊!這個想法是由於Marc Stevens和SHA-1 的實現是可用的。
- 為 MD5 或 SHA-1 製作碰撞需要在中間添加一些“垃圾”;垃圾可以隱藏在復雜格式(例如 PDF)的某個微不足道的部分中,或者隱藏在電腦程序的註釋中,但是目前的技術不允許在純文字英文文件之間製造衝突,即使使用 MD5。如果您散列純文字¹ 而不是(或附加於)複雜格式(如 PDF),碰撞攻擊事後很容易檢測到,除非我們對如何製作碰撞的知識有重大飛躍。如果您的輸入不是純文字,這確實需要一個確定的過程來生成純文字。
從長遠來看,唯一可行的解決方案是算法敏捷性:定期使用更新的散列函式重新散列文件。這可以與驗證和更新物理支撐的需要相結合。如果保養得當,紙可以持續幾個世紀或更長時間,但磁帶或 CD 不可能持續這麼久。數據需要經常傳輸到新媒體。該時間點是驗證原件並使用最新算法重新散列它們的好時機。請注意,這需要訪問原件,而普通的中到中傳輸並非如此;您可能不想在每次物理傳輸時都這樣做,但您應該有一個程序。
請注意,雜湊僅保證完整性,而不是真實性。只有一條消息具有給定的散列(只要散列函式沒有損壞),但任何人都可以生成此散列。真實性需要簽名:擁有有效簽名表明持有相應私鑰的某人看到了該文件並願意對其進行背書(取決於簽名者願意簽署文件的條件)。
¹此處,“純文字”是指純文字格式(例如 stragiht ASCII 或 Unicode),MIME 將其歸類為
text/plain
,而不是與密文相反的加密明文。