2013-02-26 72 views
0

我想CMS數字簽名與JavaCard的

要創建標準格式(CMS/CADES-EPES)一個分離的數字簽名什麼。

如何創建數字簽名現在

我創建文件哈希值(SHA-256),獲得哈希算法ID,並給它全部變成一條消息,發送到智能卡(JavaCard的)。爲此消息(RSA-512)生成分離簽名併發回。我能夠驗證使用純Java(到目前爲止,還沒有BouncyCastle的),使用這段代碼簽名:

RSAPublicKey pubK = (RSAPublicKey) cert.getPublicKey(); 
Signature sig = Signature.getInstance("SHA256withRSA", "BC"); 
sig.initVerify(pubK); 
//load signed file and update sig 
... 
sig.verify(signedMessage) 

問題

我的目標是讓CMS(PKCS#7)從已簽名的數據簽名。 Hovever,如此處所述 - >How can we Convert PKCS#1 to PKCS #7 if I have the Certificate? - 將「轉換」爲CMS不容易使用簽名屬性。那麼,讓我們說,我想嘗試它(只是爲了有備份解決方案)。首先,我嘗試使用BouncyCastle。但是,我無法找到與已簽名的數據並且無法訪問主鍵的方法(因爲它在智能卡上無法導出)。所以,我跟原生的Java庫,這樣試了一下:

X500Name xName = X500Name.asX500Name(cert.getSubjectX500Principal()); 
BigInteger serial = cert.getSerialNumber(); 
AlgorithmId digestAlgorithmId = new AlgorithmId(AlgorithmId.SHA512_oid); 
AlgorithmId signAlgorithmId = new AlgorithmId(AlgorithmId.RSAEncryption_oid); 

//SignerInfo 
SignerInfo sInfo = new SignerInfo(xName, serial, digestAlgorithmId, signAlgorithmId, signatureBytes); 
//Create ContentInfo 
ContentInfo cInfo = new ContentInfo(ContentInfo.DATA_OID, new DerValue(DerValue.tag_OctetString, dataToSign)); 
//create PKCS7 signature 
PKCS7 p7 = new PKCS7(new AlgorithmId[] { digestAlgorithmId }, cInfo, 
     new java.security.cert.X509Certificate[] { cert }, 
     new SignerInfo[] { sInfo }); 
//Write PKCS7 to bYteArray 
ByteArrayOutputStream bOut = new DerOutputStream(); 
p7.encodeSignedData(bOut); 
byte[] encodedPKCS7 = bOut.toByteArray(); 

這種做法似乎「不正確的」給我說實話,我是甚至無法使用PKCS7.verify()方法來驗證它(它返回null ,這是不成功的驗證,並且不會引發異常)。

所以我的問題是:

  1. 有沒有辦法直接獲取從JavaCard的一個CMS簽名?
  2. 是否可以從已經生成的簽名中創建CMS簽名只有簽名者證書(沒有訪問私鑰)?
  3. 您是否發現上述「轉換」代碼有問題?
  4. 您是否知道任何可用於驗證分離簽名的工具? (能夠檢查我的結果)

A正在尋找2周的答案,現在我真的很絕望。感謝您的任何信息/幫助。

+0

您還沒有接受任何的答案您以前的兩個問題,沒有說明原因。 – 2013-02-26 22:23:16

+0

您使用的是'sun.security.x509.AlgorithmId'類? – 2013-02-26 22:28:53

+0

@owlstead,Ups!我不知道,我可以/應該接受答案。感謝您的通知。是的,我正在使用sun.security.x509.AlgorithmId – AGO 2013-02-27 08:33:27

回答

1

(1)有什麼辦法可以直接從JavaCard獲取CMS簽名?

由於JavaCards功能非常全面,如果您是編程他們的人,那也許是可能的。然而,檢索這些CMS容器所需的通信將是非常專有的,很可能只能由您的代碼使用(對您而言可能是好的,對客戶來說通常是不好的),以及來自黑客攻擊您的解決方案的人的代碼。

(2)是否有可能從已經生成的簽名中創建CMS簽名只有簽名者證書(沒有訪問私鑰)?

如果您已經擁有PKCS#1簽名,則可以創建非常原始的CMS簽名容器。你提到的問題How can we Convert PKCS#1 to PKCS #7 if I have the Certificate

如果您打算與其他簽名驗證軟件的互操作性,但是,這種原始簽名(其中有操縱一個巨大的潛在)極有可能會被拒絕。

(3)您是否發現上述「轉換」代碼有任何問題?

另請提供樣本PKCS#1輸入簽名和樣本CMS結果。此外,由於@owlstead評論,你不應該使用Sun內部類,它們可進行更改,重命名或不再另行通知,甚至刪除。(其實我寧願更換應該通過

(4)你知道的任何工具,可以用來驗證超脫簽名? (能夠檢查我的結果)

OpenSSL包含驗證工具。此外還有許多提供簽名驗證服務的Web服務。哪些適合你,是否非常依賴簽名的PKI和法律環境。