2016-10-25 1 views
19

Lorsque j'écris la première et seule empreinte digitale et génère KeyPair le PrivateKey devient invalidé lorsque je l'utilise pour la deuxième fois. Cela n'arrive qu'une seule fois. Suis-je le seul à avoir ce problème? Y at-il un problème avec mon code?API d'empreintes digitales Android et clés privées/publiques

Je ne peux utiliser aucune autre clé car j'utilise PrivateKey pour signer des données.

Étapes:

  1. Supprimer toutes les empreintes digitales
  2. enregistrer une empreinte digitale
  3. Generate KeyPair et utiliser FingerprintManager :: authenticate
  4. Au cours de la prochaine utilisation de FingerprintManager :: authenticate PrivateKey obtient définitivement invalidée. Cela ne se produit que pour la première fois

Ci-dessous le code où je produis le 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(); 

Et voici le code où j'invoque l'authentification d'empreintes digitales pour la signature de données:

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

Il me semble que vous essayez de réutiliser une clé qui a été mis en place avant les données essuyés d'empreintes digitales. Assurez-vous de re-configurer votre clé après avoir essuyé les empreintes digitales.Vous pouvez essayer de définir setInvalidatedByBiometricEnrollment sur false et voir ce qui se passe, – JohanShogun

+0

Au début, je nettoie les empreintes digitales, puis j'en inscris un seul, générer des clés. Lorsque j'utilise les clés générées pour la première fois, tout fonctionne comme prévu, mais lorsque je m'authentifie avec fingerpeint pour utiliser la clé pour la deuxième fois, il est invalidé. J'ai essayé d'utiliser setInvalidateByBiometricEnrollment à false et cela a aidé mais ce n'est pas sécurisé. – Toochka

+0

Ensuite, il me semble que c'est un problème avec l'utilisation phonentoure, un bogue dans le logiciel d'empreintes digitales que le fabricant a utilisé, obtenez-vous le même résultat sur tous les téléphones à travers les fabricants? – JohanShogun

Répondre

1

i essayez ceci link et travaillez parfaitement.

D'abord, vous devez définir look sdk minimum comme l'image

Image

Deuxième série Permission de Mainfest

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

Troisième fonction

generateKey() qui génère un clé de cryptage qui est ensuite stockée en toute sécurité sur l'appareil.

Fonction cipherInit() qui initialise le chiffrement qui sera utilisé pour créer le FingerprintManager chiffré.

Instance CryptoObject et diverses autres vérifications avant d'initier le processus d'authentification qui est implémenté dans la méthode 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)); 
     } 
    } 
} 

Je espère que ça aide.