2016-10-25 11 views
19

最初に指紋を登録してKeyPairを生成すると、2回目の使用時にPrivateKeyが無効になります。これは一度だけ起こります。私はこの問題を抱えている唯一の人ですか?私のコードに何か問題がありますか?Android指紋APIと私的/公開鍵

データに署名するのにPrivateKeyを使用しているため、他の鍵を使用することはできません。

ステップ:

  1. がすべての指紋
  2. 登録ステム
  3. KeyPairを生成し、恒久的に無効になるFingerprintManager :: authenticate PrivateKeyの次の使用中FingerprintManager :: authenticate
  4. を使用するものの指紋を拭いてください。これは初回のみ、私はここに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

最初は指紋を拭き取り、1つだけ登録してキーを生成します。生成されたキーを初めて使用すると、すべて正常に動作しますが、2回目にキーを使用するためにfingerpeintで認証すると、無効になります。私はfalseにsetInvalidateByBiometricEnrollmentを使用しようとしましたが、それは助けましたが、これは安全ではありません。 – Toochka

+0

これは、私が指摘しているように、これはメーカーが使用している指紋ソフトウェアのバグを使っているphonentoureの問題です。メーカー全体のすべての電話機で同じ結果が得られますか? – JohanShogun

答えて

1

Iこれを試してください。linkと完全に動作します。

まずあなたがMainfestに絵のように生成

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

サード

generateKey()関数を

Image

セカンドセットの許可を最小SDKの外観を設定する必要があります暗号化キーはデバイスに安全に保存されます。

暗号化されたFingerprintManagerを作成するために使用される暗号を初期化するcipherInit()関数。

onCreate()メソッド内で実装される認証プロセスを開始する前に、CryptoObjectインスタンスとその他のさまざまなチェックが行われます。

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

はそれが役立つ願っています。

0

あなたはgithubの上でこれを見ることができます:それはあなたを助けることを願っています:あなたは指紋データを拭い前に設定されたキーを再利用しようとしているようConfirm Credentials