指纹识别

Android指纹认证使用智能手机触摸传感器来认证用户。 Android Marshmallow引入了一组易于使用的触摸传感器API。 在Android Marshmallow之前,访问触摸传感器的方法不是标准的。

使用Android指纹认证有几个好处:

  • 快速和容易使用
  • 安全:指纹可以唯一识别您
  • 网上交易更安全

使用Android指纹认证之前,您需要遵循几个步骤,并且一开始看起来确实很复杂,但是本教程将逐步指导您。

最终结果是一个使用指纹认证的Android应用,如下所示:

Android指纹认证入门

如前所述,启用指纹身份验证需要遵循几个步骤:

  • 确认锁定屏幕是安全的,换句话说,它受PIN,密码或图案的保护
  • 确认智能手机上至少注册了一个指纹
  • 获取对Android密钥库的访问权限,以存储用于加密/解密对象的密钥
  • 生成加密密钥和密码
  • 开始认证过程
  • 实现回调类以处理身份验证事件

仅此而已!..我们将执行这些步骤。

在开始之前,请务必先获得使用触摸传感器和指纹认证的许可。 因此,在Manifest.xml ,我们添加:

<uses-permission android:name="android.permission.USE_FINGERPRINT" />

现在是时候创建处理所有身份验证过程的主要活动类了。

验证Android中的安全锁定屏幕

第一步是验证安全锁定屏幕。 可以完成KeyguardManager和FingerprintManager。 我们使用getSystemService获取这两个管理器的实例:

// Keyguard Manager
KeyguardManager keyguardManager = (KeyguardManager)getSystemService(KEYGUARD_SERVICE);// Fingerprint Manager
fingerprintManager = (FingerprintManager) getSystemService(FINGERPRINT_SERVICE);

现在,我们的身份验证应用程序可以检查是否满足所有安全条件:

private boolean checkFinger() {// Keyguard ManagerKeyguardManager keyguardManager = (KeyguardManager)getSystemService(KEYGUARD_SERVICE);// Fingerprint ManagerfingerprintManager = (FingerprintManager) getSystemService(FINGERPRINT_SERVICE);try {// Check if the fingerprint sensor is presentif (!fingerprintManager.isHardwareDetected()) {// Update the UI with a messagemessage.setText("Fingerprint authentication not supported");return false;}if (!fingerprintManager.hasEnrolledFingerprints()) {message.setText("No fingerprint configured.");return false;}if (!keyguardManager.isKeyguardSecure()) {message.setText("Secure lock screen not enabled");return false;}}catch(SecurityException se) {se.printStackTrace();}return true;
}

请注意,身份验证应用会验证至少已注册一个指纹,否则身份验证过程将无法启动。

下图显示了当应用未找到注册的指纹时的消息错误。

如果一切正常,并且满足所有条件,那么身份验证应用程序将生成密钥并访问Android商店。

访问Android密钥库并生成密钥

下一步是访问Android密钥库并生成用于加密数据的密钥。 该应用程序通过称为generateKey()的单独方法进行操作。

// Get the reference to the key store
keyStore = KeyStore.getInstance("AndroidKeyStore");

那么有必要获取对密钥生成器的引用:

// Key generator to generate the key
keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");

最后,我们必须初始化密钥生成器:

keyGenerator.init( newKeyGenParameterSpec.Builder(KEY_NAME,KeyProperties.PURPOSE_ENCRYPT |KeyProperties.PURPOSE_DECRYPT).setBlockModes(KeyProperties.BLOCK_MODE_CBC).setUserAuthenticationRequired(true).setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7).build());keyGenerator.generateKey();

请注意,我们指定了密钥的用法:加密和解密,并且要求使用密钥本身进行身份验证。 最后,应用程序生成密钥(最后一行)。

下面是完整的方法:

