如何使用Android密钥存储提供程序存储密钥
我试图使用安卓4.3中提供的安卓密钥存储提供程序来安全地保存私钥,然后使用该私钥加密和解码数据 到目前为止,我认为我已经实现了正确的方法和代码,但是我目前面临一个我无法解决的奇怪问题 我有一个名为KeyStorage的类,用于创建密钥对、加载密钥库和检索私钥,该类的代码如下:如何使用Android密钥存储提供程序存储密钥,android,encryption,private-key,android-keystore,Android,Encryption,Private Key,Android Keystore,我试图使用安卓4.3中提供的安卓密钥存储提供程序来安全地保存私钥,然后使用该私钥加密和解码数据 到目前为止,我认为我已经实现了正确的方法和代码,但是我目前面临一个我无法解决的奇怪问题 我有一个名为KeyStorage的类,用于创建密钥对、加载密钥库和检索私钥,该类的代码如下: public class KeyStorage { public static final String ANDROID_KEYSTORE = "AndroidKeyStore"; private KeyStore ke
public class KeyStorage {
public static final String ANDROID_KEYSTORE = "AndroidKeyStore";
private KeyStore keyStore;
public void loadKeyStore() {
try {
keyStore = KeyStore.getInstance(ANDROID_KEYSTORE);
keyStore.load(null);
Enumeration<String> aliases = keyStore.aliases();
while(aliases.hasMoreElements())
Log.e("E", "Aliases = " + aliases.nextElement());
} catch (Exception e) {
// TODO: Handle this appropriately in your app
e.printStackTrace();
}
}
public void generateNewKeyPair(String alias, Context context)
throws Exception {
Calendar start = Calendar.getInstance();
Calendar end = Calendar.getInstance();
// expires 1 year from today
end.add(1, Calendar.YEAR);
KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(context)
.setAlias(alias)
.setSubject(new X500Principal("CN=" + alias))
.setSerialNumber(BigInteger.TEN)
.setStartDate(start.getTime())
.setEndDate(end.getTime())
.build();
// use the Android keystore
KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA", ANDROID_KEYSTORE);
gen.initialize(spec);
// generates the keypair
gen.generateKeyPair();
}
public PrivateKey loadPrivteKey(String alias) throws Exception {
if (keyStore.isKeyEntry(alias)) {
Log.e("E", "Could not find key alias: " + alias);
return null;
}
KeyStore.Entry entry = keyStore.getEntry(EnhancedCredentialStore.KEY_ALIAS, null);
if (!(entry instanceof KeyStore.PrivateKeyEntry)) {
Log.e("E", " alias: " + alias + " is not a PrivateKey");
return null;
}
return ((KeyStore.PrivateKeyEntry) entry).getPrivateKey();
}
我得到的日志如下:
Aliases = MySecureKey
Could not find key alias: MySecureKey
因此,当我检查loadKeyStore方法中的别名时,它看起来就在那里,因为它将返回到日志中。然而,当我尝试使用loadKeyStore方法调用它时,我得到的日志表明它找不到密钥“MySecureKey”
我找不到这方面的任何原因,而且网上研究已经证明是徒劳的,所以我想知道是否有人知道可能出了什么问题?为什么蓝鸟密钥库位于:
blueBirdKeyStorage.loadKeyStore();
难道不是:
keyStorage.loadKeyStore();
此外,您还没有在loadPrivateKey()中使用“别名”:
现在,我不确定,但是您不应该在这里使用“别名”吗?类中的loadPrivateKey不使用“别名”检索密钥。它正在使用另一个类的常量,因此我不确定您在这里期望的是什么。您检查密钥是否存在的方法有缺陷:
if (keyStore.isKeyEntry(alias)) {
Log.e("E", "Could not find key alias: " + alias);
return null;
}
根据javadoc,它有以下行为
如果给定别名标识的条目是由创建的,则返回true
对setKeyEntry的调用,或通过使用
PrivateKeyEntry或SecretKeyEntry
但是您的密钥不是通过setEntry()
创建的。我想如果你把钥匙装上
KeyStore.Entry entry = ks.getEntry(alias, null);
它不会是空的
1。您生成密钥对而不使用它。generateNewKeyPair方法不返回任何内容。2.您不需要将任何内容保存到KeyStore以便稍后加载。请参考密钥库使用示例。它可能会帮助你@AlexanderZhak尽管有很多次投票,但你的评论是错误的:查看官方文档:这就是你如何使用Android密钥库-如果你在Android密钥库实例中使用KeyFactory,就没有必要显式地放置密钥。
if (keyStore.isKeyEntry(alias)) {
Log.e("E", "Could not find key alias: " + alias);
return null;
}
KeyStore.Entry entry = ks.getEntry(alias, null);