gpt4 book ai didi

android - 如何使用 Android Key Store Provider 存储 key

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:00:09 25 4
gpt4 key购买 nike

我正在尝试使用 Android 4.3 中可用的 Android Key Store Provider 来安全地保存私钥,然后使用该私钥加密和解码数据。

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

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

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

然后我有一个名为 CredentialStore 的类,我尝试在其中使用它。我创建了一个名为“MySecureKey”的别名,并尝试基于此创建和存储私钥。因此,正如您所看到的,我尝试基于别名加载 keystore 来创建新的 key 对,然后最终检索私钥。但是它不起作用。

public class CredentialStore {

public static final String KEY_ALIAS = "MySecureKey";

private KeyStorage KeyStorage;

public CredentialStore(Activity context){

keyStorage = new KeyStorage();
try {
keyStorage.generateNewKeyPair(KEY_ALIAS, context);
} catch (Exception e) {
e.printStackTrace();
}
blueBirdKeyStorage.loadKeyStore();

try {
keyStorage.loadPrivteKey(KEY_ALIAS);
} catch (Exception e) {
e.printStackTrace();
}

}

我得到如下日志:

Aliases = MySecureKey
Could not find key alias: MySecureKey

因此,当我检查 loadKeyStore 方法中的别名时,它看起来就像在日志中返回一样。但是,当我尝试使用 loadKeyStore 方法调用它时,我收到日志说找不到 key “MySecureKey”。

我找不到任何原因,在线研究也证明没有结果,所以我想知道是否有人知道可能出了什么问题?

最佳答案

为什么是blueBirdKeyStore:

blueBirdKeyStorage.loadKeyStore();

不应该是:

keyStorage.loadKeyStore();

此外,您还没有在 loadPrivateKey() 中使用“别名”:

KeyStore.Entry entry = keyStore.getEntry(EnhancedCredentialStore.KEY_ALIAS, null);

现在,我不确定,但你不应该在这里使用“别名”吗?

关于android - 如何使用 Android Key Store Provider 存储 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26042410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com