首先我们要实现这个功能需要确认几个问题

1.如何创建一个Keystore并保证其唯一性
2.如何设置KeyProtection
3.如何把密钥也就是密码放到安卓Keystore里面
4.如何通过指纹获取到Keystore里面存储的密码
5.当指纹变更之后如何失效
6. secret key的作用,对称加密
7.指纹验证通过之后如何获取到存储在Android Keystore里面密文
这个问题可以分成两个问题看待,第一个问题是安卓的Keystore体系,第二个是生物识别

参考文章:
Android指纹识别,看这一篇就够了
Android 保存私密信息-强大的 keyStore
Android KeyStore + FingerprintManager 存储密码

Keystore体系

创建一个密钥(SecretKey)

安卓内部是提供一套Keystore体系用于用户加密的,我们可以通过

 KeyStore androidKeyStore = KeyStore.getInstance(ANDROID_KEY_STORE);//获取到Android的Keystore类

我们所获取的androidKeyStore 就是安卓系统的keystore

“AndroidKeyStore”:这里要先区分下AndroidKeyStore和Android
KeyStore,虽然这两个一样,但是后者中间多了个空格,意义是不一样的,前者是子集,后者是父集,后者包含前者。而AndroidKeyStore主要是用来存储一些密钥key的,存进该处的key可以为其设置KeyProtection,例如只能通过用户验证才能取出key使用等。这些key是存在系统里的,不是在app的目录下,并且每个app不能访问其他app的key,如果app1创建了key1,并且存储的时候命名为temp,app2去通过temp去访问key,是获取不到的!!
KeyStore.getDefaultType():该函数返回的是一个字符串,在java下,返回的是JKS,在Android下,返回的是BKS(
生成android使用的BKS证书)。(注:android
系统中使用的证书要求以BKS的库文件结构保存,通常情况下,我们使用java的keytool只能生成jks的证书库。读取key可以通过psw来读取)。当你使用这个keystore的时候,其文件存放在data(沙盒中)

之后我们需要对这个Keystore做一下初始化参数,我们才能生成一个真正属于自己的可以加密的系统

 KeyStore androidKeyStore = KeyStore.getInstance(ANDROID_KEY_STORE);androidKeyStore.load(null);KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder(DEFAULT_KEY_NAME,KeyProperties.PURPOSE_ENCRYPT |KeyProperties.PURPOSE_DECRYPT).setBlockModes(KeyProperties.BLOCK_MODE_CBC).setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)//这个设置为true,表示这个key必须是通过了用户认证才可以使用.setUserAuthenticationRequired(true).build();keyGenerator.init(spec);SecretKey secretKey = keyGenerator.generateKey();

其中 androidKeyStore.load(null);这一点尤其关键
load

Added in API level 1 public final void load (InputStream stream,
char[] password) Loads this KeyStore from the given input stream. A password may be given to unlock the keystore (e.g. the
keystore resides on a hardware token device), or to check the
integrity of the keystore data. If a password is not given for
integrity checking, then integrity checking is not performed. In order
to create an empty keystore, or if the keystore cannot be initialized
from a stream, pass null as the stream argument. Note that if this
keystore has already been loaded, it is reinitialized and loaded again
from the given input stream.

Google官方文档给出的解释,load(null)是重新创建一个新的Keysotre密钥库

加密

接下来我们获取到了密钥,然后我们就可以初始化Cipher 对象,这将是实际的加密过程

 Cipher cipher = null;cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/"+ KeyProperties.BLOCK_MODE_CBC + "/"+ KeyProperties.ENCRYPTION_PADDING_PKCS7);cipher.init(Cipher.ENCRYPT_MODE, secretKey);return cipher;

我们获取到的Cipher就是密文
同时这里我们需要获取到IV初始化向量,这个东西很重要,对于未来我们做解密的时候获取密码的唯一性很重要
引入了一个新的概念:初始向量IV(Initialization Vector)。

IV是做什么用的呢?它的作用和MD5的“加盐”有些类似,目的是防止同样的明文块始终加密成同样的密文块。

  byte[] iv = cipher.getIV();

这个iv需要保存好,是为了之后解密的时候我们定义其唯一性

解密

 Cipher cipher = null;cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/"+ KeyProperties.BLOCK_MODE_CBC + "/"+ KeyProperties.ENCRYPTION_PADDING_PKCS7);IvParameterSpec ivParameterSpec = new IvParameterSpec(initializeVector);cipher.init(Cipher.DECRYPT_MODE,secretKey , ivParameterSpec);

生物识别体系

生物识别,这里我主要是实现了指纹识别,
在安卓体系下,提供了API23和API28的系统生物识别类,23的FingerprintManager 以及28的BiometricPrompt
至于两者的区别网上有很多研究,这里先不管 主要说核心方法

API23

new FingerprintManager.CryptoObject(Cipher cipher);

API28

new BiometricPrompt.CryptoObject(Cipher cipher); //这里就用到了上文中通过Keystore生成的密文了

我的理解是通过这一步就是实现了 Keystore和生物识别的绑定

之后我们会获取到 CryptoObject
然后调用 各自的 authenticate()方法就可以获取系统指纹的回调了

然后我们就可以实现生物识别功能了,关于里面的参数以及错误码的监听,网上的攻略比较多,我开头留的文章就可以找到

