我想使用AndroidKeyStore只在带有Lollipop的三星设备上保存RSA密钥对。 我知道默认的android实现有一个bug(https://code.google.com/p/android/issues/detail?id=61989),但似乎在三星Lollipop设备上它是固定的。但我看到另外两个奇怪的行为。 使用以下代码创建RSA密钥对:
KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(ctx)
.setAlias(ALIAS)
.setSubject(
new X500Principal(String.format("CN=%s, OU=%s", ALIAS,
ctx.getPackageName())))
.setSerialNumber(BigInteger.ONE).setStartDate(notBefore.getTime())
.setEndDate(notAfter.getTime()).build();
KeyPairGenerator kpGenerator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
kpGenerator.initialize(spec);
kpGenerator.generateKeyPair();
这是打开KeyStore的代码
KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(ALIAS, null);
if (keyEntry != null) {
return (RSAPrivateKey) keyEntry.getPrivateKey();
}
问题n.1:在Android模拟器和CyanogenMod 12.1设备上,密钥库在设备启动时解锁即使用户没有插入解锁PIN-PASSWORD-PATTERN,我的测试应用程序也可以访问密钥库。在三星设备上,密钥库被锁定,直到用户第一次关闭密钥保护。必须使用从PIN或PASSWORD派生的AES密钥加密密钥,并且无需用户交互,密钥库必须被锁定
问题n.2:在所有设备上,即使没有启用安全锁定屏幕也可以插入密钥对,而没有任何警告,例如操作系统“你必须配置屏幕锁定方法”。如上所述,密钥必须加密,没有屏幕锁定,否则可能无法实现。
我的代码出了什么问题?
答案 0 :(得分:0)
@nikolay-elenkov建议我使用KeyPairGeneratorSpec.Builder.setEncryptionRequired()来加密测试时的密钥,现在所有设备在创建密钥对时都要求安全屏幕锁定,并且在启动时密钥库被锁定直到用户插入Pin-Password-Pattern。现在好了!感谢@ nikolay-elenkov像往常一样
有趣的是,启用了Lollipop和安全屏幕锁定的三星设备默认启用加密,而不使用setEncryptionRequired。这就是为什么我在"问题n.1"上看到了奇怪的行为。 ......像往常一样"奇怪的"三星定制