Android-使用指纹身份验证加密和解密数据

Android-使用指纹身份验证加密和解密数据,android,Android,我三天来一直面临问题。我需要将EditText中的文本保存到SharedReferences中。在用户使用指纹扫描仪进行身份验证后,此文本应加密保存在SharedReference中。然后我需要解密,稍后,这些数据,所以我需要一个永久的存储机制来存储生成的SecretKey private SecretKey createKey(String keyName) throws NoSuchAlgorithmException, NoSuchProviderException, InvalidAlg

我三天来一直面临问题。我需要将EditText中的文本保存到SharedReferences中。在用户使用指纹扫描仪进行身份验证后,此文本应加密保存在SharedReference中。然后我需要解密,稍后,这些数据,所以我需要一个永久的存储机制来存储生成的SecretKey

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;

}
我得到一个错误:

java.lang.IllegalArgumentException:不支持InputStream
在 android.security.keystore.androidkeystrespi.engineLoad(androidkeystrespi.java:930)


如果没有
.setUserAuthenticationRequired(true)
我没有这个问题,但我认为这不是使用指纹安全性的正确方法。

使用它可能会解决您的问题。另外

Android密钥库的存储位于应用程序进程之外。因此,您不需要将其存储到文件中或从文件中加载。您只需调用
keyStore.load(null)
就可以了。

谢谢您的回复,但我已经在使用RxFingerprint了,我没有找到任何方法来存储keyStore或secretkey以便稍后在此库中解密。