gpt4 book ai didi

Android KeyStore - key 并不总是存在

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:01:43 24 4
gpt4 key购买 nike

在我的应用程序中,我们使用 RSA key ,该应用程序在首次启动时生成(使用 android keystore )。由于未知原因,该应用未能从某些设备上的 keystore 中检索到 key 。我检查了日志,但找不到此错误与特定操作系统版本或特定设备型号之间的关联。此外,我确信该应用程序仅在创建 key 后才尝试读取它。所以 - 我的问题是:据我所知,android key store 应该是持久的。什么会导致这样的错误?

下面是相关的代码示例。

key 生成:

try {
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", keyStore.getProvider());

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){
KeyGenParameterSpec spec;
spec = new KeyGenParameterSpec.Builder(alias, KeyProperties.PURPOSE_DECRYPT | KeyProperties.PURPOSE_ENCRYPT| KeyProperties.PURPOSE_SIGN| KeyProperties.PURPOSE_VERIFY)
.setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)
.setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
.setKeySize(2048)
.build();

generator.initialize(spec);
} else {
Calendar start = new GregorianCalendar();
Calendar end = new GregorianCalendar();
end.add(Calendar.YEAR, 500);

KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(context)
.setAlias(alias)
.setSubject(new X500Principal("CN="+ subject))
.setSerialNumber(BigInteger.valueOf(new Random().nextInt(Integer.MAX_VALUE)))
.setStartDate(start.getTime())
.setEndDate(end.getTime())
.setKeySize(2048)
.build();

generator.initialize(spec);
}
return generator.generateKeyPair();
} catch (Exception e) {
logger.warn("Failed to create private key in store", e);
return null;
}

keystore 本身使用以下代码初始化:

KeyStore androidKeyStore = KeyStore.getInstance("AndroidKeyStore");
androidKeyStore.load(null);
return androidKeyStore;

我们使用下面的代码来检索 key ,错误是在某些设备上 keystore 返回空值:

        try {
Key key = keyStore.getKey(alias, null);

if (key == null){
logger.warn("Key not found in key store");
return null;
}

if (key instanceof PrivateKey) {
// Get certificate of public key
Certificate cert = keyStore.getCertificate(alias);

// Get public key
PublicKey publicKey = cert.getPublicKey();

// Return a key pair
return new KeyPair(publicKey, (PrivateKey) key);
} else {
logger.warn("Key found, but not from current type. type found: " + key.getClass().getSimpleName());
}
return null;
}catch (Exception e){
logger.warn("Failed to get private key in store", e);
return null;
}

谢谢,欧麦

最佳答案

以防万一有人遇到同样的问题:我发现适用于 Android 的 Azure Active Directory 库也有类似的问题 issue , 通过阅读代码,我看到它们链接到 two issues类似于这个问题和我们遇到的另一个问题。因此,我计划使用基于 p12 文件的 keystore ,存储在应用程序私有(private)存储中。

关于Android KeyStore - key 并不总是存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37920232/

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