2017-06-16 43 views
0

在一臺服務器上創建摘要,並將其傳遞到另一臺服務器以使用標記/軟件狗進行簽名。密碼API可與PKCS11 prvoider正常工作。使用SunMSCAPI簽署預先創建的摘要

Cipher c = Cipher.getInstance("RSA"); 
    c.init(Cipher.ENCRYPT_MODE, pk); 

    DigestInfo di = new DigestInfo(new DefaultDigestAlgorithmIdentifierFinder().find("SHA-256"), hash); 
    byte[] digestInfo = di.getEncoded(); 
    byte[] data = c.doFinal(digestInfo); 

但在使用與SunMSCAPI提供商的API加密,私鑰被視爲公共密鑰,既不令牌密碼要求和產生的簽名驗證失敗。同時使用私鑰密碼不是正確的方法(這裏也討論 - https://bugs.openjdk.java.net/browse/JDK-7050158)。

如何在避免使用摘要創建的同時使用Signature API? 「NONEWithRSA」收到的輸出將不正確,因爲我的摘要是「Sha-256」,並且簽名驗證將失敗。

+0

由於SunMSCAPI中的錯誤,我使用SunMSCAPI到RSA的最後一次試驗加密先前計算的摘要並沒有完成。我建議使用其他加密提供商或使用Signature.sign並讓SunMSCAPI計算摘要 – pedrofb

+0

@pedrofb感謝您的回答。我應該使用什麼開源提供商的建議?由於SunPkcs11不適用於Windows版本(如此處所述:https://stackoverflow.com/a/28643362/5285640)。 –

+0

不,我不能建議替代提供者。但是,如果可以,請使用標準簽名方法而不是使用hash + oid +加密,因爲它存在問題 – pedrofb

回答

0

嘗試閱讀SunMSCAPI的源代碼。在使用「NONEWithRSA」時,根據摘要長度查找摘要類型。對於簽名,必須對摘要信息(AlorithmId +摘要)進行簽名,因此傳遞給Signature API的數據不僅僅是摘要長度,SunMSCAPI會拋出傳遞的摘要不支持的數據長度錯誤。

看起來像是簽名不可能在SunMSCAPI提供程序中使用預先創建的摘要。儘管與Pkcs11提供者一樣,它也能正常工作。