android指纹验证_安卓第一款指纹识别手机[通俗易懂]

android指纹验证_安卓第一款指纹识别手机[通俗易懂]指纹识别Android指纹认证使用智能手机触摸传感器来认证用户

指纹识别

指纹识别

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

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

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

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

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

android_fingerprint_authentication-576x1024

android_fingerprint_authentication-576x1024

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 Manager
  KeyguardManager keyguardManager = (KeyguardManager)
           getSystemService(KEYGUARD_SERVICE);

  // Fingerprint Manager
  fingerprintManager = (FingerprintManager) 
         getSystemService(FINGERPRINT_SERVICE);

  try {
   // Check if the fingerprint sensor is present
   if (!fingerprintManager.isHardwareDetected()) {
     // Update the UI with a message
     message.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_fingerprint_not_supported-576x1024

android_fingerprint_not_supported-576x1024

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

android_fingerprint_authentication-576x1024

android_fingerprint_authentication-576x1024

访问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( new
  KeyGenParameterSpec.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 store
    keyStore = KeyStore.getInstance("AndroidKeyStore");

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

      "AndroidKeyStore");

     keyStore.load(null);
     keyGenerator.init( new
       KeyGenParameterSpec.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 key
   try {
     generateKey();
     Cipher cipher = generateCipher();
     cryptoObject =
      new FingerprintManager.CryptoObject(cipher);
  }
  catch(FingerprintException fpe) {
   // Handle exception
   btn.setEnabled(false);
  }
 }

 btn.setOnClickListener(new View.OnClickListener() {
   @Override
   public 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;
  }

  @Override
  public void onAuthenticationError(int errorCode, CharSequence errString) {
    super.onAuthenticationError(errorCode, errString);
    tv.setText("Auth error");
  }

  @Override
  public void onAuthenticationHelp(int helpCode, CharSequence helpString) {
    super.onAuthenticationHelp(helpCode, helpString);
  }

  @Override
  public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
    super.onAuthenticationSucceeded(result);
    tv.setText("auth ok");
    tv.setTextColor(tv.getContext().getResources().
                getColor(android.R.color.holo_green_light));
  }

  @Override
  public 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_authentication_with_finger-576x1024

android_authentication_with_finger-576x1024

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

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

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

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

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

android_fingerprint_config-1-576x1024

android_fingerprint_config-1-576x1024

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

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

指纹识别

今天的文章android指纹验证_安卓第一款指纹识别手机[通俗易懂]分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/74600.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注