2016-10-25 23 views
19

ben ilk ve tek parmak izi kayıt ve ben ikinci kez kullandığınızda KeyPairPrivateKey geçersiz olur üretir. Bu sadece bir kez olur. Bu sorunu yaşayan tek kişi ben miyim? Kodumda yanlış bir şey mi var? Verileri imzalamak için PrivateKey kullanıyorum olarakAndroid Parmak İzi API ve özel/Ortak anahtarlar

Ben başka bir tuşa kullanamaz.

Adımlar:

  1. tüm parmak izlerini
  2. kaydettirme
  3. KeyPair oluşturun ve kalıcı geçersiz olur FingerprintManager :: authenticate PrivateKey sonraki kullanım sırasında FingerprintManager :: authenticate
  4. kullandığınız bir parmak izi silin. Bu yalnızca ilk kez burada 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(); 
    

    Ve veri imzalama için parmak izi kimlik doğrulamayı çağırmak kodudur oluşturmak Kodun altında

için gerçekleşir:

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

Bana kalırsa. Parmak izlerini sildikten sonra anahtarınızı ayarladığınızdan emin olun.SetInvalidatedByBiometricEnrollment ayarını false olarak ayarlamayı ve ne olacağını görmeyi deneyebilirsiniz. – JohanShogun

+0

Başta parmak izlerini siliyorum, daha sonra yalnızca bir tane oluştur, anahtarlar oluştur. Üretilen anahtarları ilk defa kullandığımda, her şey beklendiği gibi çalışır, ancak ikinci kez anahtarını kullanmak için parmak iziyle kimlik doğrulaması yaptığımda geçersiz olur. SetInvalidateByBiometricEnrollment'i false olarak kullanmaya çalıştım ve yardımcı oldu, ancak bu güvenli değil. – Toochka

+0

Öyleyse bu bana, bu, üreticinin kullandığı parmak izi yazılımındaki bir hata, telefondaki üreticilerin tüm telefonlarında aynı sonucu aldığınız fonetik kullanımı ile ilgili bir sorun gibi görünüyor. – JohanShogun

cevap

1

i Bu link'u deneyin ve mükemmel şekilde çalışın.

Önce Mainfest İçinde Resim gibi bir üretir

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

Üçüncü

generateKey() işlevini

Image

İkinci set İzni Asgari sdk göz ayarlamanız gerekir Daha sonra cihazda güvenli bir şekilde saklanan şifreleme anahtarı. şifrelenmiş FingerprintManager oluşturmak için kullanılacak şifre başlatır

cipherInit() işlevi.

CryptoObject örneği ve onCreate() metodu içinde uygulanan kimlik doğrulama işlemini başlatmadan önce, diğer çeşitli kontrol eder.

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)); 
     } 
    } 
} 

faydası Umut.

0

github üzerinde bu bir görebilirsiniz: size yardımcı olacağını umuyoruz: Eğer parmak izi verilerini sildi önce kurulmuş bir anahtar yeniden çalışıyorsanız gibi Confirm Credentials

İlgili konular