Android密钥库系统如何安全?

Android密钥库系统如何安全?,android,android-keystore,Android,Android Keystore,我阅读了Android的文档 但我遗漏了一些细节 如果应用程序使用AndroidKeyStore生成密钥(对称或非对称) 我们能从密钥库中提取密钥吗 另一个应用程序(AppB)能否访问AppA生成的密钥 在哪些情况下可能会丢失钥匙?仅设备出厂重置 谢谢。您可以使用普通文件或 密钥库(API 1) 您必须创建密钥库文件,还必须管理密钥才能访问它。这个秘密非常敏感,很难向攻击者隐瞒。就我个人而言,我更喜欢将这一责任委托给Android系统,这就是为什么我不选择这个解决方案而不是下一个解决方案 And

我阅读了Android的文档 但我遗漏了一些细节

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

我们能从密钥库中提取密钥吗

另一个应用程序(AppB)能否访问AppA生成的密钥

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

谢谢。

您可以使用普通文件或

密钥库(API 1) 您必须创建密钥库文件,还必须管理密钥才能访问它。这个秘密非常敏感,很难向攻击者隐瞒。就我个人而言,我更喜欢将这一责任委托给Android系统,这就是为什么我不选择这个解决方案而不是下一个解决方案

Android密钥库提供程序(API 18) 使用此API,您将在Android上委托管理文件和机密的所有繁重工作。您不需要使用任何密码,因为操作系统本身将存储来自您的锁屏PIN码、密码、模式和其他变量的密码

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

此外,从安卓9(API级别28)开始,API被引入到包括安全芯片(如谷歌Pixel 3上的Titan M)的设备中。如果你在安卓28或更高版本上运行,你只需要调用该方法,让安卓知道你想要使用它,如果它在设备上可用的话。尽管上述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()
            ...
        }
}
关于你的问题:

我们能从密钥库中提取密钥吗

如果这是你的意思,你的应用程序可以通过这两种方式获得并使用它

另一个应用程序(AppB)能否访问AppA生成的密钥

使用密钥库提供程序解决方案,每个应用程序只能访问其密钥库实例或别名。相反,如果另一个应用程序可以访问该文件,则可以使用普通密钥库,并尝试对其进行攻击

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

删除应用程序将删除应用程序的密钥库提供程序实例。但是,由于Android的复杂性(在Android 5之前更常见),如果用户将锁屏模式更改为密码或只是删除该模式,则密钥库将完全损坏。当用户从Android设置执行“清除凭证”时,也会发生同样的情况。使用经典密钥库,您可以将其存储在外部存储器中,即使在设备出厂重置后也可以保留它。但是,如前所述,它仍然不如提供者安全


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

1)您应该确保密钥库的安全,并且在任何情况下都不能共享密钥库2)密钥库中的密钥需要密码,尽管我想一切都有可能,所以请参见第1点3)我不确定我是否理解这个问题,但通常我会说不,至少不是私钥(用于签署应用程序)4)这一个我也不确定,只要你有密钥库,你就可以使用它创建一个签名的应用程序,但同样如此。它不应该存储在设备或类似设备上谢谢您的回答,但我不是说我们用来签署应用程序的密钥库。我在问题中添加了Android文档。好吧,然后我误解了:-)nvmThanks,它对我真的很有帮助。@Herman:您是否使用Android密钥库提供程序来存储密钥?