当我们使用以下代码创建密钥集时:
val generator = KeyPairGenerator.getInstance(RSA)
generator.initialize(KEY_SIZE)
val keyPair = generator.genKeyPair()
然后,当我们调用以下内容时:
val cipher = Cipher.getInstance(RSA_TRANSFORMATION)
cipher.init(Cipher.DECRYPT_MODE, privateKey)
init方法的执行在0到2毫秒内完成。
但是当我们尝试使用以下命令创建密钥时,我们需要将私钥存储在密钥库中:
val keyPairGenerator = KeyPairGenerator.getInstance("RSA", "AndroidKeyStore")
keyPairGenerator.initialize(keyGenParameterSpecBuilder.getProvider()
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP)
.setDigests(KeyProperties.DIGEST_SHA1)
.setKeySize(KEY_SIZE)
.build())
keyPairGenerator.genKeyPair()
相同的init方法执行需要35至40毫秒以上的时间。另外,如果我们评论setEncryptionPaddings和setDigest,则init方法将引发异常。
预期输出: 能够像在没有提供者生成器的情况下一样,在0-2毫秒内将私钥存储在KeyStore中并执行init方法。
答案 0 :(得分:1)
AndroidKeyStore总是比进程中的键操作要慢得多。
当您进行进程内密钥生成时,将发生对BoringSSL加密库的JNI调用。没有IPC调用,没有上下文切换,等等。BoringSSL将对内核进行一些syscall以获取随机位(来自/ dev / random),并且极有可能触发对硬件真正随机数生成器的某些调用,但可能性不大
当您在AndroidKeyStore中进行密钥生成时会发生什么情况(大致;硬件绑定程序调用之下的所有内容都取决于实现,因此您必须与设备制造商联系以了解详细信息):
我认为可以改进AndroidKeyStore的性能,但从根本上说,它必须比进程内密钥生成还要执行 lot ,并且所有这些IPC都需要时间。
您将获得额外的时间来换取更大的安全性。使用进程内加密,破坏您的应用程序的攻击者可以获取私钥的副本,然后可以使用其执行任何操作。借助AndroidKeyStore,攻击您应用程序的攻击者可以像您的应用程序一样使用密钥,但是他们无法从设备中提取密钥,因此无法在其他任何地方使用它。另外,如果您在使用方式上添加了一些限制(例如,仅在用户进行身份验证时),那么攻击者就不会违反这些限制。
即使攻击者不仅危害您的应用程序,而且危害密钥库守护程序,HAL服务甚至Linux内核本身,这些安全保证仍然有效。要真正提取密钥,攻击者必须破坏受信任的应用程序或受信任的操作系统。这不是不可能(什么都没有),但是要困难得多。
为完整起见,我还应该提到KeyGenParameterSpec.Builder.setIsStrongBoxBacked(true)
,它在API级别28中可用。在支持StrongBox的设备上(当前数量不多,但这会改变),您的密钥将不会在运行于在主CPU的安全模式下,它将在专用的安全处理器(嵌入式安全元素或类似的“ StrongBox”)中生成。 StrongBox不得与主CPU共享处理器,RAM或其他重要资源,并且必须由认可的测试实验室对其进行正式评估,以防直接渗透,侧通道,故障等方面的安全性。
StrongBox设备通常比移动CPU体积更小,运行速度更慢。原始速度通常会慢两个数量级,尽管它们可以通过专用的加密加速器硬件部分抵消。这意味着,如果您使用KeyGenParameterSpec.Builder.setIsStrongBoxBacked(true)
,则预期不会是40毫秒,而是400毫秒,甚至1000毫秒。另一方面,从StrongBox设备中提取任何秘密都是非常困难的。如果国家情报机构足够重视的话,他们可能会尽力而为。能力不强的人确实会度过非常艰难的时光。
(顺便说一句:如果要提高性能,应该考虑转储旧的,较慢的RSA。EC的速度要快得多。不幸的是,如果需要非对称加密,AndroidKeyStore尚不支持使用EC进行加密/解密,仅签名/验证。但是,如果可以通过对称加密来实现,则AES和HMAC比EC和RSA都快得多。)
(此外:我是Google工程师,自API级别23开始负责AndroidKeyStore。)