2015-03-02 113 views
1

首先我是新手android編程,雖然我對編程本身並不陌生。我本質上試圖做的是將我的加密密鑰保存到Android密鑰庫中。 GOOGLE本身似乎缺乏這樣的信息。由於該主題沒有太多可用的方法,我假設它不是相當標準的知識。那麼有人可以給我一個示例代碼Android KeyStore初始化

  1. 初始化KeyStore(將使用AES-256)。
  2. 保存KeyStore中的多個密鑰(請告訴我可以存儲在1個KeyStore中的密鑰的最大數量,因爲我計劃保存的任何內容都不會少於100)。
  3. 從KeyStore獲取密鑰。
  4. 編輯關鍵
  5. Delete鍵
  6. 刪除整個密鑰倉庫

所以在本質上是一個密鑰庫的所有基本功能代碼。 非常感謝您的幫助。

+0

看看[this](https://github.com/nelenkov/android-keystore)。 – Hemanth 2015-03-02 08:52:35

回答

1

我認爲Android密鑰庫不支持AES密鑰等對稱密鑰。請參閱here。順便說一句,爲什麼該應用程序需要這麼多對稱密鑰?我建議您將一個主對稱密鑰存儲在密鑰存儲區中,並使用此密鑰對應用中的許多其他對稱密鑰進行加密。 希望你很快解決你的問題。

+3

從Marshmallow(Android 6/API Level 23)開始支持Android KeyStore中的對稱密鑰生成和存儲。請參閱[這裏](http://developer.android.com/training/articles/keystore.html)瞭解更多信息。 – 2016-02-08 11:16:45

4

如果將minSdkVersion設置爲23或更高,則Android M可以輕鬆地生成和管理本月的對稱密鑰。

查看這裏列出的第四個例子。 https://developer.android.com/reference/android/security/keystore/KeyGenParameterSpec.html

KeyGenerator keyGenerator = KeyGenerator.getInstance(
     KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore"); 
keyGenerator.initialize(
     new KeyGenParameterSpec.Builder("key2", 
       KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) 
       .setBlockModes(KeyProperties.BLOCK_MODE_GCM) 
       .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE) 
       .build()); 
SecretKey key = keyGenerator.generateKey(); 

Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); 
cipher.init(Cipher.ENCRYPT_MODE, key); 
... 

// The key can also be obtained from the Android Keystore any time as follows: 
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); 
keyStore.load(null); 
key = (SecretKey) keyStore.getKey("key2", null); 

這個例子也是有益的。 https://github.com/googlesamples/android-ConfirmCredential/blob/master/Application/src/main/java/com/example/android/confirmcredential/MainActivity.java

+1

如果您想使用相同的解決方案同時支持較舊的(即API 18)和較新的(API 23+)設備,該怎麼辦? – Diti 2016-08-11 13:54:24

+0

我很久沒有碰過這個,但據我記得沒有好的解決方案。 – nburn42 2016-08-12 01:18:01

+0

它應該是'keyGenerator.init'而不是'keyGenerator.initialize'。 KeyGenerator沒有像'initialize()'這樣的方法。 '初始化()'方法在KeyPairGenerator – siulkilulki 2016-11-06 15:11:18