2015-03-02 126 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