private void generateKey() throws FingerprintException {try {// Get the reference to the key storekeyStore = KeyStore.getInstance("AndroidKeyStore");// Key generator to generate the keykeyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES,"AndroidKeyStore");keyStore.load(null);keyGenerator.init( newKeyGenParameterSpec.Builder(KEY_NAME,KeyProperties.PURPOSE_ENCRYPT |KeyProperties.PURPOSE_DECRYPT).setBlockModes(KeyProperties.BLOCK_MODE_CBC).setUserAuthenticationRequired(true).setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7).build());keyGenerator.generateKey();}catch(KeyStoreException| NoSuchAlgorithmException| NoSuchProviderException| InvalidAlgorithmParameterException| CertificateException| IOException exc) {exc.printStackTrace();throw new FingerprintException(exc);}
}

创建Android密码

密钥准备好后,最后一步是创建使用我们之前生成的密钥的Android Cipher 。 源代码非常简单:

private Cipher generateCipher() throws FingerprintException {try {Cipher cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/"+ KeyProperties.BLOCK_MODE_CBC + "/"+ KeyProperties.ENCRYPTION_PADDING_PKCS7);SecretKey key = (SecretKey) keyStore.getKey(KEY_NAME,null);cipher.init(Cipher.ENCRYPT_MODE, key);return cipher;}catch (NoSuchAlgorithmException| NoSuchPaddingException| InvalidKeyException| UnrecoverableKeyException| KeyStoreException exc) {exc.printStackTrace();throw new FingerprintException(exc);}
}

构建Android指纹应用

现在该组装所有这些方法并创建Android指纹认证应用程序了。 这个应用程序非常简单,它具有MainClass ,可以调用上面显示的方法并启动身份验证过程。

@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);message = (TextView) findViewById(R.id.fingerStatus);Button btn = (Button) findViewById(R.id.authBtn);final FingerprintHandler fph = new FingerprintHandler(message);if (!checkFinger()) {btn.setEnabled(false);}else {// We are ready to set up the cipher and the keytry {generateKey();Cipher cipher = generateCipher();cryptoObject =new FingerprintManager.CryptoObject(cipher);}catch(FingerprintException fpe) {// Handle exceptionbtn.setEnabled(false);}}btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {message.setText("Swipe your finger");fph.doAuth(fingerprintManager, cryptoObject);}});
}

有一些注意事项。 首先,Android应用程序创建一个在身份验证过程中使用的CryptoObject 。 此外,该应用程序显示一个按钮,当用户单击它时,身份验证过程开始。 如果不满足上述初始条件,则禁用该按钮。 要注意的最重要的事情是称为FingerprintHandler新类。 此类是一个接收身份验证过程事件的回调类。 此外,此类使用doAuth方法启动身份验证过程。

Android指纹认证回调

最后一步是创建回调类,以便我们可以接收事件通知,并且可以知道何时身份验证成功或出现问题。 此类扩展了FingerprintManager .AuthenticationCallback 。

public class FingerprintHandler extends FingerprintManager.AuthenticationCallback {private TextView tv;public FingerprintHandler(TextView tv) {this.tv = tv;}@Overridepublic void onAuthenticationError(int errorCode, CharSequence errString) {super.onAuthenticationError(errorCode, errString);tv.setText("Auth error");}@Overridepublic void onAuthenticationHelp(int helpCode, CharSequence helpString) {super.onAuthenticationHelp(helpCode, helpString);}@Overridepublic void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {super.onAuthenticationSucceeded(result);tv.setText("auth ok");tv.setTextColor(tv.getContext().getResources().getColor(android.R.color.holo_green_light));}@Overridepublic void onAuthenticationFailed() {super.onAuthenticationFailed();}public void doAuth(FingerprintManager manager, FingerprintManager.CryptoObject obj) {CancellationSignal signal = new CancellationSignal();try {manager.authenticate(obj, signal, 0, this, null);}catch(SecurityException sce) {}}
}

有一些重要的方法需要注意。 首先,启动身份验证过程的doAuth。 此方法具有CryptoObject,取消信号和回调侦听器(此类)。 下图显示了正在运行的应用程序:

在这种情况下,将使用Android指纹认证对用户进行认证

如何在Android模拟器中测试应用

要测试该应用,可以使用带有触摸传感器的真实设备。 无论如何,也可以在模拟器中测试应用程序。 在开始使用该应用程序之前,您必须配置指纹访问“安全性”菜单。 当系统要求输入指纹时,您必须使用adb命令来模拟手指触摸:

adb -e emu finger touch id(like 1,2, ecc.)

最后,完成配置后,您将看到以下消息:

希望在本文结尾处,您获得了有关Android指纹api以及如何开发Android指纹示例应用程序的知识。

翻译自: https://www.javacodegeeks.com/2016/12/android-fingerprint-authentication-tutorial.html

指纹识别

指纹识别_Android指纹认证教程相关推荐

  1. 指纹识别-(2)指纹图像的获取

    指纹识别-(2)指纹图像的获取 一.指纹采集器采集指纹 1.指纹采集器分类 单指扫描的电子指纹采集器根据类型可以分为:光学指纹采集器.半导体指纹采集器. (1)光学指纹采集器 光学指纹采集器基于全内反 ...

  2. 【指纹识别】指纹识别【含GUI Matlab源码 029期】

    ⛄一.指纹识别简介 指纹识别技术主要分三个步骤:指纹预处理.特征提取.指纹分类与匹配. 无论是指纹分类还是指纹匹配,都需要提取指纹的有效特征,而特征提取的性能很大程度上要依赖于指纹图像的质量.在实际应 ...

  3. 【Matlab指纹识别】指纹识别门禁系统【含GUI源码 1692期】

    一.代码运行视频(哔哩哔哩) [Matlab指纹识别]指纹识别门禁系统[含GUI源码 1692期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 包子阳,余继 ...

  4. 【Matlab指纹识别】指纹识别匹配门禁系统【含GUI源码 587期】

    一.代码运行视频(哔哩哔哩) [Matlab指纹识别]指纹识别匹配门禁系统[含GUI源码 587期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 包子阳,余 ...

  5. html5 指纹识别,Http指纹识别技术

    Http指纹识别技术 Http指纹识别现在已经成为应用程序安全中一个新兴的话题,Http服务器和Http应用程序安全也已经成为网络安全中的重要一部分.从网络管理的立场来看,保持对各种web服务器的监视 ...

  6. 指纹识别工具WhatWeb使用教程,图文教程(超详细)

    「作者主页」:士别三日wyx 「作者简介」:CSDN top100.阿里云博客专家.华为云享专家.网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏<网络安全入门到精通& ...

  7. ios与android指纹识别,iOS 指纹登录(TouchID)集成方案

    TouchID指纹识别是iPhone 5S设备中增加的一项重大功能.苹果的后续移动设备也相继添加了指纹功能,在实际使用中还是相当方便的,比如快捷登录,快捷支付等等.系统提供了相应框架,使用起来还是比较 ...

  8. 【图像识别-指纹识别】指纹特征提取附matlab代码

    1 内容介绍 ​一 指纹增强 采用Lin Hong等人提出的基于Gabor滤波的方法进行指纹增强,可分为以下步骤: 标准化:标准化是把图像的平均灰度和方差调整到预定的级别上,以减少脊线上的灰度差异,方 ...

  9. 【指纹识别】指纹识别门禁系统【含GUI Matlab源码 1692期】

    ⛄一.指纹识别简介 0 引言 随着社会的发展,钥匙.证件.银行卡以及用户名密码等这些鉴定身份的标志性物品和标识的安全性越来越弱,很容易被伪造.被盗用.不小心丢失等,给人们带来了极大的困扰,如何才能更好 ...

  10. 指纹识别-(8)指纹图像预处理算法之图像分割

    如图指纹图像通常由脊谷区域.图像背景及边界.墨迹斑.模糊的可恢复的脊谷区域.不可恢复的模糊区域组成.在语义分割领域,图像的分割是将ROI(region of interest)分割出来.在指纹图像的分 ...

最新文章

  1. 关于HTML代码的转义
  2. SQL与NoSQL区别-读写性能
  3. Python 机动车强制报废公告--参数分析与实现
  4. Spring Cloud Alibaba - 26 Gateway-自定义谓词工厂RoutePredicateFactory
  5. 终端软件_DMSTerminal现场管控终端软件正式发布
  6. php mvc 参数传递数组,PHP MVC在帖子上添加到数组
  7. 怎样对付win7黑屏
  8. mysql useunicode_jdbc连接mysql 为什么在连接时已经这样设置了 ?useUnicode=truecharacterEncodin...
  9. 「洛谷P3469」[POI2008]BLO-Blockade 解题报告
  10. 获取相对于父元素的位置
  11. 原子操作--sync/atomic的用法
  12. 用R语言实现密度聚类dbscan
  13. bulk insert java_oracle bulk Insert 比insert 快不是一点啊.
  14. markdown下载及基本语法
  15. 2019~2020数字货币领域发展趋势报告
  16. 相对湿度与绝对湿度_如何监视家里的湿度水平
  17. 23万字 前端HTML与CSS学习笔记总结篇(超详细)
  18. app界面设计规范及缺陷
  19. android声音编辑器,音频视频编辑器app下载-Audio Video Editorv1.1.0 安卓版-腾牛安卓网...
  20. vue中使用svg画路径图

热门文章

  1. Chrome网页视频加速器介绍
  2. 通过tushare的股票数据绘制股票各曲线图——KDJ指标曲线
  3. Node实现支付宝网页支付流程(沙箱环境)
  4. 三剑客python自学笔记--02
  5. 小技巧:两种方式快速实现平滑涂鸦画板
  6. python爬微博话题_用Python写一个简单的微博爬虫
  7. 我们都应该停止三种测试实践
  8. 高校智能DNS解析技术总结分析
  9. matlab对离散曲线积分,matlab实现曲线积分
  10. linux 网卡 mac 配置文件,Linux脚本程序自动修改网卡配置文件中的MAC地址