2014-10-07 55 views
4

返回null我使用这个代码来存储密钥插入在Android应用程序的密钥库中:密钥库信息getKey()在Android的

SecretKeyFactory kf = SecretKeyFactory.getInstance("DES"); 
DESKeySpec keySpec = new DESKeySpec(key); // byte[] key 
SecretKey skey = kf.generateSecret(keySpec); 

KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 
ks.load(null, "ksPassword".toCharArray()); 

PasswordProtection pass = new PasswordProtection(
     "entryPassword".toCharArray()); 
KeyStore.SecretKeyEntry skEntry = new KeyStore.SecretKeyEntry(skey); 
ks.setEntry("keyAlias", skEntry, pass); 

FileOutputStream fos = ctx.getApplicationContext().openFileOutput("bs.keystore", 
     Context.MODE_PRIVATE); 
ks.store(fos, ksPassword); 
fos.close(); 

然后,在另一种方法,我用这个代码来检索关键我存储,

FileInputStream fis = ctx.getApplicationContext().openFileInput("bs.keystore"); 
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 
ks.load(fis, "ksPassword".toCharArray()); 
Key k = (SecretKey) ks.getKey(keyAlias, "entryPassword".toCharArray()); 
fis.close(); 

但指令ks.getKey("keyAlias", "entryPassword".toCharArray())返回null。

我在哪里错了?

+0

PasswordProtection是什么意思?它不是一个android类。 – Alboz 2014-10-07 19:07:31

+0

它是java.security.KeyStore.PasswordProtection。它实现了java.security.KeyStore.ProtectionParameter接口。 – 2014-10-08 07:30:55

回答

5

好吧,我终于明白了这个问题...

我用什么方法来存储比密钥库中的一个关键更多。使用代码ks.load(null, "ksPassword".toCharArray());每次都删除以前的密钥(因为加载一个空的密钥库),并且只有最后一个密钥存储在密钥库中。

所以正确的代码是:

KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 
try { 
FileInputStream fis = ctx.getApplicationContext().openFileInput("bs.keystore"); 
ks.load(fis, ksPassword); 
} catch(FileNotFoundException e) { 
    ks.load(null, ksPassword); 
} 

第一次,该方法执行的文件bs.keystore不存在,因此执行在捕获块的代码。相反,在接下来的调用中存在该文件,并将新密钥添加到密钥库。