博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Google SDK】 Android 密钥库系统02_两种使用方式
阅读量:5032 次
发布时间:2019-06-12

本文共 3113 字,大约阅读时间需要 10 分钟。

选择密钥链或 Android 密钥库提供程序


  • 在需要系统级凭据时请使用  API。在应用通过  API 请求使用任何凭据时,用户需要通过系统提供的 UI 选择应用可以访问已安装的哪些凭据。因此,在用户同意的情况下多个应用可以使用同一套凭据。
  • 使用 Android 密钥库提供程序让各个应用存储自己的凭据,并且只允许应用自身访问。这样,应用可以管理仅能由自己使用的凭据,同时又可以提供等同于  API 为系统级凭据提供的安全优势。这一方法不需要用户选择凭据。

使用 Android 密钥库提供程序


要使用此功能,请使用标准的  和  或  类,以及在 Android 4.3(API 级别 18)中引入的 AndroidKeyStore 提供程序。

AndroidKeyStore 注册为  类型以用于  方法,而在用于 和  方法时注册为提供程序。

生成新私钥

生成新的  要求您同时指定自签署证书具备的初始 X.509 属性。之后,您可以使用  将证书替换为由证书颁发机构 (CA) 签署的证书。

要生成密钥,请使用  和 

/* * Generate a new EC key pair entry in the Android Keystore by * using the KeyPairGenerator API. The private key can only be * used for signing or verification and only with SHA-256 or * SHA-512 as the message digest. */KeyPairGenerator kpg = KeyPairGenerator.getInstance( KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore"); kpg.initialize(new KeyGenParameterSpec.Builder( alias, KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY) .setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512) .build()); KeyPair kp = kpg.generateKeyPair();

生成新密钥

要生成密钥,请使用  和 

使用密钥库条目

AndroidKeyStore 提供程序的使用通过所有的标准  API 加以实现。

列出条目

通过调用  方法列出密钥库中的条目:

/* * Load the Android KeyStore instance using the the * "AndroidKeyStore" provider to list out what entries are * currently stored. */KeyStore ks = KeyStore.getInstance("AndroidKeyStore"); ks.load(null); Enumeration
aliases = ks.aliases();

签署和验证数据

通过从密钥库提取  并使用  API(例如 )签署数据:

/* * Use a PrivateKey in the KeyStore to create a signature over * some data. */KeyStore ks = KeyStore.getInstance("AndroidKeyStore"); ks.load(null); KeyStore.Entry entry = ks.getEntry(alias, null); if (!(entry instanceof PrivateKeyEntry)) { Log.w(TAG, "Not an instance of a PrivateKeyEntry"); return null; } Signature s = Signature.getInstance("SHA256withECDSA"); s.initSign(((PrivateKeyEntry) entry).getPrivateKey()); s.update(data); byte[] signature = s.sign();

类似地,请使用  方法验证数据:

/* * Verify a signature previously made by a PrivateKey in our * KeyStore. This uses the X.509 certificate attached to our * private key in the KeyStore to validate a previously * generated signature. */KeyStore ks = KeyStore.getInstance("AndroidKeyStore"); ks.load(null); KeyStore.Entry entry = ks.getEntry(alias, null); if (!(entry instanceof PrivateKeyEntry)) { Log.w(TAG, "Not an instance of a PrivateKeyEntry"); return false; } Signature s = Signature.getInstance("SHA256withECDSA"); s.initVerify(((PrivateKeyEntry) entry).getCertificate()); s.update(data); boolean valid = s.verify(signature);

要求进行用户身份验证才能使用密钥

生成密钥或将密钥导入到 AndroidKeyStore 时,您可以指定密钥仅授权给经过身份验证的用户使用。用户使用安全锁定屏幕凭据(模式/PIN/密码、指纹)的子集进行身份验证。

这是一项高级安全功能,通常仅用于有以下要求的情形:在生成/导入密钥后(而不是之前或当中),应用进程受到攻击不会导致密钥被未经身份验证的用户使用。

如果密钥仅授权给经过身份验证的用户使用,可以将其配置为以下列两种模式之一运行:

  • 经过身份验证的用户可以在一段时间内使用密钥。在用户解锁安全锁定屏幕或使用  流程确认其安全锁定屏幕凭据后,即可使用此模式中的所有密钥。每个密钥的授权持续时间各不相同,并由 setUserAuthenticationValidityDurationSeconds 在密钥生成或导入时指定。此类密钥只能在启用安全锁定屏幕时生成或导入(请参阅 )。在安全锁定屏幕停用(重新配置为“无”、“滑动”或不验证用户身份的其他模式)或被强制重置(例如由设备管理员执行)时,这些密钥将永久失效。
  • 用户身份验证会授权与某一密钥关联的特定加密操作。在此模式中,涉及此类密钥的每个操作都需要用户单独授权。目前,此类授权的唯一方式是指纹身份验证:。此类密钥只能在至少注册一个指纹时生成或导入(请参阅 )。一旦注册新指纹或取消注册所有指纹,这些密钥将永久失效。

转载于:https://www.cnblogs.com/qq793963861/p/6482428.html

你可能感兴趣的文章
CentOS6.7源码安装MySQL5.6
查看>>
android Bitmap总结
查看>>
触发器简介
查看>>
JAVA反射机制的学习
查看>>
mysql - rollup 使用
查看>>
Chrome系列 Failed to load resource: net::ERR_CACHE_MISS
查看>>
出现函数重载错误call of overloaded ‘printfSth(double)’ is ambiguous
查看>>
SDUT 1941-Friday the Thirteenth(水)
查看>>
java API连接虚拟机上的hbase
查看>>
c#扩展出MapReduce方法
查看>>
Cookie工具类 - CookieUtil.java
查看>>
[转载]linux下各文件夹的结构说明及用途介绍
查看>>
《敏捷开发绩效管理》扩展阅读(敏捷开发绩效管理,敏捷团队绩效管理)
查看>>
Jquery怎么获取select选中项 自定义属性的值
查看>>
CKEditor (Toolbar Definition)工具栏自定义配置
查看>>
在vscode成功配置Python环境
查看>>
mysql table 最新更新时间
查看>>
个人永久性免费-Excel催化剂功能第37波-把Sqlserver的强大分析函数拿到Excel中用...
查看>>
PHP中字符串比较的常用方法
查看>>
html5--6-2 CSS语法
查看>>