.net指纹登录的实现(转载)

23 篇文章 0 订阅

一、概述

Android下的指纹识别是在Android6.0后添加的功能,因此,在实现的时候要判断用户机是否支持,然后对于开发来说,使用场景有两种,分别是本地识别和跟服务器交互;

  1. 本地识别:在本地完成指纹的识别后,跟本地信息绑定登陆;
  2. 后台交互:在本地完成识别后,将数据传输到服务器;

无论是本地还是与服务器交互,都需要对信息进行加密,通常来说,与本地交互的采用对称加密,与服务器交互则采用非对称加密,下面我们来简单介绍下对称加密和非对称加密

二、对称与非对称加密

1.对称加密

采用单密钥密码系统的方法,同一密钥作为加密和解密的工具,通过密钥控制加密和解密饿的指令,算法规定如何加密和解密。优点是算法公开、加密解密速度快、效率高,缺点是发送前的双方保持统一密钥,如果泄露则不安全,通常由AES、DES加密算法等;

2.非对称加密

非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(简称公钥)和私有密钥(简称私钥),如果一方用公钥进行加密,接受方应用私钥进行解密,反之发送方用私钥进行加密,接收方用公钥进行解密,由于加密和解密使用的不是同一密钥,故称为非对称加密算法;与对称加密算法相比,非对称加密的安全性得到了很大的提升,但是效率上则低了很多,因为解密加密花费的时间更长了,所以适合数据量少的加密,通常有RSA,ECC加密算法等等

三、指纹识别的对称加密

首先我们判断手机是否支持指纹识别,是否有相关的传感器,是否录入了相关指纹,然后才开始对指纹做出系列的操作;

 
 
  1. fingerprintManager = FingerprintManagerCompat.from(this);

  2. if (!fingerprintManager.isHardwareDetected()) {

  3. //是否支持指纹识别

  4. AlertDialog.Builder builder = new AlertDialog.Builder(this);

  5. builder.setMessage("没有传感器");

  6. builder.setCancelable(false);

  7. builder.create().show();

  8. } else if (!fingerprintManager.hasEnrolledFingerprints()) {

  9. //是否已注册指纹

  10. AlertDialog.Builder builder = new AlertDialog.Builder(this);

  11. builder.setMessage("没有注册指纹");

  12. builder.setCancelable(false);

  13. builder.create().show();

  14. } else {

  15. try {

  16. //这里去新建一个结果的回调,里面回调显示指纹验证的信息

  17. myAuthCallback = new MyAuthCallback(handler);

  18. } catch (Exception e) {

  19. e.printStackTrace();

  20. }

  21. }

这里初始化handle对应指纹识别完成后发送过来的消息

 
 
  1. private void initHandler() {

  2. handler = new Handler() {

  3. @Override

  4. public void handleMessage(Message msg) {

  5. super.handleMessage(msg);

  6. switch (msg.what) {

  7. //识别成功

  8. case MSG_AUTH_SUCCESS:

  9. setResultInfo(R.string.fingerprint_success);

  10. mCancelBtn.setEnabled(false);

  11. mStartBtn.setEnabled(true);

  12. cancellationSignal = null;

  13. break;

  14. //识别失败

  15. case MSG_AUTH_FAILED:

  16. setResultInfo(R.string.fingerprint_not_recognized);

  17. mCancelBtn.setEnabled(false);

  18. mStartBtn.setEnabled(true);

  19. cancellationSignal = null;

  20. break;

  21. //识别错误

  22. case MSG_AUTH_ERROR:

  23. handleErrorCode(msg.arg1);

  24. break;

  25. //帮助

  26. case MSG_AUTH_HELP:

  27. handleHelpCode(msg.arg1);

  28. break;

  29. }

  30. }

  31. };

  32. }

对称加密的主要实现步骤如下:

  1. 新建一个KeyStore密钥库,用于存放密钥;
  2. 获取KeyGenerator密钥生成工具,生成密钥;
  3. 通过密钥初始化Cipher对象,生成加密对象CryptoObject;
  4. 调用authenticate() 方法启动指纹传感器并开始监听。

1.新建一个KeyStore密钥库存放密钥:

 
 
  1. /**

  2. * 创建keystore

  3. * @throws Exception

  4. */

  5. public CryptoObjectHelper() throws Exception {

  6. KeyStore _keystore = KeyStore.getInstance(KEYSTORE_NAME);

  7. _keystore.load(null);

  8. }

