bka*_*ale 3 encryption android private-key
当我们使用以下代码创建键集时:
val generator = KeyPairGenerator.getInstance(RSA)
generator.initialize(KEY_SIZE)
val keyPair = generator.genKeyPair()
Run Code Online (Sandbox Code Playgroud)
然后当我们调用以下命令时:
val cipher = Cipher.getInstance(RSA_TRANSFORMATION)
cipher.init(Cipher.DECRYPT_MODE, privateKey)
Run Code Online (Sandbox Code Playgroud)
init 方法的执行在 0-2 毫秒内完成。
但是,当我们尝试使用以下命令创建密钥时,我们需要将私钥存储在 keystore 中:
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()
Run Code Online (Sandbox Code Playgroud)
相同的 init 方法执行时间超过 35-40 毫秒。另外,如果我们注释 setEncryptionPaddings 和 setDigest,则 init 方法会抛出异常。
预期输出:能够将私钥存储在 KeyStore 中并在 0-2 毫秒内执行 init 方法,就像没有提供程序生成器一样。
AndroidKeyStore 总是会比进程内密钥操作慢得多。
当您执行进程内密钥生成时,会发生对 BoringSSL 加密库的 JNI 调用。没有 IPC 调用,没有上下文切换等。 BoringSSL 将对内核进行一些系统调用以获取随机位(来自 /dev/random),并且有很小的机会触发对硬件真随机数生成器的一些调用,但不多。
当您在 AndroidKeyStore 中生成密钥时会发生什么(粗略地说;硬件绑定器调用下面的所有内容都依赖于实现,因此您必须与设备制造商联系以了解详细信息):
我认为 AndroidKeyStore 的性能可以提高,但从根本上来说,它必须比进程内密钥生成做更多的事情,并且所有这些 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。)
| 归档时间: |
|
| 查看次数: |
502 次 |
| 最近记录: |