我从3天开始面临问题。我需要将EditText中的文本保存到SharedPreferences中。用户使用指纹扫描程序进行身份验证后,应将此文本加密保存在SharedPreference中。然后我需要解密这些数据,所以我需要一个永久存储机制来生成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();
}
当我尝试使用KeyStore
从文件加载FileInputStream
时出现问题:
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.AndroidKeyStoreSpi.engineLoad(AndroidKeyStoreSpi.java:930)
没有.setUserAuthenticationRequired(true)
我没有遇到此问题,但我不认为这是使用指纹安全的正确方法。
答案 0 :(得分:3)
Android Keystore的存储位于应用程序进程之外。因此,您无需将其存储到文件中或从文件中加载它。你需要做的只是调用str_replace()
,你应该好好去。
答案 1 :(得分:0)
使用RxFingerprint可能会解决您的问题。另外Read This