在 AndroidKeystore 中保存和检索密钥对
Save and Retrieve KeyPair in AndroidKeystore
我需要生成一个 RSA 2048 密钥对,然后保存,如果存在则恢复它。
此刻,我有这个:
SecureRandom random = new SecureRandom();
RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec(keySize, RSAKeyGenParameterSpec.F4);
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "SC");
generator.initialize(spec, random);
return generator.generateKeyPair();
这很完美,但现在我试图保存并从 Android Keystore 中获取它,但我没有实现。我试过了:
String alias = "TESTINGKEY";
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null);
if (!keyStore.containsAlias(alias)) {
SecureRandom random = new SecureRandom();
RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec(keySize, RSAKeyGenParameterSpec.F4);
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "SC");
generator.initialize(spec, random);
return generator.generateKeyPair();
} else {
Key key = keyStore.getKey(alias, null);
if (key instanceof PrivateKey) {
Certificate cert = keyStore.getCertificate(alias);
return new KeyPair(cert.getPublicKey(), (PrivateKey) key);
} else {
return null;
}
}
但无法正常工作,因为在应用程序的第二个 运行 中,密钥库不包含密钥对。
在 https://developer.android.com/training/articles/keystore.html?hl=es 中,我看到 KeyGenParameterSpec
构建器具有“别名”值,但 RSAKeyGenParameterSpec
中没有。
如何保存?
With Android需要KeyStore才能使用KeyGenParameterSpec.Builder
生成密钥。也使用 AndroidKeyStore
而不是 SC
。您可以使用以下代码
生成密钥 (Android>=23)
KeyPairGenerator kpg = KeyPairGenerator.getInstance(
KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore");
kpg.initialize(new KeyGenParameterSpec.Builder(
alias,
KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
.setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
.setKeySize(keySize)
.build());
KeyPair keyPair = kpg.generateKeyPair();
加载密钥
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
KeyStore.Entry entry = keyStore.getEntry(alias, null);
PrivateKey privateKey = ((KeyStore.PrivateKeyEntry) entry).getPrivateKey();
PublicKey publicKey = keyStore.getCertificate(alias).getPublicKey();
除了回答 pedrofb 对于 SDK <= 22 你可以使用 KeyPairGeneratorSpec
而不是 KeyGenParameterSpec
Info:
https://developer.android.com/reference/android/security/KeyPairGeneratorSpec.html
我需要生成一个 RSA 2048 密钥对,然后保存,如果存在则恢复它。
此刻,我有这个:
SecureRandom random = new SecureRandom();
RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec(keySize, RSAKeyGenParameterSpec.F4);
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "SC");
generator.initialize(spec, random);
return generator.generateKeyPair();
这很完美,但现在我试图保存并从 Android Keystore 中获取它,但我没有实现。我试过了:
String alias = "TESTINGKEY";
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null);
if (!keyStore.containsAlias(alias)) {
SecureRandom random = new SecureRandom();
RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec(keySize, RSAKeyGenParameterSpec.F4);
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "SC");
generator.initialize(spec, random);
return generator.generateKeyPair();
} else {
Key key = keyStore.getKey(alias, null);
if (key instanceof PrivateKey) {
Certificate cert = keyStore.getCertificate(alias);
return new KeyPair(cert.getPublicKey(), (PrivateKey) key);
} else {
return null;
}
}
但无法正常工作,因为在应用程序的第二个 运行 中,密钥库不包含密钥对。
在 https://developer.android.com/training/articles/keystore.html?hl=es 中,我看到 KeyGenParameterSpec
构建器具有“别名”值,但 RSAKeyGenParameterSpec
中没有。
如何保存?
With Android需要KeyStore才能使用KeyGenParameterSpec.Builder
生成密钥。也使用 AndroidKeyStore
而不是 SC
。您可以使用以下代码
生成密钥 (Android>=23)
KeyPairGenerator kpg = KeyPairGenerator.getInstance(
KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore");
kpg.initialize(new KeyGenParameterSpec.Builder(
alias,
KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
.setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
.setKeySize(keySize)
.build());
KeyPair keyPair = kpg.generateKeyPair();
加载密钥
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
KeyStore.Entry entry = keyStore.getEntry(alias, null);
PrivateKey privateKey = ((KeyStore.PrivateKeyEntry) entry).getPrivateKey();
PublicKey publicKey = keyStore.getCertificate(alias).getPublicKey();
除了回答 pedrofb 对于 SDK <= 22 你可以使用 KeyPairGeneratorSpec
而不是 KeyGenParameterSpec
Info: https://developer.android.com/reference/android/security/KeyPairGeneratorSpec.html