2017-05-26 44 views
0

我想用AES加密實現一個自定義密鑰,並且我已經找到了下面的實現和關於這個的詳細信息。如何使用存儲在密鑰庫中的自定義密鑰執行AES加密?

byte[] key = (SALT2 + username + my_custom_secret_key).getBytes("UTF-8"); 
MessageDigest sha = MessageDigest.getInstance("SHA-1"); 
key = sha.digest(key); 
key = Arrays.copyOf(key, 16); // use only first 128 bit 

SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); 

但我有以下疑點:

byte[] my_key = (SALT2 + username + my_custom_secret_key).getBytes("UTF-8"); 
SecretKeySpec secretKeySpec = new SecretKeySpec(my_key, "AES"); 

如果我是用典型事例,如:

KeyGenerator keyGen = KeyGenerator.getInstance("AES"); 
keyGen.init(128); 
SecretKey secretKey = keyGen.generateKey(); 
  1. 如何/我應該在哪裏存儲我的祕密密鑰即「mysecretkey_123456」
  2. 爲什麼需要「散列」「(SALT2 + usern ame + password)「使用SHA-1/2並將byte []數組傳遞給SecretKeySpec?
  3. 爲什麼我無法將明文密鑰作爲字節[]發送?
  4. 我試圖確保「密鑰」是動態的,以便它基於salt +用戶名+ my_custom_secret_key,以便相同的加密字符串將具有不同的輸出。

Java AES and using my own Key

https://www.securecoding.cert.org/confluence/display/java/MSC61-J.+Do+not+use+insecure+or+weak+cryptographic+algorithms

How to generate SALT value in Java?

回答

2

解答您的疑惑:

  1. 如何/我應該在哪裏存儲我的祕密密鑰即 「mysecretkey_123456」?

這取決於。我所看到的似乎是一個密碼而不是一個關鍵。因此將其存儲在您的頭部或密碼管理器將被建議。

  • 爲什麼有需要 「散列」 的 「(SALT2 +用戶名+密碼)」 組合使用SHA-1/2和傳遞byte []數組來SecretKeySpec?
  • 這是因爲AES密鑰由正好是16,24或32個字節,其應該是隨機的給攻擊者。密碼既沒有一致的長度,也沒有要求的隨機性。

    代碼段做的是創建密碼散列函數或基於密碼的密鑰導出函數(PBKDF)。當然,只要使用SHA-1不會削減它,您應該使用PBKDF2或bcrypt,scrypt或Argon2中的一種。然後以高工作因子(或迭代次數)配置其中一個功能以提供密鑰加強。 PBKDF2 - 儘管不是最大的 - 是Java運行時環境的一部分,因此部署起來相對容易。

    如果你的「明文鑰匙」之稱my_custom_secret_key已經具備了強度的128位或更多,那麼你可以使用基於密鑰密鑰導出函數,如香港民主促進會代替。

  • 爲什麼不能發送明文祕密密鑰作爲字節[]?
  • 誰說你不能?代碼示例似乎錯誤地輸入了密鑰和密碼,所以我認爲這是混淆的來源。您通常會使用高熵密鑰的字節。

    對於使用char[]密碼建議;這是因爲在用它來驗證密碼或派生密鑰之後,您不能銷燬String的內容。另一方面,char[]可以在使用後直接用零填充來清除。當然,這對存儲在byte[]中的密鑰也同樣適用。

  • 我試圖確保「密鑰」是動態的,使得它是基於一個鹽+用戶名+ my_custom_secret_key,使得相同的加密字符串將具有不同的輸出。
  • 只要鹽大和足夠的隨機,將工作,說16個字節SecureRandom再生每鹽所需的加密時間。

    這樣生成的密鑰將始終是足夠的隨機,並且使用安全模式(即,在任何模式構建在Java中 ECB,最好是像GCM模式加密)當你的密碼是安全的。

    +0

    我想2個Java程序之間共享我的所謂的AES「自定義密碼」這樣我們就可以使用相同的密鑰來加密和解密數據。出於安全原因,我如何保護/存儲我的「自定義密碼」? – youcanlearnanything

    +0

    我想使用「密碼」而不是密鑰的原因是因爲我希望密文在每次使用時都改變。即基於每次服務器啓動,或每個用戶的會話或每個用戶的事務。 – youcanlearnanything

    +0

    在系統密鑰存儲,拇指驅動器上,在受保護的帳戶,在啓動過程中輸入它,在一個加密的配置文件。完整的密鑰管理在這裏討論有點多。當您需要完全自主的應用程序時,您可能只能*密碼*密碼。最後你需要將它存儲在某個地方,再次加密會導致雞蛋問題。 –