Android 指纹失效
Android Fingerprint invalidation
我正在研究 Fingerprint demo for Android,尤其是失效场景,但需要一点帮助才能将其转化为适合生产的逻辑。
我已经测试了该应用程序并使 initCipher 在添加指纹后因失效而失败,但该应用程序必须是 运行 并且在您更改设置时生成密钥。这是因为每次应用程序启动时,演示都会生成一个新密钥。实际上,您不想这样做,而是生成密钥(如果不存在)并在它存在时重用它以强制执行适当的失效,无论应用程序是否 运行。
您如何修改应用程序,以便不是每次都生成密钥,而是先检查密钥是否存在,然后再加载该密钥?您能否在密钥失效后将其删除,以便应用之前的逻辑和注册周期?
通过多查看 KeyStore
class 并修改 initCipher()
,我自己找到了答案。不是最好的实现,但足以测试一些东西:
private boolean initCipher(Cipher cipher, String keyName) {
try {
mKeyStore.load(null);
// ADDED: Check is keystore contains my key name
if(!mKeyStore.containsAlias(DEFAULT_KEY_NAME)) {
// ADDED: Create if it doesn't
createKey(DEFAULT_KEY_NAME, true);
}
SecretKey key = (SecretKey) mKeyStore.getKey(keyName, null);
cipher.init(Cipher.ENCRYPT_MODE, key);
return true;
} catch (KeyPermanentlyInvalidatedException e) {
// ADDED: Remove the key if it is invalidated so
// it can be created fresh next time
try {
mKeyStore.deleteEntry(keyName);
} catch (KeyStoreException e1) {
e1.printStackTrace();
return false;
}
return false;
} catch (KeyStoreException | CertificateException | UnrecoverableKeyException | IOException
| NoSuchAlgorithmException | InvalidKeyException e) {
throw new RuntimeException("Failed to init Cipher", e);
}
}
还需要删除来自 onCreate()
的 createKey()
调用太明显了。
我正在研究 Fingerprint demo for Android,尤其是失效场景,但需要一点帮助才能将其转化为适合生产的逻辑。
我已经测试了该应用程序并使 initCipher 在添加指纹后因失效而失败,但该应用程序必须是 运行 并且在您更改设置时生成密钥。这是因为每次应用程序启动时,演示都会生成一个新密钥。实际上,您不想这样做,而是生成密钥(如果不存在)并在它存在时重用它以强制执行适当的失效,无论应用程序是否 运行。
您如何修改应用程序,以便不是每次都生成密钥,而是先检查密钥是否存在,然后再加载该密钥?您能否在密钥失效后将其删除,以便应用之前的逻辑和注册周期?
通过多查看 KeyStore
class 并修改 initCipher()
,我自己找到了答案。不是最好的实现,但足以测试一些东西:
private boolean initCipher(Cipher cipher, String keyName) {
try {
mKeyStore.load(null);
// ADDED: Check is keystore contains my key name
if(!mKeyStore.containsAlias(DEFAULT_KEY_NAME)) {
// ADDED: Create if it doesn't
createKey(DEFAULT_KEY_NAME, true);
}
SecretKey key = (SecretKey) mKeyStore.getKey(keyName, null);
cipher.init(Cipher.ENCRYPT_MODE, key);
return true;
} catch (KeyPermanentlyInvalidatedException e) {
// ADDED: Remove the key if it is invalidated so
// it can be created fresh next time
try {
mKeyStore.deleteEntry(keyName);
} catch (KeyStoreException e1) {
e1.printStackTrace();
return false;
}
return false;
} catch (KeyStoreException | CertificateException | UnrecoverableKeyException | IOException
| NoSuchAlgorithmException | InvalidKeyException e) {
throw new RuntimeException("Failed to init Cipher", e);
}
}
还需要删除来自 onCreate()
的 createKey()
调用太明显了。