- 锁屏
- 选择一个钥匙
- 密钥存储
- 密钥生成
- 密钥管理
- 加密与解密
- 使用范例
- 下一步是什么
- 安全提示
如果要保护数据,请保护设备。
为了更加安全,在提供对任何应用程序功能的访问权限之前,我们可以要求用户设置其设备的锁屏(如果尚未设置)。另外,我们将在本系列的稍后部分中介绍的其他一些功能(例如指纹)也需要设置锁定屏幕。
还有一项特殊的系统服务-KeyguardManager,可以帮助我们完成此任务。
isDeviceSecure 方法-检查设备是否用PIN,码型或密码保护。可从API 23获得。
isKeyguardSecure 方法-检查键盘锁是否由PIN,图案或密码保护,或者当前是否已锁定SIM卡。可从API 16获得。这不是最佳选择,因为它还在检查SIM卡是否被锁定,但总比没有好。
秘密守护者,注册屏幕
现在,在“活动”中,只需检查设备是否已使用锁定屏幕进行保护,如果没有,则显示安全警报。
现在,当使用锁屏保护设备时,我们可以集中精力于应用程序敏感的数据保护,例如用户主密码和机密我们已经知道加密将用于此目的。首先,我们需要选择要使用的密钥(对称,非对称)和算法。
我们也知道,对称密钥可从Android 23+ API获得,而非对称密钥可从18+ API获得。我们的选择是可以预测的,我们将使用非对称密钥,但是仍然选择哪种算法?让我们在文档中寻求帮助:
Android密钥存储系统。可用的密码转换,格式为:算法/模式/填充
RSA-我们可以在API 18+设备上用于Android密钥存储非对称密钥的唯一一种可用算法。
在Android上,加密密钥存储在中:
还有一种架构方法,该方法通过遍历已注册安全提供者的列表(从最喜欢的 一个)开始创建具有给定类型的实例。我们将搜索“ AndroidKeyStore ”类型。
还有另一个Fabric方法:— 从指定的Provider 返回指定类型的对象。
基本上称之为:
与调用几乎相同:
但是请注意,如果在不同的提供程序中有多个具有相同名称的注册类型,则method将返回它们中的第一个匹配结果。这有两个不同的方面:
- 您(或设备供应商)可以创建自己的Provider,并将其设置为最喜欢的,只需设置其位置即可(在本系列文章的后面部分中,您将了解如何进行设置)。从理论上讲,这可能会导致一些混乱,您会出错,而不是预期的密钥存储类型。
- 另一方面,这种方法可用于解决一些兼容性问题,即系统将在另一个Provider中添加新类型的实现,并保持相同的名称约定(还有另一个系统Provider,称为“ AndroidKeyStoreBCWorkaround”,我们将在“加密和解密”段落)。这使我们可以在不同的API上保持相同的工作代码,这很酷。
到目前为止,该方法一直对我有效。文档样本也引用了此方法,因此,我建议您使用它来获取实例,而不是其他方法。
如果您仍然有疑问或某些功能无法正常使用,请使用和方法来验证所创建实例的详细信息。
获取实例之后,您必须调用方法,该方法将基于提供的加载密钥存储数据。
保护参数可用于检查密钥存储数据的完整性,或用于保护敏感密钥存储数据(例如PrivateKey)的机密性。
对于提供者,我们只需要作为参数传递,系统将根据我们的应用程序标识符将数据加载到后台。
在Android上,非对称加密密钥的创建方式如下:
与密钥存储区类似,有一种fabric 方法,应使用该方法来创建密钥。
该方法还有另一个简化版本。不要使用它。这种方法在所有现有的提供程序中搜索算法,与密钥库不同,密钥存储区我们使用的是非常独特的“ AndroidKeyStore ”类型,算法名称在不同的提供程序中很常见(“ RSA ”几乎无处不在)。在这里,我们需要显式定义我们要使用的提供程序。
实例必须使用规范初始化。在M之前,应使用class提供它:
在Android密钥存储区中,每个密钥必须具有一个标识符-alias。如果您尝试使用已存在的别名将密钥保存到密钥存储中,它将被新密钥覆盖。使用builders方法提供别名。
非对称密钥必须使用证书签名。它主要用于客户端-服务器通信中,其中客户端(或服务器)正在验证证书,以确保服务器确实是他声称的身份(而不是中间人)。没有证书,您将无法保存非对称密钥。
如果在一个应用程序中都希望同时使用公钥和私钥,则只需创建一个伪造的,自签名的证书即可。
证书需要一个开始日期和结束日期(有效期),可以使用和构建器方法进行设置。另外,您还需要提供序列号和证书主题,可以与and builder方法一起使用。
伪造的自签名证书的打印输出:
提供关键细节后,初始化的使用规范实例方法。
在M中被介绍。它用于初始化非对称和对称密钥。不推荐使用。
要求指定密钥用法的目的。例如,使用创建的密钥不能用于解密。
另外,您必须指定要与此密钥一起使用的阻止模式和加密填充(请参阅“ 加密,模式和填充”)。使用和构建方法。
不再需要手动定义伪造的证书,它将自动执行。您仍然可以使用以下方法自定义默认值:
最后,当实例使用规范初始化时,使用方法创建私钥-公钥对。在Android Key Store提供程序中,此方法将自动 保存 键入 。
提供的方法可以帮助我们管理保存的密钥:
getKey(“ alias”,“ password”) —返回具有给定别名的键,如果给定别名不存在或未标识与键相关的条目,则返回null。在Android Key Store中,不需要密码。
getCertificate(“ alias”) —返回证书,如果给定的别名不存在或不包含证书,则返回null。
deleteEntry(“ alias”) —删除具有给定别名的密钥。 如果无法删除该条目,将被抛出。
完整的源代码在这里。
在Android上,加密和解密是通过进行的:
有一种结构方法,即在现有的提供程序之间搜索给定的转换(就像我们在上面回顾的其他加密组件中一样),应将其用于创建实例。
转换表示将用于加密或解密的算法,格式为:“算法/模式/填充”。
这里还存在可以显式指定Provider的Method 。但是请注意,您不应将其与Cipher一起使用。
如您所见,从技术上讲,提供程序不向密码提供RSA算法。而是有和提供者,他们知道如何为该算法使用提供者密钥。
要开始使用实例,我们需要使用Key将其初始化以进行特定操作。使用方法with对其进行初始化以进行加密:
或使用with方法来初始化用于解密的密码:
初始化后,使用方法,使用此密码来处理加密或解密的数据。
您可以根据需要多次重新初始化创建的密码实例。
完整的源代码在这里。
总结一下我们正在讨论的所有内容,让我们尝试加密和解密简单的“ Hello World”消息: