嗨,我有一个程序,需要在密钥库中存储密钥,我生成一对密钥,我签署一个值,这一切都很有效.当用户转到首选项并更改密码或将密码模式更改为引脚模式时,问题就出现了.之后,当我尝试访问私钥时,密钥库返回给我一个空值.
我知道keysotore值是用解锁密码值签名的,但我相信如果用户更改了密码,密钥库将使用新密钥进行签名,但事实并非如此.
我做错了什么?如果不是这样,有没有办法改变密码并手动进行?
这是我正在使用的代码.
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
kpg.initialize(new KeyPairGeneratorSpec.Builder(context)
.setAlias(ALIAS)
.setStartDate(now)
.setEndDate(end)
.setSerialNumber(BigInteger.valueOf(1))
.setSubject(new X500Principal("CN=test1"))
.build());
KeyPair kp = kpg.generateKeyPair();
Run Code Online (Sandbox Code Playgroud)
这是获取密钥库的代码
KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);
KeyStore.Entry entry = ks.getEntry(ALIAS, null);
if (!(entry instanceof KeyStore.PrivateKeyEntry)) {
Log.w("borrar", "Not an instance of a PrivateKeyEntry");
return null;
}
Run Code Online (Sandbox Code Playgroud)
谢谢,
鉴于Android Keystore存在许多已知问题及其丢失数据的能力,或者只是普遍失败(请参见此处,此处,此处,此处,此处和此处),我很想知道是否有任何开发人员实际使用过Android Keystore在用于生成密钥的实时应用程序中,还没有遇到与Keystore无法从密钥库创建或检索密钥相关的大量崩溃报告?你是如何解决已知问题的?我特别感兴趣的是,KeyPairGenerator该类用于生成不需要用户身份验证的私钥 - 公钥对(即不需要在设备上设置屏幕锁定).
编辑:我在下面列出了我用于通过Android Keystore生成私钥 - 公钥对的代码:
KeyPair createPrivateKeyEntry(@NonNull Context context,
@NonNull String keyAlias) throws CryptoException {
try {
AlgorithmParameterSpec spec = getAlgorithmParameterSpec(context, keyAlias);
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(
"RSA",
"AndroidKeyStore"
);
keyPairGenerator.initialize(spec);
return keyPairGenerator.generateKeyPair();
} catch (Exception e) {
String message = "Unexpected error when attempting to create a private key entry.";
throw new CryptoException(message, e);
}
}
private AlgorithmParameterSpec getAlgorithmParameterSpec(@NonNull Context context, …Run Code Online (Sandbox Code Playgroud)