我應該使用 PKCS1 v1.5 還是 PSS 進行 RSA 簽名?
我正在實現一個應用程序,使用者需要對他們創建的一些數據進行簽名,將其儲存在不受信任的地方,然後檢索該數據並在使用之前驗證它仍然是真實的。使用者已經有一個用於在整個應用程序中進行加密的 RSA 密鑰對,所以我想將它重新用於這個簽名(否則我通常只會使用 HMAC)。
我看到我有兩個可用於 RSA 簽名的方案:PKCS1 v1.5 和 PSS。
- 我應該使用哪些?PKCS1 v1.5 似乎更容易實現。
- 我應該注意的每個方案是否存在安全問題?
- 如果我需要使用 PSS,我應該使用什麼摘要?如果使用 SHA1 是否值得關注?
我應該使用哪些?PKCS1 v1.5 似乎更容易實現。
通常你不應該自己實現這個,有很多庫可以開箱即用地實現這些方案。
用於簽名生成的 PKCS#1 v1.5 填充和 PSS 填充都有我在下面列出的優點和缺點。您決定使用哪一個取決於您。
我應該注意的每個方案是否存在安全問題?
PKCS#1 v1.5 填充具有以下缺點。
- 它是確定性的,這不是簽名的要求,在某些非常特定的情況下,這實際上可能對安全性有害。
- 它缺少安全證明;PSS 有一個安全證明(對於填充模式,當然不是 RSA 本身)。也就是說,用於簽名生成的 PKCS#1 v1.5 填充並未被破壞(與用於加密的 PKCS#1 v1.5 填充不同,後者確實存在漏洞)。
PSS也有缺點:
- 實現起來更複雜;
- 它絕對不像 PKCS#1 v1.5 填充那樣普遍——可能是因為 PKCS#1 v1.5 填充更舊並且沒有被破壞;
- 它需要配置(在簽名生成和驗證期間)。
如果我需要使用 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 函式的算法。