Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Android密钥存储提供程序存储密钥_Android_Encryption_Private Key_Android Keystore - Fatal编程技术网

如何使用Android密钥存储提供程序存储密钥

如何使用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

我试图使用安卓4.3中提供的安卓密钥存储提供程序来安全地保存私钥,然后使用该私钥加密和解码数据

到目前为止,我认为我已经实现了正确的方法和代码,但是我目前面临一个我无法解决的奇怪问题

我有一个名为KeyStorage的类,用于创建密钥对、加载密钥库和检索私钥,该类的代码如下:

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);