总结:这篇文章主要讲了如何通过生物识别把密码保存到Keysotre里面,然后生物识别通过之后取出密码的过程,有些地方写的不是很全,但是总体来说是没问题的。

Android 免密支付+Keystore体系相关推荐

  1. 每日新闻:华为发布5大AI战略;支付宝建议苹果用户调低免密支付额度;胡润百富榜:马云居首马化腾第三;微软重新推送新版Win10...

    关注中国软件网 最新鲜的企业级干货聚集地 今日热点 微软修补数据误删漏洞 重新向测试者推送新版Win 10 微软重新推送Windows 10 October 2018 Update.之前微软推送的更新 ...

  2. 苹果手机免密支付怎么取消_超市“扫码枪”有啥神奇功能?直接扫走你的资金,不用输入密码|移动支付|手机|免密...

    在如今移动支付盛行的时代里,现金已经渐渐淡去在我们的视线当中,出门一部手机就可以搞定很多的事情,相比现金支付,移动支付的便捷性确实要强上太多.随着移动支付的发展,又延伸出越来越多的支付方式,比如密码支 ...

  3. 微信支付分免密支付接口服务如何开通?

    1.支付分免密扣款的实现流程: 用户使用完服务,商户调用支付分完结接口发起扣款,微信支付将代商户进行免密代扣. 若扣款失败,商户无需再次发起扣款申请,微信支付将按一定频次,再次发起免密代扣,直到扣款成 ...

  4. 苹果免密支付怎么关闭_有人苹果手机被盗刷了!那是设置有问题...

    最近在家憋的实在难受,唯一能出门的理由也就是下楼买菜了... 付款的时候,意外的发现自己开启了「免密支付」,虽说很方便,但总觉得有一丝不安全. 这不我刚在网上看到一个新闻,某位 iPhone 用户的 ...

  5. 微信小程序开发-微信支付之免密支付(自动扣费)一 小程序+java接口

    微信小程序开发-微信支付之免密支付(自动扣费)一 小程序+java接口 链接: 点击进入

  6. 苹果怎么取消微信订阅服务器,教程:取消微信免密支付授权功能设置

    随着移动支付的飞速发展,第三方支付平台也越来越多,特别是微信支付宝的普及,给大家带来了极大的便利.之前我们出门必备的银行卡.现金等已经被一部手机取代了.回想一下,小编已经记不清自己上次带钱包出门是什么 ...

  7. 微信免密支付服务器忙,用了几天,我仍然没有弄清微信停车这个免密支付的意义...

    经常进 ETCP 的停车场,提示开通免密支付,说首次还有优惠,那就开通吧,可是发现并没有优惠,当然今天不谈优惠的事.问题是,我开通了,出场时并没有抬杆,也没有自动扣费,我就懵了,这个免密支付的意义是啥 ...

  8. 苹果手机免密支付怎么取消_小心你手机APP上的免密支付!有人3分钟被盗刷8000多元...

    最近有微博网友称,自己的微信零钱3分钟内被盗刷了13笔,总金额8000多元,这位网友质疑苹果应用商店里的免密支付权限给自己的资金带来隐患.而南宁市民小程近日也向记者反映,自己的微信零钱被一款软件扣除了 ...

  9. iPhone免密支付被盗刷上千万,三招教你保护钱包安全!

    最近iPhone用户有点慌,这次不是手机质量出问题,而是iPhone免密支付出现巨大漏洞.近千名绑定 Apple ID 付款的用户出现了被盗刷的情况,当中更有用户损失高达 10 万元,据统计,被盗刷用 ...

最新文章

  1. 对于未来的多种可能,这几位中国科学家想说
  2. 【 Vivado 】时钟组(Clock Groups)
  3. HDU6376 度度熊剪纸条
  4. gRPC学习记录(二)--Hello World
  5. 原生javascript
  6. python中减法运算函数_详解 Python 的二元算术运算,为什么说减法只是语法糖?...
  7. 使用 store 来优化 React 组件
  8. mybatis介绍(一)
  9. MFC 改变控件字体大小
  10. BZOJ2241 [SDOI2011]打地鼠 【模拟】
  11. java 数字千分位_java实现数字千分位的显示
  12. 计算机一级cad试题,全国计算机等级考试一级试题与答案(25套)(1)2
  13. JavaScript高级程序设计(第三版)阅读笔记
  14. 【Python】美国大选献金项目数据分析(concat(),lambda(),groupby(),pivot_table())
  15. Chapter8(周旭)
  16. eclipse neon Java编辑器页面字体更改
  17. UPC——2020年春混合个人训练第二十五场(FG)
  18. java 中加载图片
  19. Android R.java类的手动生成
  20. matlab电力电子仿真小结,基于matlab的电力电子仿真(设计报告)

热门文章

  1. Redis 事务机制实现过程及原理,以及使用事务机制防止库存超卖
  2. 查询选修了全部课程的学生的信息
  3. sersync+rsync部署与使用
  4. 设置docker开机自启动 docker compose设置容器自启动
  5. vue,v-html如何识别\n换行符
  6. 防止客户不付尾款的方法
  7. 项目组织机构之职能型、项目型、矩阵型(强/平衡/弱)
  8. 波浪下划线怎么设置_下划线双波浪怎么设置
  9. 面试官:分布式锁用Redis好?还是Zookeeper好?
  10. 基于单片机的太阳能杀虫系统