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() 调用太明显了。