Rsa

我應該使用 PKCS1 v1.5 還是 PSS 進行 RSA 簽名?

  • March 17, 2021

我正在實現一個應用程序,使用者需要對他們創建的一些數據進行簽名,將其儲存在不受信任的地方,然後檢索該數據並在使用之前驗證它仍然是真實的。使用者已經有一個用於在整個應用程序中進行加密的 RSA 密鑰對,所以我想將它重新用於這個簽名(否則我通常只會使用 HMAC)。

我看到我有兩個可用於 RSA 簽名的方案:PKCS1 v1.5 和 PSS。

  • 我應該使用哪些?PKCS1 v1.5 似乎更容易實現。
  • 我應該注意的每個方案是否存在安全問題?
  • 如果我需要使用 PSS,我應該使用什麼摘要?如果使用 SHA1 是否值得關注?

我應該使用哪些?PKCS1 v1.5 似乎更容易實現。

通常你不應該自己實現這個,有很多庫可以開箱即用地實現這些方案。

用於簽名生成的 PKCS#1 v1.5 填充和 PSS 填充都有我在下面列出的優點和缺點。您決定使用哪一個取決於您。

我應該注意的每個方案是否存在安全問題?

PKCS#1 v1.5 填充具有以下缺點。

  1. 它是確定性的,這不是簽名的要求,在某些非常特定的情況下,這實際上可能對安全性有害。
  2. 它缺少安全證明;PSS 有一個安全證明(對於填充模式,當然不是 RSA 本身)。也就是說,用於簽名生成的 PKCS#1 v1.5 填充並未被破壞(與用於加密的 PKCS#1 v1.5 填充不同,後者確實存在漏洞)。

PSS也有缺點:

  1. 實現起來更複雜;
  2. 它絕對不像 PKCS#1 v1.5 填充那樣普遍——可能是因為 PKCS#1 v1.5 填充更舊並且沒有被破壞;
  3. 它需要配置(在簽名生成和驗證期間)。

如果我需要使用 PSS,我應該使用什麼摘要?如果使用 SHA1 是否值得關注?

如果您將 SHA-1 用作簽名生成的一部分(無論填充模式如何),那麼它絕對是一個問題,因為它不再具有抗衝突性。抗衝突雜湊是簽名生成算法的要求。


PSS 使用另一個散列函式實例進行 PSS 填充,該函式稱為遮罩生成函式 (MGF),該函式執行實際填充。MGF1 是為 PSS 定義的唯一 MGF,而它又需要一個散列來創建 PSS 填充:數據散列值是為 MGF1 輸入的。MGF1 在安全性方面可以與 HMAC 相提並論,而 SHA-1 在 HMAC 中仍然是安全的。

因此,如果您僅將 SHA-1用於 PSS 填充中使用的底層 MGF1,則它*不是問題。*當然,對於新協議,您仍然會選擇更安全的加密雜湊函式,例如 SHA-512。

這兩種散列函式算法可以不同於用於數據散列的算法。一些實現預設為 SHA-1,一些預設為數據雜湊算法。出於某種原因,SHA-256 通常是 MGF1 的首選,儘管 SHA-512 對 RSA 更有意義,因為它的輸出大小更大,因此效率更高。如前所述,複雜性是 PSS 的一個缺點——即使在配置算法時也是如此。

MGF1 中使用的散列通常設置為與用於散列消息​​的散列相同的散列,如果您希望與大多數應用程序和庫保持兼容,這可能是最好的。

如果您決定使用 PKCS#1 PSS 填充,請務必記錄用於數據和 MGF1 函式的算法。

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