KeyPairGeneratorSpec已被弃用。您如何处理此警告?
示例代码:
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
kpg.initialize(new KeyPairGeneratorSpec.Builder(context).build());
答案 0 :(得分:4)
根据documentation,您应该使用KeyGenParameterSpec。例如(对于RSA签名密钥):
KeyPairGenerator kpg = KeyPairGenerator.getInstance(
KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore");
kpg.initialize(new KeyGenParameterSpec.Builder(
"mykey", KeyProperties.PURPOSE_SIGN)
.setDigests(KeyProperties.DIGEST_SHA256)
.setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PSS)
.build());
需要设置摘要和填充模式的其他选项。这是因为,遵循良好的加密安全实践,AndroidKeyStore现在可以锁定密钥的使用方式(签名与解密,摘要和填充模式等)到指定的集合。如果您尝试以某种方式使用密钥,但未指定创建密钥的方式,则会失败。这种故障实际上是由安全硬件强制执行的,如果您的设备具有该故障,那么即使攻击者依赖设备,密钥仍然只能以定义的方式使用。
KeyGenParameterSpec还支持创建ECDSA,AES和HMAC密钥,并允许您对密钥的使用方式设置其他限制。例如,如果您使用setUserAuthenticationRequired
方法,则除非用户自己进行身份验证,否则无法使用密钥。
答案 1 :(得分:0)
从 SDK 18 到 23 = KeyPairGeneratorSpec
SDK 23 和 以上 = KeyGenParameterSpec
@RequiresApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
fun setAlgorithmParameterSpec(context: Context?) {
val start = GregorianCalendar();
val end = GregorianCalendar();
end.add(Calendar.YEAR, 10);
val spec: AlgorithmParameterSpec?
if (Build.VERSION.SDK_INT < 23) {
spec = context?.let {
android.security.KeyPairGeneratorSpec.Builder(it)
// Alias - is a key for your KeyPair, to obtain it from Keystore in future.
.setAlias(alias ?: "")
// The subject used for the self-signed certificate of the generated pair
.setSubject(X500Principal("CN=$alias"))
// The serial number used for the self-signed certificate of the generated pair.
.setSerialNumber(BigInteger.valueOf(1337))
// Date range of validity for the generated pair.
.setStartDate(start.time).setEndDate(end.time)
.build()
};
} else {
spec = KeyGenParameterSpec.Builder(alias ?: "", KeyProperties.PURPOSE_DECRYPT)
.setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_PKCS1)
.build();
}
}