指纹验证登录开发流程详解

安全 应用安全
指纹登录可以实现应用的快捷登录,在Android6.0谷歌才提供统一指纹SDK接口,今天我们来介绍下指纹登录功能.

[[433625]]

前言

指纹登录可以实现应用的快捷登录,在Android6.0谷歌才提供统一指纹SDK接口

今天我们来介绍下指纹登录功能;

一、app里指纹登录介绍

指纹识别是Android6.0以上就开始支持的一个功能,并且类也不多,主要就是FingerprintManager还有它里面三个内部类(AuthenticationCallback、AuthenticationResult、CryptoObject);

指纹数据是在手机的设置里面,不是存到自己写的APP的;

指纹识别就只能识别,而不能在APP中录入指纹,想录入指纹可以,自己要到手机设置里面的指纹功能自己去添加,指纹识别功能能做的就是把用户放到感应区的指纹数据与手机设置里面的已录入的指纹数据进行比对,再执行成功失败的回调,仅此而已;

二、指纹登录步骤详解

1、申请权限

Android清单文件中的指纹的权限是

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

2、验证手机是否支持指纹

  • FingerprintManagerCompat提供了三个方法:
  • isHardwareDetected() 判断是否有硬件支持
  • isKeyguardSecure() 判断是否设置锁屏,因为一个手机最少要有两种登录方式

hasEnrolledFingerprints() 判断系统中是否添加至少一个指纹

  1. /** 
  2. * 判断是否支持指纹识别 
  3. */ 
  4. public static boolean supportFingerprint(Context mContext) { 
  5.     if (Build.VERSION.SDK_INT < 23) { 
  6.         Toast.makeText(mContext, "您的系统版本过低,不支持指纹功能", Toast.LENGTH_SHORT).show(); 
  7.         return false
  8.     } else { 
  9.         KeyguardManager keyguardManager = mContext.getSystemService(KeyguardManager.class); 
  10.         FingerprintManagerCompat fingerprintManager = FingerprintManagerCompat.from(mContext); 
  11.         if (!fingerprintManager.isHardwareDetected()) { 
  12.             Toast.makeText(mContext, "您的系统版本过低,不支持指纹功能", Toast.LENGTH_SHORT).show(); 
  13.             return false
  14.         } else if (keyguardManager != null && !keyguardManager.isKeyguardSecure()) { 
  15.             Toast.makeText(mContext, "您的手机不支持指纹功能", Toast.LENGTH_SHORT).show(); 
  16.             return false
  17.         } else if (!fingerprintManager.hasEnrolledFingerprints()) { 
  18.             Toast.makeText(mContext, "您至少需要在系统设置中添加一个指纹", Toast.LENGTH_SHORT).show(); 
  19.             return false
  20.         } 
  21.     } 
  22.     return true

3、生成一个对称加密的key

  1. val DEFAULT_KEY_NAME = "default_key" 
  2.  lateinit var keyStore: KeyStore 
  3.    private fun initKey() { 
  4.         keyStore = KeyStore.getInstance("AndroidKeyStore"
  5.         keyStore.load(null
  6.         val keyGenerator = 
  7.             KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore"
  8.         val builder = KeyGenParameterSpec.Builder(DEFAULT_KEY_NAME, 
  9.             KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT) 
  10.             .setBlockModes(KeyProperties.BLOCK_MODE_CBC) 
  11.             .setUserAuthenticationRequired(true
  12.             .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7) 
  13.         keyGenerator.init(builder.build()) 
  14.         keyGenerator.generateKey() 
  15.     } 

4、生成一个Cipher对象

  1. private fun initCipher(mContext: Context?) { 
  2.         val key = keyStore.getKey(DEFAULT_KEY_NAME, nullas SecretKey 
  3.         val cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/" 
  4.                 + KeyProperties.BLOCK_MODE_CBC + "/" 
  5.                 + KeyProperties.ENCRYPTION_PADDING_PKCS7) 
  6.         cipher.init(Cipher.ENCRYPT_MODE, key
  7.     } 

5、开启指纹验证

  1. private void showFingerPrintDialog(Context context, Cipher cipher) { 
  2.     FingerprintManagerCompat fingerprintManagerCompat = FingerprintManagerCompat.from(context); 
  3.     FingerprintManagerCompat.CryptoObject cryptoObject = new FingerprintManagerCompat.CryptoObject(cipher); 
  4.     CancellationSignal mCancellationSignal = new CancellationSignal(); 
  5.     //识别过程中可以手动取消指纹识别 
  6.     //mCancellationSignal.cancel(); 
  7.     fingerprintManagerCompat.authenticate(cryptoObject, 0, mCancellationSignal, new MyCallBack(), null); 

6、指纹验证回调

  1. public class MyCallBack extends FingerprintManagerCompat.AuthenticationCallback { 
  2.    @Override 
  3.    public void onAuthenticationError(int errMsgId, CharSequence errString) { 
  4.        //当出现错误的时候回调此函数,比如多次尝试都失败了的时候,errString是错误信息 
  5.        //一般来说我们都是先判断一下是不是自己手动取消 
  6.        Log.e("TAG""errMsgId=" + errMsgId); 
  7.        if (errMsgId == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT) { 
  8.            Log.e("TAG""" + errString); 
  9.        } 
  10.    } 
  11.    //当指纹验证失败的时候会回调此函数,失败之后允许多次尝试,失败次数过多会停止响应一段时间然后再停止sensor的工作 
  12.    @Override 
  13.    public void onAuthenticationFailed() { 
  14.        //指纹认证失败,请再试一次 
  15.        Log.e("TAG""onAuthenticationFailed"); 
  16.    } 
  17.    @Override 
  18.    public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) { 
  19.       //错误时提示帮助,比如说指纹错误,我们将显示在界面上 让用户知道情况 
  20.       Log.e("TAG""helpString=" + helpString); 
  21.    } 
  22.    //当验证的指纹成功时会回调此函数,然后不再监听指纹sensor 
  23.    @Override 
  24.    public void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) { 
  25.        //这里我们可以做取消弹框之类的 
  26.        Log.e("TAG""onAuthenticationSucceeded=" + result.toString()); 
  27.    } 

到此指纹验证登录流程完了,是不是很简单;

总结

指纹这块还有很多很多东西等着我们去学习,比如加密等;

 

一起学习加油;

 

责任编辑:武晓燕 来源: Android开发编程
相关推荐

2021-03-05 06:39:54

指纹Web识别

2021-08-20 09:50:41

Web指纹前端

2021-04-27 07:00:08

UbuntuLinux指纹登录

2011-06-28 13:38:15

Arm linux QT

2011-06-02 11:13:07

2009-10-10 10:55:48

TDD技术

2009-12-10 17:37:28

PHP Cookie登

2021-11-01 17:31:21

Camera2 相机开发

2023-11-23 14:37:29

2013-06-07 09:49:54

Windows 8.1TechEd2013

2018-05-13 16:00:22

主播APP视频

2020-02-13 12:17:13

VSCodeReact代码

2010-07-26 13:06:29

telnet登录设置

2015-12-30 10:29:40

Git协作流程详解

2011-05-18 13:26:05

MySQL

2009-08-13 16:28:07

windows2008密码验证

2009-08-20 13:47:57

C#验证输入方法

2018-12-25 23:01:14

2013-05-03 09:44:52

2017-06-28 09:11:13

联想企业网盘
点赞
收藏

51CTO技术栈公众号