2017-02-27 64 views
4

我使用PKCS11Interop生成密鑰API在HSM中生成了一個RSA公鑰 - 私鑰對。 我想導出密鑰對。在使用GetAttributeValue API讀取屬性時,我使用Findobject API獲取密鑰,API修改ObjectHandle,但我無法讀取密鑰的值。 當我將密鑰的屬性設置爲CKA_EXTRACTABLE爲true時,我無法完全生成密鑰。使用PKCS11interop導出/導入RSA密鑰對來自Thales nShield HSM的c#包裝庫?

另外我需要導入外部提供的HSM密鑰對。

任何幫助,高度讚賞。

+0

當您創建密鑰對時,您是否指定私鑰應該是「可導出的」?您還使用了哪些CSP以及它存儲在哪裏。在某些情況下,您可能無法導出缺少巫術魔法的密鑰(如Mimikatz) – zaitsman

回答

1

您正在做的事情在HSM世界中被認爲是insecure。它違背了HSM的目的。

但是,可以這樣做嗎?是。如果HSM供應商應該支持它。

HSM供應商決定HSM上生成的密鑰是否可以提取,或者是否有任何軟件(HSM外部)生成的密鑰可以導入到硬件中。 PKCS#11只是您與HSM交互的界面。如果HSM不支持某個操作,它將引發一個最終由PKCS11 api拋出的異常。

這就是您的情況在提取和導入操作中發生的情況。您正在嘗試執行這些操作的HSM可能不支持它。因此,您需要與HSM供應商協商如何在他們的產品上執行這些操作。

P.S:Thales nShield應該/可能有一個配置文件,通過它可以在不安全模式下運行HSM。

注意:提取在HSM上生成的(或)導入在HSM外部生成的任何密鑰/密鑰對的Key/Key Pair在現實世界中不被視爲不安全的操作。

+0

我們正在嘗試導出/導入密鑰,以便在HSM失效時保留密鑰的備份。 Thales(KeySafe)提供了一個實用工具,通過它我們可以導出/導入密鑰,因此可以這樣做。你能建議一種通過pkcs11Interop以編程方式進行的方式嗎? –

+0

@Shhosh您正在考慮由實用程序提供的導出和導入密鑰作爲備份機制,這是錯誤的。備份機制是一個巨大的概念,它涉及使用主密鑰對HSM上的數據進行加密,然後將主密鑰分割成多個部分。當從備份副本恢復數據時,您需要再次使用主密鑰。我鼓勵您與泰勒斯聯繫,瞭解如何對其特定產品執行備份。他們應該支持它。如果我沒有記錯,它是符合FIPS標準之一。切勿重新放回你的手中並危及安全。 –

0

我認爲你正在使用的SafeNet HSM因爲泰雷茲HSM不具備這樣的功能像GetAttributeValue,對象句柄等。

CKA_EXTRACTABLE意味着你可以在另外一個關鍵提取您的密鑰,這樣做意味着你可以讀取關鍵數據。如果您只需使用鑰匙柄即可獲得關鍵數據,則應該完全不安全。

即使在功能模塊(FM)中也無法使用ObjectHandle讀取關鍵數據。 FM是專有軟件,只能在Safenet HSM中運行,它是運行HSM硬件的嵌入式軟件。您可以使用ObjectHandle來調用特定的HSM功能,如FM中的加密和解密。 提取密鑰只能在另一個密鑰下進行。

您可以使用Safenet HSM函數調用導入您的密鑰。

+0

這是一個Thales HSM,功能如GetAttributeValue,ObjectHandle等由PKCS11 api提供。當你說「提取密鑰只能在另一個密鑰下進行」。你的意思是包裝鑰匙? –

+0

是的。我強烈建議您使用Thales提供的功能進行RSA操作。 RSA密碼系統命令:EK,EO,EQ等 –

+0

@AhmetArslan我相信您會將Thales payShield 9000 HSM與Thales nShield HSM混爲一談。問題是關於nShield的。 – softwariness

0

可以使用正確的屬性設置導出RSA私鑰(當然,這種情況必須由HSM供應商提供的非託管PKCS#11庫支持),但是您需要讀取多個屬性(請參閱第12.1.3節PKCS#11 v2.20 specification)來提取其部分,然後自行創建密鑰的ASN.1結構。

您需要的ASN.1結構的特定類型取決於您使用的密鑰類型(在您的情況下是RSA)以及使用密鑰的目標系統的功能,即加密應用程序通常使用不同於e郵件代理等我相信你可以從PKCS#1定義的RSAPrivateKey結構開始。