我在http://developer.android.com/training/articles/keystore.html中阅读了Android文档 但是我错过了一些细节......
如果应用程序使用AndroidKeyStore生成密钥(对称或非对称)。
我们可以从该密钥库中提取密钥吗?
另一个应用程序(AppB)可以访问AppA生成的密钥吗?
在哪些情况下可能丢失钥匙?设备出厂仅重置?
感谢。
答案 0 :(得分:23)
您可以使用普通KeyStore文件或Android KeyStore Provider。
您必须创建一个KeyStore文件,您还必须管理访问它的秘密。这个秘密非常敏感,难以向攻击者隐瞒。我个人更喜欢将这个责任委托给Android系统,这就是为什么我不选择这个解决方案而不是下一个。
使用此API,您将委派在Android上管理文件和机密的所有繁重工作。您不需要使用任何密码,因为操作系统本身将存储它来自您的锁屏PIN码,密码,模式和其他变量。
如果设备包含嵌入式安全硬件,则密钥将存储在(例如,可信执行环境(TEE))中。您可以检查KeyInfo#isInsideSecureHardware()方法以查看密钥是否保存在那里。如果我们的应用程序遇到受损的Linux内核,这种硬件机制为我们提供了额外的保护。
此外,从Android 9(API级别28)开始,为包含安全芯片的设备(如Google Pixel 3上的Titan M)引入了StrongBox Keymaster API。如果您在Android 28或更高版本上运行,则只需调用setIsStrongBoxBacked(boolean)方法即可让Android知道您希望在设备上使用它时使用它。尽管上述TEE解决方案是可以接受的,但使用安全元件(SE)的这种机制是最安全的,因为它基于为安全目的而设计的不同硬件(CPU,内存,存储等)。
在这里,我们将举例说明如何使用 StrongBox 创建自签名证书和密钥对,如果支持的话:
KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore")
.apply {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
initialize(
KeyGenParameterSpec.Builder(alias, KeyProperties.PURPOSE_ENCRYPT)
.setKeyValidityStart(keyValidityStart)
.setKeyValidityEnd(keyValidityEnd)
.setCertificateSerialNumber(BigInteger.valueOf(1L))
.setCertificateSubject(X500Principal("CN=MyCompany"))
.setIsStrongBoxBacked(true) /* Enable StrongBox */
.build()
)
} else {
initialize(
KeyGenParameterSpec.Builder(alias, KeyProperties.PURPOSE_ENCRYPT)
.setKeyValidityStart(keyValidityStart)
.setKeyValidityEnd(keyValidityEnd)
.setCertificateSerialNumber(BigInteger.valueOf(1L))
.setCertificateSubject(X500Principal("CN=MyCompany"))
.build()
)
}
}
.also {
val keyPair = it.generateKeyPair()
}
关于你的问题:
我们可以从KeyStore中提取密钥吗?
如果这是你的意思,那么你的应用可以获得PrivateKey并使用它。
另一个应用程序(AppB)可以访问AppA生成的密钥吗?
使用KeyStore提供程序解决方案,每个应用程序只能访问其KeyStore实例或别名。相反,如果另一个应用程序有权访问该文件,则使用普通的KeyStore可能会尝试攻击它。
在哪种情况下我们可能会松开钥匙?设备出厂仅重置?
删除应用程序将清除应用程序的KeyStore提供程序实例。但是,由于Android的a nasty bug(在Android 5之前更常见)如果用户将锁屏模式更改为密码或仅删除模式,KeyStore将完全损坏。当用户从Android设置执行“清除凭据”时,也会发生相同的情况。使用经典的KeyStore,您可以将其存储在外部存储中,并在设备恢复出厂设置后保留。但是,如前所述,它仍然不如提供者安全。
我在某些方面可能是错的,但这是我学到的东西,我只是分享了我的经验。希望这对你有所帮助。