2013-07-25 181 views
0
KeyStore ks = KeyStore.getInstance("JCEKS"); 
ks.load(null, null); 
SecretKey skInput = new SecretKeySpec("input".getBytes(), "DESede"); 
SecretKeyEntry skeInput = new KeyStore.SecretKeyEntry(skInput); 
ks.setEntry("input_key", skeInput, new KeyStore.PasswordProtection("banana".toCharArray())); 
FileOutputStream fos = new FileOutputStream("my.keystore"); 
pambks.store(fos, "password".toCharArray()); 
fos.flush(); 
fos.close(); 

上面顯示的代碼試圖將input編碼爲SecretKey並存儲到密鑰庫中。下面顯示的代碼是我如何從密鑰庫中檢索密鑰。但我不知道如何將它解碼回原始值?如何在JAVA中對SecretKey進行編碼和解碼?

FileInputStream fin = new FileInputStream("my.keystore"); 
KeyStore ks = KeyStore.getInstance("JCEKS"); 
ks.load(fin, "password".toCharArray()); 
SecretKeyEntry ske = (SecretKeyEntry) readks.getEntry("input_key", new KeyStore.PasswordProtection("banana".toCharArray())); 
SecretKey sk = ske.getSecretKey(); 

,我不知道這是否是做的加密和解密中SecretKey的正確方法,請糾正我,如果我錯了。

回答

1

回覆此問答我認爲我誤解了這個問題。

通過調用您的getEncoded方法鍵,您可以獲取密鑰的字節表示形式。之後,可以使用其中一個String構造函數將其恢復爲文本。如上所述,您不應該使用字符串作爲鍵。請注意,DES密鑰在最後一位包含奇偶校驗,所以這可能會改變結果。要爲鍵使用字符串,最好使用十六進制。請注意,密鑰應該具有足夠的熵,並且字符串不可能提供該熵。


有幾件事情在上面的代碼不完全正確:

  1. 你不應該(曾經)使用"input".getBytes()。首先,getBytes()使用平臺特定的默認字符編碼。如果您想將DES密鑰用作字符串,請使用十六進制解碼器(例如Apache Commons編解碼器或Bouncy Castle)解碼。

  2. 您應該使用DESede密鑰的24個字節。 "input".getBytes()不會返回足夠的字節。

  3. 對於DES密鑰,只要確保設置了奇偶校驗位,就可以將密鑰規範放入KeyFactory。他們你會確定鑰匙是有效的。

要獲得大量的密鑰數據,請使用PBKDF2作爲密碼或使用隨機生成的密鑰。

如果加密密鑰存儲足夠好,則加密密鑰的存儲取決於用例和其他安全措施。

相關問題