Signature

生成 TLS 1.3 CertificateVerify 消息時應該使用什麼鹽?

  • May 11, 2021

在簽署握手消息摘要時,MGF1 函式採用與摘要相同長度的鹽值。但是鹽的緩衝區中必須有什麼內容?

我探索了 libnettle 的原始碼,特別是方法rsa_pss_sha256_verify_digest,發現裡面使用的 salt 是 32 個相似字節 - 0x22。使用這個值,我可以自己生成一個有效的簽名。但是我在任何文件中都沒有找到有關鹽的資訊。它是如何為 TLS 1.3 CertificateVerify 消息實際生成的?這個值是固定的還是取決於證書或密鑰……?

鹽應該是隨機生成的。這就是PSS 編碼的定義方式:鹽長度是一個輸入,編碼過程會生成一個指定長度的隨機鹽。PSS 驗證過程將從簽名中讀取的鹽值視為輸入,該輸入可以是預期長度的任意字元串。

TLS 1.3 規範規定鹽長度必須等於散列的長度。(這與用於散列輸入和 MGF 的算法相同——PSS 建議使用相同的散列,而 TLS 1.3 強制要求這樣做。)PSS 本身允許更長和更短的鹽,但使用散列長度非常常見,即使在其他上下文中也是如此比不強制使用鹽長度的 TLS 1.3。PSS 的安全證明是基於這種常見的選擇,但據我所知,使用更短的、甚至是空的鹽或非隨機鹽沒有已知的弱點。

為 PSS 選擇非隨機(或太短)的鹽可以揭示消息,因為它使消息可以從簽名中猜出。這不是 TLS 握手的問題,因為消息本身包含隨機輸入 (ClientHello.randomServerHello.random)。

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