2016-05-31 2 views
1

3 일 후 문제가 발생합니다. EditText에서 SharedPreferences로 텍스트를 저장해야합니다. 이 텍스트는 사용자가 지문 스캐너로 인증 한 후에 SharedPreference에 암호화하여 저장해야합니다. 그런 다음이 데이터를 해독해야하므로 생성 된 SecretKey에 대한 영구 저장 메커니즘이 필요합니다. 나는이 문제가 없습니다 .setUserAuthenticationRequired(true)없이Android - 지문 인증을 사용하여 데이터 암호화 및 암호 해독

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

: 나는 오류 받고 있어요

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; 

} 

을 :

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을로드 할 때 일이다 하지만 이것이 지문 보안을 사용하는 올바른 방법이라고 생각하지 않습니다.

답변

0

RxFingerprint를 사용하면 문제를 해결할 수 있습니다. 또한 Read This

+0

답장을 보내 주셔서 감사합니다.하지만 이미 RxFingerprint를 사용하고 있으며이 라이브러리에서 나중의 암호 해독을 위해 키 저장소 나 보안 키를 저장할 방법을 찾지 못했습니다. –

2

Android Keystore의 저장소는 앱 프로세스 외부에 있습니다. 따라서 파일에 저장하거나 파일에서로드 할 필요가 없습니다. 당신이해야 할 일은 keyStore.load(null)입니다.