2.获取KeyGenerator密钥生成工具,生成密钥:

   
 
  1. /**

  2. * 获取秘钥生成器,用于生成秘钥

  3. * @throws Exception

  4. */

  5. public void CreateKey() throws Exception {

  6. KeyGenerator keyGen = KeyGenerator.getInstance(KEY_ALGORITHM, KEYSTORE_NAME);

  7. KeyGenParameterSpec keyGenSpec =

  8. new KeyGenParameterSpec.Builder(KEY_NAME, KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)

  9. .setBlockModes(BLOCK_MODE)

  10. .setEncryptionPaddings(ENCRYPTION_PADDING)

  11. .setUserAuthenticationRequired(true)

  12. .build();

  13. keyGen.init(keyGenSpec);

  14. keyGen.generateKey();

  15. }

3.通过密钥初始化Cipher对象,生成加密对象CryptoObject:

   
 
  1. /**

  2. * @throws Exception

  3. * 密码生成,递归实现

  4. */

  5. Cipher createCipher(boolean retry) throws Exception {

  6. Key key = GetKey();

  7. Cipher cipher = Cipher.getInstance(TRANSFORMATION);

  8. try {

  9. cipher.init(Cipher.ENCRYPT_MODE | Cipher.DECRYPT_MODE, key);

  10. } catch (KeyPermanentlyInvalidatedException e) {

  11. _keystore.deleteEntry(KEY_NAME);//删除获取的码,保留生成的密码

  12. if (retry) {

  13. createCipher(false);

  14. } else {

  15. throw new Exception("Could not create the cipher", e);

  16. }

  17. }

  18. return cipher;

  19. }

4.调用authenticate() 方法启动指纹传感器并开始监听:

 
  1. CryptoObjectHelper cryptoObjectHelper = new CryptoObjectHelper();

  2. if (cancellationSignal == null) {

  3. cancellationSignal = new CancellationSignal();

  4. }

  5. fingerprintManager.authenticate(cryptoObjectHelper.buildCryptoObject(), 0,

  6. cancellationSignal, myAuthCallback, null);

最后我们在回调的类中监听指纹识别的结果:

 
  1. public class MyAuthCallback extends FingerprintManagerCompat.AuthenticationCallback {

  2.  
  3. private Handler handler = null;

  4.  
  5. public MyAuthCallback(Handler handler) {

  6. super();

  7. this.handler = handler;

  8. }

  9.  
  10. /**

  11. * 验证错误信息

  12. */

  13. @Override

  14. public void onAuthenticationError(int errMsgId, CharSequence errString) {

  15. super.onAuthenticationError(errMsgId, errString);

  16. if (handler != null) {

  17. handler.obtainMessage(Constant.MSG_AUTH_ERROR, errMsgId, 0).sendToTarget();

  18. }

  19. }

  20.  
  21. /**

  22. * 身份验证帮助

  23. */

  24. @Override

  25. public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {

  26. super.onAuthenticationHelp(helpMsgId, helpString);

  27. if (handler != null) {

  28. handler.obtainMessage(Constant.MSG_AUTH_HELP, helpMsgId, 0).sendToTarget();

  29. }

  30. }

  31.  
  32. /**

  33. * 验证成功

  34. */

  35. @Override

  36. public void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) {

  37. super.onAuthenticationSucceeded(result);

  38. if (handler != null) {

  39. handler.obtainMessage(Constant.MSG_AUTH_SUCCESS).sendToTarget();

  40. }

  41. }

  42.  
  43. /**

  44. * 验证失败

  45. */

  46. @Override

  47. public void onAuthenticationFailed() {

  48. super.onAuthenticationFailed();

  49. if (handler != null) {

  50. handler.obtainMessage(Constant.MSG_AUTH_FAILED).sendToTarget();

  51. }

  52. }

  53. }


好了,上面一直讲的是对称加密以实现指纹识别;

接下来写了一个使用指纹进行登录的demo及封装(这里没有使用加密..):

我们先来看下我总结的指纹登录流程

 

这里写图片描述这里写图片描述

 

