Android 安德烈·基斯托奇怪的行为

Android 安德烈·基斯托奇怪的行为,android,security,encryption,keystore,android-keystore,Android,Security,Encryption,Keystore,Android Keystore,我想使用AndroidKeyStore,以便仅在带有棒棒糖的三星设备上保存RSA密钥对。 我知道默认的android实现有一个bug(),但在三星棒棒糖设备上似乎已经修复了。但我看到另外两种奇怪的行为。 RSA密钥对是使用以下代码创建的: KeyPairGeneratorSpec spec = new KeyPairGeneratorSpec.Builder(ctx) .setAlias(ALIAS) .setSubject(

我想使用AndroidKeyStore,以便仅在带有棒棒糖的三星设备上保存RSA密钥对。 我知道默认的android实现有一个bug(),但在三星棒棒糖设备上似乎已经修复了。但我看到另外两种奇怪的行为。 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.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(ALIAS, null);

if (keyEntry != null) {
     return (RSAPrivateKey) keyEntry.getPrivateKey();
}
问题n.1:在Android emulator和CyanogenMod 12.1设备上,即使用户没有插入解锁PIN密码模式,并且我的测试应用程序可以访问密钥库,密钥库也会在设备启动时解锁。在三星设备上,密钥存储被锁定,直到用户第一次关闭键盘保护。必须使用从PIN或密码派生的AES密钥对密钥进行加密,并且在没有用户交互的情况下,必须锁定密钥库

问题n.2:在所有设备上,即使未启用安全锁定屏幕,也可以插入密钥对,而无需操作系统发出任何警告,如“您必须配置屏幕锁定方法”。如上所述,密钥必须加密,如果没有屏幕锁,可能无法加密


我的代码怎么了?

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


有趣的是,启用了棒棒糖和安全屏幕锁的三星设备默认启用了加密,而不使用setEncryptionRequired。这就是为什么我在“问题n.1”上看到奇怪的行为。。。像往常一样,三星定制的“奇怪”设备是什么“所有设备”(设备和操作系统版本)?三星设备KNOX启用了吗?对于“所有设备”,我指的是所有带棒棒糖的三星设备+一些带kk+LG带棒棒糖的三星设备+带棒棒糖的模拟器。Knox从不启用DetEncryptionRequired仅适用于棒棒糖设备。在旧设备上(注3 neo与android 4.4.2和S4 mini与4.4.2),当密钥对加载到密钥库中且未设置屏幕锁时,会显示带有“输入凭证存储密码”(哪个密码??)的弹出窗口。但这并不重要,因为KitKat bug()和我的解决方案只适用于Android>5.0