2016-10-25 34 views
19

Gdy rejestruję pierwszy i tylko odcisk palca i generuję KeyPair, zostaje on unieważniony, gdy używam go po raz drugi. Zdarza się to tylko raz. Czy tylko ja mam ten problem? Czy coś jest nie tak z moim kodem?Interfejs API linii papilarnych z Androidem i klucze prywatne/publiczne

Nie mogę użyć żadnego innego klucza, ponieważ używam PrivateKey do podpisywania danych.

Kroki:

  1. wytrzeć wszystkie odciski palców
  2. Rejestrowanie jeden odcisk palca
  3. Generowanie KeyPair i używać FingerprintManager :: authenticate
  4. Podczas następnego użycia FingerprintManager :: authenticate PrivateKey zostaje trwale unieważnione. Dzieje się tak tylko po raz pierwszy

poniższy kod gdzie wygenerowania 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(); 

A oto kod gdzie mogę powołać uwierzytelniania linii papilarnych do podpisywania danych:

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

Wydaje mi się, jakbyś próby ponownego użycia klucza, który został ustanowiony przed otarła dane o odciskach palców. Upewnij się, że ponownie ustawiłeś klucz po wyczyszczeniu odcisków palców.Możesz spróbować ustawić setInvalidatedByBiometricEnrollment na false i zobaczyć, co się stanie, – JohanShogun

+0

Najpierw wycieram odciski palców, a potem rejestruję tylko jeden, generuję klucze. Kiedy używam generowanych kluczy po raz pierwszy, wszystko działa zgodnie z oczekiwaniami, ale kiedy uwierzytelniam się przy pomocy fingerpeint, aby użyć klucza po raz drugi, zostaje on unieważniony. Próbowałem użyć setInvalidateByBiometricEnrollment na false i pomógł, ale to nie jest bezpieczne. – Toochka

+0

W takim razie wydaje mi się, że jest to problem związany z używaniem elementu phonsoure, błąd w oprogramowaniu odcisków palców, którego używał producent, czy otrzymujesz taki sam wynik na wszystkich telefonach różnych producentów? – JohanShogun

Odpowiedz

1

ja spróbuj tego link i działa idealnie.

Najpierw trzeba określić minimalne wygląd sdk jak obrazek

Image

Drugi zestaw uprawnień w Mainfest

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

trzeciej funkcji

generateKey(), które generuje klucz szyfrowania, który jest następnie bezpiecznie przechowywany na urządzeniu.

Funkcja cipherInit(), która inicjuje szyfr, który będzie używany do tworzenia zaszyfrowanego programu FingerprintManager.

Instancja CryptoObject i różne inne sprawdzenia przed rozpoczęciem procesu uwierzytelniania zaimplementowane w metodzie 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)); 
     } 
    } 
} 

Nadzieję, że pomoże.