指纹识别一定会有成功、失败等各种情况,所以先定义一个回调监听

 
  1. /**

  2. * Description: 指纹识别回调

  3. * Created by jia on 2017/11/27.

  4. * 人之所以能,是相信能

  5. */

  6. public interface FingerListener {

  7.  
  8. /**

  9. * 开始识别

  10. */

  11. void onStartListening();

  12.  
  13. /**

  14. * 停止识别

  15. */

  16. void onStopListening();

  17.  
  18. /**

  19. * 识别成功

  20. * @param result

  21. */

  22. void onSuccess(FingerprintManager.AuthenticationResult result);

  23.  
  24. /**

  25. * 识别失败

  26. */

  27. void onFail(boolean isNormal,String info);

  28.  
  29. /**

  30. * 多次识别失败 的 回调方法

  31. * @param errorCode

  32. * @param errString

  33. */

  34. void onAuthenticationError(int errorCode, CharSequence errString);

  35.  
  36. /**

  37. * 识别提示

  38. */

  39. void onAuthenticationHelp(int helpCode, CharSequence helpString);

  40.  
  41. }

1、先封装了指纹工具类

 
  1. private FingerprintManager manager;

  2. private KeyguardManager mKeyManager;

  3. private CancellationSignal mCancellationSignal;

  4. //回调方法

  5. private FingerprintManager.AuthenticationCallback mSelfCancelled;

  6.  
  7. private Context mContext;

  8.  
  9. private FingerListener listener;

指纹识别相关管理类当然是必须的了。

2、初始化它们

 
  1. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

  2. manager = (FingerprintManager) mContext.getSystemService(Context.FINGERPRINT_SERVICE);

  3. mKeyManager = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);

  4. mCancellationSignal = new CancellationSignal();

  5. initSelfCancelled();

  6. }

3、初始化系统的识别回调

 
  1. private void initSelfCancelled() {

  2. mSelfCancelled = new FingerprintManager.AuthenticationCallback() {

  3. @Override

  4. public void onAuthenticationError(int errorCode, CharSequence errString) {

  5. // 多次指纹密码验证错误后,进入此方法;并且,不能短时间内调用指纹验证

  6. listener.onAuthenticationError(errorCode, errString);

  7. }

  8.  
  9. @Override

  10. public void onAuthenticationHelp(int helpCode, CharSequence helpString) {

  11. listener.onAuthenticationHelp(helpCode, helpString);

  12. }

  13.  
  14. @Override

  15. public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {

  16. listener.onSuccess(result);

  17. }

  18.  
  19. @Override

  20. public void onAuthenticationFailed() {

  21. listener.onFail(true, "识别失败");

  22. }

  23. };

  24. }

4、开始识别

 
  1. /**

  2. * 开始监听识别

  3. */

  4. public void startListening(FingerListener listener) {

  5.  
  6. this.listener = listener;

  7.  
  8. if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) {

  9. listener.onFail(false, "未开启权限");

  10. return;

  11. }

  12.  
  13. if (isFinger() == null) {

  14. listener.onStartListening();

  15. manager.authenticate(null, mCancellationSignal, 0, mSelfCancelled, null);

  16. } else {

  17. listener.onFail(false, isFinger());

  18. }

  19. }

注意:ActivityCompat.checkSelfPermission必须在开始识别前执行,否则编译环境会报错...

5、取消识别

 
  1. /**

  2. * 停止识别

  3. */

  4. public void cancelListening() {

  5. if (mCancellationSignal != null) {

  6. mCancellationSignal.cancel();

  7. listener.onStopListening();

  8. }

  9. }

同时也少不了各种情况的判断

 
  1. /**

  2. * 硬件是否支持

  3. * <p/>

  4. * 返回null则可以进行指纹识别

  5. * 否则返回对应的原因

  6. *

  7. * @return

  8. */

  9. public String isFinger() {

  10.  
  11. //android studio 上,没有这个会报错

  12. if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) {

  13.  
  14. //android studio 上,没有这个会报错

  15. if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) {

  16. return "没有指纹识别权限";

  17. }

  18. //判断硬件是否支持指纹识别

  19. if (!manager.isHardwareDetected()) {

  20. return "没有指纹识别模块";

  21. }

  22. //判断 是否开启锁屏密码

  23. if (!mKeyManager.isKeyguardSecure()) {

  24. return "没有开启锁屏密码";

  25. }

  26. //判断是否有指纹录入

  27.  
  28. if (!manager.hasEnrolledFingerprints()) {

  29. return "没有录入指纹";

  30. }

  31. }

  32.  
  33. return null;

  34. }

 
  1. /**

  2. * 检查SDK版本

  3. *

  4. * @return

  5. */

  6. public boolean checkSDKVersion() {

  7. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

  8. return true;

  9. }

  10. return false;

  11. }

看下效果图

开启指纹登录

这里写图片描述这里写图片描述

 

登录识别

这里写图片描述

全文请看原文:https://blog.csdn.net/kisty_yao/article/details/78654359

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值