Android Keychain:什么是系统范围的凭证?

信息安全 安卓
2021-09-10 16:51:35

关于 keystore 系统的 Android 文档有一个小节Choose between a keychain or the Android keystore provider,它说当我们需要系统范围的凭据时,我们应该使用 KeyChain API。什么是系统范围的凭证?我应该什么时候使用它?你能用一个例子解释一下吗?

1个回答

在回答您的问题之前,我需要确保您具备KeyStoreAndroid 密钥库系统的基本知识。因此,在开始时,如果您需要,我将介绍这些术语的一些基本概述。之后,我将尝试回答您的问题。

密钥库

KeyStore 可以根据上下文定义为数据库、API 甚至是类。为简单起见,可以将 KeyStore 定义为别名密钥和证书的安全集合。通常,密钥库保存在文件存储中,并受密码保护。

Android 密钥库系统

如果我们阅读官方文档,它会

Android Keystore 系统允许您将加密密钥存储在一个容器中,以使其更难以从设备中提取。一旦密钥在密钥库中,它们就可以用于加密操作,而密钥材料仍然不可导出。

所以,从上面的陈述我们可以推断,它让你,

  1. 存储加密密钥(私钥、公钥
  2. 使用存储的密钥执行加密操作(加密、解密、签名、验证等

现在您可能想知道,它在哪里以及如何存储这些凭据?实际上,它通过 KeyChain API 或 AndroidKeyStore 提供程序功能将凭据存储在系统凭据存储或 KeyStore 中。为了更好地理解,让我们了解一下他们的历史,

Android 1.6 (Donut) 中引入了系统 KeyStore。但不幸的是,当时应用程序无法访问它,因为它的访问权限仅限于 VPN 和 Wifi 身份验证。因此,应用程序正在维护自己的 KeyStore。没关系,但有时当多个应用程序希望在它们之间共享通用凭据时,它会导致可管理性问题。为了解决这个问题,Android 4.0 (ICS) 引入了 KeyChain API,允许应用程序在用户许可的情况下访问系统 KeyStore。

钥匙链

使用 KeyChain API,应用程序可以通过提示系统对话框请求用户安装或选择凭据。它还允许应用程序列出和访问存储在系统 KeyStore 中的允许凭据。最有趣的是,应用程序不必使用单独的密码来保护系统密钥库,因为它受到锁屏和设备管理的保护。任何应用程序导入的凭据都可以在用户许可的情况下被其他应用程序访问。您还可以通过导航到设置>安全和锁定屏幕>加密和凭据>用户凭据来查看系统设置中的用户凭据列表。(设置路径和菜单可能因设备制造商和操作系统版本而异。它是基于我的一加 6 给出的。见截图

AndroidKeyStore 提供程序功能

此功能是在 Android 4.3(API 级别 18)中引入的,用于让应用程序生成、存储其凭据在系统密钥库中,该系统密钥库只能由应用程序本身访问。要执行操作,不需要用户交互。

我想我已经完成了提供足够的信息以继续回答您的问题。现在让我们试着回答你的问题,

什么是系统范围的凭证?

通常,使用 KeyChain API 存储的凭证是系统范围的凭证。因为如果用户允许,它们可以被系统内的任何其他应用程序使用。另一方面,使用 AndroidKeyStore 提供程序功能存储的凭据只能由应用程序本身使用。

我应该什么时候使用它?你能用一个例子解释一下吗?

当您在同一设备上安装了多个应用程序需要使用一组通用的共享凭据与同一服务器通信时,您应该使用它。例如,您有一个电子邮件应用程序和一个浏览器应用程序,它们使用相同的凭据集与同一后端服务器通信。KeyChain API 允许您使用电子邮件应用程序和浏览器应用程序都可以使用的相同凭据,因为它们是系统范围的凭据。此类凭证还可用于 VPN、SSL 身份验证、数字签名和加密/解密等。

希望您现在对 Android Keystore 系统有一个清晰的了解。我将不胜感激任何类型的更正,因为我并不完美。


更新

为了消除您的困惑,我想根据可管理性将 Keystore 分为以下两类,

  1. 自我管理的密钥库,您负责将密钥库保存在文件中或从该文件中检索它,以及生成密钥或将密钥导入该密钥库。本文档展示了如何实现自我管理的 Keystore。
  2. 系统管理的密钥库,系统负责将密钥库存储或检索到只能由系统访问的文件中。Android System 提供KeyChainAndroid Keystore provider两个 API来访问系统管理的 Keystore。现在让我们看看这两个 API 的区别,

KeyChain 与 Android Keystore 提供程序

  • KeyChain API 中,您需要自己生成密钥并通过此 API 导入。另一方面Android Keystore 提供程序允许您生成密钥并将其导入到系统管理的 Keystore 中。
  • 使用KeyChain API导入的密钥可在整个系统中共享。这就是为什么它被称为系统范围的凭证。一旦应用使用 KeyChain API 将密钥导入系统 Keystore 中,不仅该应用可以访问该密钥,其他应用也可以使用 KeyChain API 访问该密钥。另一方面,使用Android Keystore 提供程序生成或导入的密钥是不可共享的,即密钥只能由生成或导入密钥的应用程序访问。由于系统中的其他应用程序无法使用 Android Keystore 提供程序 API 访问密钥,因此它们不被视为系统范围的凭据。

我希望上面的解释有所帮助。如果您有进一步的困惑,请告诉我。