2011-12-08 61 views
1

我需要首先使用SHA-1摘要算法對字符串進行數字簽名,然後應用RSA算法,使用PrivateKey對其進行簽名。我已經在我的數據庫中存儲了PrivateKey作爲base64中的數據類型char(250)。我的問題是,我不知道如何將它轉換成一個專用密鑰將其用於簽署:對我應用了SHA-1散列算法將字節[]轉換爲java中的PrivateKey以進行數字簽名

Cipher cipher = Cipher.getInstance("RSA"); 
cipher.init(Cipher.ENCRYPT_MODE, privateKey); 
byte[] cipherText = cipher.doFinal(digest); 

文摘是一個字節數組:

MessageDigest md = MessageDigest.getInstance("SHA-1"); 
byte [] ba = cadena.getBytes(); 
byte [] digest = md.digest(ba); 

這是我想到的解決方案,但如果有人有更好的解決方案,我將不勝感激。

回答

4

我不知道你是如何將私鑰保存到數據庫中的。但是this page提供了有關如何從文件系統加載KeyStore以及檢索PrivatePublic密鑰的信息。

相關代碼段(修改,以滿足您的要求)是,

String password = ...; 
    KeyStore ks = KeyStore.getInstance(KEY_STORE_TYPE); 

    byte[] keyAsByteArray = ...; // The key persisted in the DB 
    InputStream keyStream = new ByteArrayInputStream(keyAsByteArray); 
    ks.load(keyStream, password); 

然後,

KeyStore.PrivateKeyEntry pkEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(PRIVATE_KEY_ALIAS, password); 
    PrivateKey privateKey = pkEntry.getPrivateKey(); 
+0

什麼是關鍵存儲類型64底層編碼的? – user1084509

+1

@ user1084509我不認爲密鑰庫類型與編碼有任何關係。編碼是將一種形式的數據轉換爲另一種形式的手段。您的密鑰庫類型可能是[本文(鏈接)]中提到的其中一種類型(http://docs.oracle.com/javase/1.4.2/docs/guide/security/CryptoSpec.html#AppA) – srkavin

+0

好的,謝謝你,現在我明白了。我有關於這一行的另一個問題:KeyStore.PrivateKeyEntry pkEntry =(KeyStore.PrivateKeyEntry)ks.getEntry(PRIVATE_KEY_ALIAS,password); ...密碼預計是類型KeyStore.ProtectionParameter,我該如何做這種轉換?我的密碼是一組字符或一個字符串。 – user1084509

相關問題