Authentication

OpenPGP 中的修改檢測程式碼 (MDC) 有什麼作用?

  • November 1, 2021

在現代密碼系統中,身份驗證通常由 HMAC 完成。MDC 在 OpenPGP 中究竟做了什麼?它是軟體破解還是算法身份驗證?

另外,當未檢查 MDC 時,如何強制 GnuPG 在錯誤時停止?現在它發出警告並解密。這是最近一次襲擊的基礎。

MDC 在 OpenPGP 中究竟做了什麼?

MDC 代表修改檢測程式碼。這是一個密碼領域,旨在檢測加密資訊是否被部分篡改。

為什麼是部分?因為這是非對稱加密中可實現的最佳目標,在這種情況下,攻擊者總是有可能更改整個消息(因為加密不需要秘密,只需要接收者的公鑰)。

那麼,如果我們不能檢測到全部篡改,為什麼檢測部分篡改很重要呢?例如,如果對手知道一條消息會像

connect with password nebulaergpaaelia to the website https://acme.com

並可以將其更改為

connect with password nebulaergpaaelia to the website https://acne.com

那麼已經註冊了域名acne.com的對手就有機會通過接收者的行為來攔截密碼。因此需要一個MDC。

OpenPGP(對於大多數密碼和所有最近的密碼)提供了有效的 MDC。問題是:

  • 有沒有 MDC 的傳統加密模式。因此,如果解密工具允許這些遺留密碼,它必須接受在沒有 MDC 的情況下工作。
  • 帶有 MDC(我知道)的 OpenPGP 加密模式僅在消息結束時檢測消息更改¹。但是解密工具通常可以用作管道,在 MDC 檢查之前吐出解密的消息。這符合通用的 Unix 管道設計模式,對提高效率很有用。
  • 通常,使用 OpenPGP 的一段程式碼會作用於解密的消息,而與稍後進行的 MDC 檢查無關。例如,當密文是帶有嵌入 URL 的 html 時,僅僅嘗試顯示它就可以觸發攻擊者可以觀察到的動作,從而允許攻擊。

在 OpenPGP 中如何實現(或不實現)MDC 取決於算法。問題中沒有提到任何內容,因此我不會深入探討細節。

未檢查 MDC 時如何強制 GnuPG 在錯誤時停止?

現代版本(根據原始碼為 2.2.8 及更高版本)預設情況下會失敗。如果 MDC 檢查失敗,它應該抑製文件輸出(但如果輸出通過標準輸出則不能)。通過命令行或通過精心設計的 GUI 使用 GPG 時,為了安全起見,所有必要的事情就是

  • 避免顯式禁用 MDC 檢查(請注意,--ignore-mdc-error可以在手動或通過 GUI 設置的各種文件中將其設為永久選項)。
  • 並將解密輸出到命名文件(而不是使用> outputfile或管道)或在確保工具的返回碼為 0 之前避免使用解密的輸出。

¹ 可以想像,加密模式可以將大消息拆分為具有最大大小的塊,每個塊都有一個 MDC,因此使用有界中間儲存的解密程序只有在檢查 MDC 證明該塊未被更改並且是以適當的順序。這會更安全,但更複雜,並且會在一定程度上增加密文的大小。我不知道它用於 OpenPGP。

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