Android Keystore系统如何安全?

Ana*_*AJI 21 android android-keystore

我在http://developer.android.com/training/articles/keystore.html上阅读了Android文档 但是我遗漏了一些细节......

如果应用程序使用AndroidKeyStore生成密钥(对称或非对称).

我们可以从该密钥库中提取密钥吗?

另一个应用程序(AppB)可以访问AppA生成的密钥吗?

在哪些情况下可能丢失钥匙?设备出厂仅重置?

谢谢.

GoR*_*RoS 29

您可以使用普通的KeyStore文件或Android KeyStore Provider.

KeyStore(API 1)

您将不得不创建一个KeyStore文件,您还必须管理访问它的秘密.这个秘密非常敏感,难以向攻击者隐瞒.我个人更喜欢在Android系统上委托这个责任,这就是为什么我不选择这个解决方案而不是下一个.

Android KeyStore Provider(API 18)

使用此API,您将委派在Android上管理文件和机密的所有繁重工作.您不需要使用任何密码,因为操作系统本身将存储它来自您的锁屏PIN码,密码,模式和其他变量.

如果设备包含嵌入式安全硬件,则密钥将存储在那里(例如,可信执行环境(TEE)).您可以检查KeyInfo#isInsideSecureHardware()方法以查看密钥是否保存在那里.如果我们的应用程序遇到受损的Linux内核,这种硬件机制为我们提供了额外的保护.

此外,从Android 9(API级别28)开始,StrongBox Keymaster API被引入用于包含安全芯片的设备(如Google Pixel 3上的Titan M).如果你在Android 28或更高版本上运行,你只需要调用setIsStrongBoxBacked(boolean)方法让Android知道你想要使用它,如果它在设备上可用的话.尽管上述TEE解决方案是可接受的,但使用安全元件(SE)的这种机制是最安全的,因为它基于为安全目的而设计的不同硬件(CPU,存储器,存储器等).

在这里,我们将有一个快速示例,说明如何使用StrongBox创建自签名证书和密钥对(如果支持):

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore")
        .apply {
            val certBuilder = KeyGenParameterSpec.Builder(alias, KeyProperties.PURPOSE_ENCRYPT)
                .setKeyValidityStart(keyValidityStart)
                .setKeyValidityEnd(keyValidityEnd)
                .setCertificateSerialNumber(BigInteger.valueOf(1L))
                .setCertificateSubject(X500Principal("CN=MyCompany"))

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                initialize(
                    certBuilder
                        .setIsStrongBoxBacked(true) /* Enable StrongBox */
                        .build()
                )
            } else {
                initialize(certBuilder.build())
            }
        }
        .also {
            val keyPair = it.generateKeyPair()
            ...
        }
}
Run Code Online (Sandbox Code Playgroud)

关于你的问题:

我们可以从KeyStore中提取密钥吗?

使用它们,你的应用程序可以获得PrivateKey并使用它,如果这是你的意思.

另一个应用程序(AppB)可以访问AppA生成的密钥吗?

使用KeyStore提供程序解决方案,每个应用程序只能访问其KeyStore实例或别名.相反,使用普通的KeyStore,如果另一个应用程序有权访问该文件,它可能会尝试攻击它.

在哪种情况下我们可能会松开钥匙?设备出厂仅重置?

删除应用程序将清除应用程序的KeyStore提供程序实例.然而,由于一个讨厌的错误的Android(安卓前5多见)如果用户更改锁屏模式进入密码或只是删除模式,密钥库将完全损坏.当用户从Android设置执行" 清除凭据 " 时,也会发生相同的情况.使用经典的KeyStore,您可以将其存储在外部存储中,并在设备恢复出厂设置后保留.但是,如前所述,它仍然不如提供者安全.

我在某些方面可能是错的,但这是我学到的东西,我只是分享了我的经验.希望这对你有所帮助.