目录
- Java密码体系结构
- Android Key Store
- 样例项目
- 下一步是什么
- 安全提示
Java密码体系结构
Android建立在Java密码体系结构(JCA)的基础上,该体系结构提供了用于数字签名,证书,加密,密钥生成和管理的API。
KeyGenerator —提供用于生成对称加密密钥的公共API。
KeyPairGenerator —一个引擎类,能够使用初始化时所使用的算法来生成私有密钥及其相关的公共密钥。
SecretKey —秘密(对称)密钥。该接口的目的是对所有秘密接口(例如SecretKeySpec)进行分组(并提供类型安全性)。
PrivateKey —私钥(非对称)。该接口的目的是对所有私钥接口(例如RSAPrivateKey)进行分组(并提供类型安全性)。
PublicKey-公钥。此接口不包含任何方法或常量。它仅用于对所有公共密钥接口(例如RSAPublicKey)进行分组(并提供类型安全性)。
KeyPair —此类是密钥对(公共密钥和私有密钥)的简单持有者。它不强制执行任何安全性,并且在初始化时应被视为私钥。
SecureRandom-生成加密安全的伪随机数。我们不会在本系列中直接使用它,但是它在KeyGenerator,KeyPairGenerator组件和Keys实现中被广泛使用。
KeyStore —具有良好数据保护机制的数据库,用于保存,获取和删除密钥。需要每个密钥的输入密码和密码。换句话说,它是您需要创建,读取和更新(使用提供的API)的受保护文件。
证书 -用于验证和保存非对称密钥的证书。
密码 -提供对加密密码的实现的访问权限,以进行加密,解密,包装,解包和签名。
提供程序 -定义了一组可扩展的实现,即独立的API。提供者是不同算法或其自定义项的组。有3d派对提供商,例如Bouncy Castle和Spongy Castle(Bouncy Castle的安卓版本),以及现成的提供商,例如Bouncy Castle的简化版本(我们将对其进行更深入的研究,稍后,在本系列文章中)。
Android Key Store
在18版本的Android中,引入了AndroidKeyStore:
Android密钥存储系统可让您将加密密钥存储在容器中,以使其更难从设备中提取。
一旦密钥进入密钥存储区,就可以将其用于加密操作,而密钥材料仍不可导出。
而且,它提供了限制何时和如何使用密钥的功能,例如要求用户进行身份验证才能使用密钥,或者限制仅在某些加密模式下使用密钥。
AndroidKeyStore是JCA Provider实现,其中:
- 不需要KeyStore密码(真的)
- 关键材料永远不会进入申请流程
- 密钥材料可能绑定到安全硬件(“ 信任区域”)
- 从18岁以上开始提供非对称密钥
- 对称密钥可用于23 +
如果没有它,在Android 18之前,您将需要在本地或外部设备存储中的某个位置创建一个文件,所有密钥都将保留在该文件中(如您所知,提取该文件很容易)。但是随着AndroidKeyStore 您无需创建任何内容,系统将为您管理所有内容:
- 如果设备制造商支持受信任的执行环境(TEE),则您的密钥将保存在此处(最安全的选项);
- 如果设备制造商不支持TEE,则密钥将存储在系统提供的仿真软件环境中。
在这两种情况下,删除应用程序后,密钥都会自动从系统中删除。同样,密钥资料也永远不会暴露给您(我们将在稍后看到)。我们将只处理关键参考,这些参考将传递给KeyStore系统服务,在此基础上,所有涉及关键材料的肮脏工作都已完成。
听起来不错,对吧?但是像往常一样,它充满了惊喜。
样例项目
演示这些API的实际作用的最佳方法是开发示例应用程序,并在您自己的应用程序开发过程中面对实际案例。
秘密守护者,主屏幕
我们的示例应用程序的主要目标是在本地保存用户机密, 并使用Encryption,Fingerprint和Confirm Credentials API 对其进行保护。
要使用该应用程序,用户需要创建一个主 密码(在注册过程中)。该密码将用于保护机密:要添加,查看,编辑和删除已创建的机密,用户需要输入主密码。
什么是秘密?您想要保护的所有内容:Gmail密码,信用卡密码,您的秘密笔记,没人可以看到。
该应用程序本身已经开发并位于GitHub上。在本系列文章中,我们将重点介绍其特定的安全功能实现(而不是其用户界面)。为了更好地了解我们在做什么,让我们看一下此应用程序具有的要求:
- 支持Android 18 +设备(我们希望专注于最佳可用API,但是请放心,本系列文章还将介绍较低API版本的兼容性);
- 仅当设置了“锁定屏幕”时才允许用户访问应用程序(保护的第一步,也是非常重要的一步,如果要保护数据,请保护设备);
- 使用加密保护用户主密码(我们不希望有人通过获取共享的首选项文件并读取密码来获取用户数据);
- 通过加密保护用户的机密(即与密码相同);
- 允许用户使用指纹访问机密(将有单独的文章专门讨论指纹);
- 添加其他“确认凭据”保护(将另外有一篇文章专门介绍“确认凭据”)。