2014-09-30 37 views
0

得到明文密碼,我做以下存儲基於密鑰庫中的用戶密碼生成SecretKey:生成一個密碼生成SecretKey,並從重點

// load KeyStore 

static byte[] salt = // for learning purposes 
        { (byte) 0xc7, (byte) 0x73, (byte) 0x21, (byte) 0x8c, 
         (byte) 0x7e, (byte) 0xc8, (byte) 0xee, (byte) 0x99 }; 

String alias = "aeskey"; 
char[] password = "password".toCharArray(); 
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); 
KeySpec spec = new PBEKeySpec(password, salt, 65536, 256); 
SecretKey tmp = factory.generateSecret(spec); 
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES/CBC/PKCS5Padding"); 
Entry aesentry = new KeyStore.SecretKeyEntry(secret); 
store.setEntry(alias, aesentry, protParam); 

現在,我可以從該SecretKey的KeyStore:

KeyStore.SecretKeyEntry e = (SecretKeyEntry) store.getEntry("aeskey", protParam); 
secret = e.getSecretKey(); 

如何從該SecretKey獲取初始密碼?

回答

2

您無法從KeySpec獲取原始密碼。密碼和鹽的一些字節被選中,以提出KeySpec。如果你想加密和解密的文字,你需要做到以下幾點:

  1. ,使用密碼和鹽
  2. 使用該
  3. 加密生成一個SecretKey的
  4. 生成一個密碼實例生成KeySpec使用此密碼的文本

現在,假設您在離線狀態下分享您的密碼和鹽。然後他們可以使用這些解密加密的文本。

查看this對此有一個很好的討論。

+0

我認爲使用KeyStore來保存一串原始密碼。現在我看到這是一個錯誤的方法。我可以使用一個初始密碼將其他初始密碼作爲純文本進行加密/解密。輸出將是一串加密字節碼。我應該把它們放在一個文件中嗎?或者你會建議一個更好的方法來實現這一目標? – 2014-09-30 16:28:29

+0

這取決於用例。看看[jasypt](http://www.jasypt.org/)以獲得一些開箱即用的東西。然後,你可以選擇存儲加密的東西在文件,數據庫等 – Aritra 2014-09-30 18:33:53

+0

感謝Jasypt,這可能會適合我最好的。 – 2014-10-01 10:24:59