AndroidKeyStore奇怪的行为

时间:2015-06-30 12:54:24

标签: android security encryption keystore android-keystore

我想使用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:在所有设备上,即使没有启用安全锁定屏幕也可以插入密钥对,而没有任何警告,例如操作系统“你必须配置屏幕锁定方法”。如上所述,密钥必须加密,没有屏幕锁定,否则可能无法实现。

我的代码出了什么问题?

1 个答案:

答案 0 :(得分:0)

@nikolay-elenkov建议我使用KeyPairGeneratorSpec.Builder.setEncryptionRequired()来加密测试时的密钥,现在所有设备在创建密钥对时都要求安全屏幕锁定,并且在启动时密钥库被锁定直到用户插入Pin-Password-Pattern。现在好了!感谢@ nikolay-elenkov像往常一样

有趣的是,启用了Lollipop和安全屏幕锁定的三星设备默认启用加密,而不使用setEncryptionRequired。这就是为什么我在"问题n.1"上看到了奇怪的行为。 ......像往常一样"奇怪的"三星定制