2016-10-25 11 views
19

Когда я регистрирую первый и единственный отпечаток пальца и генерирую KeyPair, PrivateKey становится недействительным, когда я использую его во второй раз. Это происходит только один раз. Я единственный, у кого есть эта проблема? Что-то не так с моим кодом?API отпечатков пальцев Android и личные/открытые ключи

Я не могу использовать какой-либо другой ключ, поскольку я использую PrivateKey для подписи данных.

Шаги:

  1. Wipe все отпечатки пальцев
  2. ПРИЕМА один отпечаток пальца
  3. Сформировать KeyPair и использовать FingerprintManager :: authenticate
  4. Во время следующего использования FingerprintManager :: authenticate PrivateKey получает постоянно аннулируется. Это происходит только в первый раз

Ниже кода, где я генерировать KeyPair

KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); 
keystore.load(null); 
KeyPairGenerator generator = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore"); 
generator.initialize(new KeyGenParameterSpec.Builder("key_name", KeyProperties.PURPOSE_SIGN) 
    .setDigests(digest) // I have defined digest before 
    .setSignaturePaddings(paddings) // I have defined paddings before 
    .setUserAuthenticationRequired(true) 
    .build()); 
generator.generateKeyPair(); 

И вот код, где я вызываю аутентификации по отпечаткам пальцев для подписи данных:

KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); 
keyStore.load(null); 
Signature signature = Signature.getInstance("signing_algorithm"); 
PrivateKey privateKey = (PrivateKey) keyStore.getKey("key_name", null); 
signature.initSign(privateKey); // Here I get KeyPermanentlyInvalidatedException 
CryptoObject crypto = new CryptoObject(signature); 
FingerprintManager fingerprintManager = context.getSystemService(FingerprintManager.class); 
CancellationSignal cancellationSignal = new CancellationSignal(); 
AuthenticationCallback authenticationCallback = new AuthenticationCallback() { 
    ... 
}; 
fingerprintManager.authenticate(crypto, cancelationSignal, 0, authenticationCallback, null); 
+0

Кажется мне, как вы пытаетесь повторно использовать ключ, который был создан, прежде чем стереть данные об отпечатках пальцев. Убедитесь, что вы снова установили свой ключ после вытирания отпечатков пальцев.Вы можете попробовать установить setInvalidatedByBiometricEnrollment в false и посмотреть, что произойдет, – JohanShogun

+0

Сначала я протираю отпечатки пальцев, а затем регистрирую только один, сгенерируйте ключи. Когда я использую сгенерированные ключи в первый раз, все работает так, как ожидалось, но когда я аутентифицирую с помощью fingerpeint, чтобы использовать ключ во второй раз, он становится недействительным. Я попытался использовать setInvalidateByBiometricEnrollment в false, и это помогло, но это небезопасно. – Toochka

+0

Тогда мне кажется, что это проблема с использованием phonentoure, ошибка в программном обеспечении отпечатков пальцев, который используется производителем, вы получаете тот же результат на всех телефонах разных производителей? – JohanShogun

ответ

1

я попробуйте это link и работайте отлично.

Прежде всего, необходимо установить Минимальный вид SDk как Picture

Image

Второй набор разрешений в MainFest Третья функция

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

generateKey(), который генерирует ключ шифрования, который затем надежно сохраняется на устройстве.

Функция cipherInit(), которая инициализирует шифр, который будет использоваться для создания зашифрованного FingerprintManager.

Экземпляр CryptoObject и различные другие проверки перед началом процесса аутентификации, который реализуется внутри метода onCreate().

FingerPrintActivty.java

FingerprintAuthenticationHandler.Class

import android.Manifest; 
import android.app.Activity; 
import android.content.Context; 
import android.content.pm.PackageManager; 
import android.hardware.fingerprint.FingerprintManager; 
import android.os.CancellationSignal; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.content.ContextCompat; 
import android.widget.TextView; 


/** 
* Created by whit3hawks on 11/16/16. 
*/ 
public class FingerprintHandler extends FingerprintManager.AuthenticationCallback { 


    private Context context; 


    // Constructor 
    public FingerprintHandler(Context mContext) { 
     context = mContext; 
    } 


    public void startAuth(FingerprintManager manager, FingerprintManager.CryptoObject cryptoObject) { 
     CancellationSignal cancellationSignal = new CancellationSignal(); 
     if (ActivityCompat.checkSelfPermission(context, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) { 
      return; 
     } 
     manager.authenticate(cryptoObject, cancellationSignal, 0, this, null); 
    } 


    @Override 
    public void onAuthenticationError(int errMsgId, CharSequence errString) { 
     this.update("Fingerprint Authentication error\n" + errString, false); 
    } 


    @Override 
    public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) { 
     this.update("Fingerprint Authentication help\n" + helpString, false); 
    } 


    @Override 
    public void onAuthenticationFailed() { 
     this.update("Fingerprint Authentication failed.", false); 
    } 


    @Override 
    public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) { 
     this.update("Fingerprint Authentication succeeded.", true); 
    } 


    public void update(String e, Boolean success){ 
     TextView textView = (TextView) ((Activity)context).findViewById(R.id.errorText); 
     textView.setText(e); 
     if(success){ 
      textView.setTextColor(ContextCompat.getColor(context,R.color.colorPrimaryDark)); 
     } 
    } 
} 

Надеется, что это поможет.