生成 RSA 密鑰對並僅儲存私鑰 PKCS#11
我注意到 PKCS#11 支持
C_GenerateKey
對稱密鑰的功能,而不對稱密鑰只有C_GenerateKeyPair
功能。所以從定義來看,這讓我們只創建兩個private-key/public-key pair
. 據我了解,私鑰儲存公鑰資訊(模數和公鑰),這是創建公鑰所需的,因此每次都可以獲取它來生成公鑰。對於我的使用,我只需要令牌儲存中的私鑰,並且在將來使用之前不需要公鑰。
如果我只儲存私鑰並在每次需要時生成公鑰,是否有任何缺點?
最明顯的:性能。
我知道 SPHINCS+ 是一個例子,從私鑰生成公鑰的成本特別高,可能還有其他方案確實如此,但我不知道。
此外,由於我們正在談論的是 PKCS#11 硬體,並且我們現在已經提到了基於雜湊的無狀態簽名 SPHINCS+,我們還應該提到 NIST 已經批准了 XMSS 和 LMS基於狀態雜湊的簽名的硬體實現。
您的方法只能應用於 RSA,並且僅當您使用根據 PKCS#11 版本 >= 2.40 生成的密鑰時。PKCS#11 標准定義(3.0 基本規範中的第 2.1.3 節“RSA 私鑰對象”):“對 2.40 版有效,令牌還必須儲存 CKA_PUBLIC_EXPONENT。”
因此,您可以獲取模數和公共指數屬性 (C_GetAttributeValue) 並使用 C_CreateObject 從它創建一個公鑰對象。但正如 DannyNiu 指出的那樣,這肯定會犧牲性能。
根據令牌,您可能能夠使用私鑰對象而不是公鑰進行 C_Encrypt* 或 C_Verify* 等操作,因為令牌將只使用公共屬性。
對於其他非對稱密鑰,例如。EC 密鑰,在 PKCS#11 標準中沒有類似於 RSA 的定義。因此,不會儲存任何公共部分。如果公鑰是動態計算的(確認康拉多的評論),這將取決於令牌。這肯定會產生更高的性能影響。如果令牌沒有自動執行,則無法觸發從 PKCS#11 中的私鑰計算公鑰。當然,您永遠不應該在外部執行此操作 - 如果您在外部直接使用私鑰,為什麼還要使用令牌(HSM)呢?
最後,如果您使用標準應用程序,您的方法可能會失敗,因為應用程序在查找要使用的公鑰時,通常會將 CKA_CLASS=CKO_PUBLIC_KEY 添加到搜尋模板中。