2016-05-31 6 views
1

3日間で問題に直面しています。 EditTextからSharedPreferencesにテキストを保存する必要があります。このテキストは、ユーザーが指紋スキャナーで認証した後、SharedPreferenceで暗号化して保存する必要があります。それから私は、このデータを解読する必要があるので、私は生成されたSecretKeyの永続的な記憶メカニズムが必要です。Android - 指紋認証を使用してデータを暗号化および復号化する

private SecretKey createKey(String keyName) throws NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException { 
    KeyGenerator keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, ANDROID_KEY_STORE); 
    keyGenerator.init(new KeyGenParameterSpec.Builder(keyName, 
      KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT) 
      .setKeySize(DEFAULT_KEY_SIZE) 
      .setBlockModes(KeyProperties.BLOCK_MODE_CBC) 
      .setUserAuthenticationRequired(true) 
      .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7) 
      .build()); 
    return keyGenerator.generateKey(); 
} 

問題は、私はFileInputStreamを使用してファイルからKeyStoreをロードしようとすると起こるです:

public static SecretKey getKeyFromKeystore(Context context) throws KeyStoreException, IOException, CertificateException, NoSuchAlgorithmException { 

    FileInputStream fis = null; 
    try { 
     fis = context.openFileInput(KEYSTORE_FILENAME); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore"); 
    // FileInputStream fis = context.openFileInput(KEYSTORE_FILENAME); 
    keyStore.load(fis, null); 
    SecretKey keyStoreKey = null; 

    try { 
     keyStoreKey = (SecretKey) keyStore.getKey(CONFIDENTIALITY_KEY, null); 
    } catch (KeyStoreException e) { 
     e.printStackTrace(); 
     return null; 
    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
     return null; 
    } catch (UnrecoverableKeyException e) { 
     e.printStackTrace(); 
     return null; 
    } 

    return keyStoreKey; 

} 

私はエラーになっています:.setUserAuthenticationRequired(true)なければ

java.lang.IllegalArgumentException: InputStream not supported
at android.security.keystore.AndroidKeyStoreSpi.engineLoad(AndroidKeyStoreSpi.java:930)

を、私はこの問題を持っていません私はこれが指紋のセキュリティを使う正しい方法だとは思わない。

答えて

0

RxFingerprintを使用して問題を解決することもできます。また、Read This

+0

返信ありがとうございますが、私は既にRxFingerprintを使用していますが、このライブラリでの復号化のためにキーストアまたは秘密鍵を保存する方法が見つかりませんでした。 –

2

Androidキーストアのストレージは、アプリのプロセス外にあります。したがって、ファイルに格納したり、ファイルから読み込んだりする必要はありません。あなたがする必要があるのはkeyStore.load(null)です。

関連する問題