首页 > 解决方案 > 带有 StrongBox 的 Android KeyStore:如何测试用户存在?

问题描述

在 Pixel 3 上运行的 Android API 28 提供了要求用户在场以获取在Android KeyStore内生成的密钥的选项。但是,在使用该密钥创建签名时,我如何实际测试用户的存在呢?我在文档中遗漏了什么吗?

KeyGenParameterSpec.Builder keyGenSpec = new KeyGenParameterSpec.Builder("alias", KeyProperties.PURPOSE_SIGN)
    .setDigests(KeyProperties.DIGEST_SHA256)
    .setKeySize(256)
    .setIsStrongBoxBacked(true)
    .setUserPresenceRequired(true);

KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC", "AndroidKeyStore");
keyPairGenerator.initialize(keyGenSpec.build());
keyPairGenerator.generateKeyPair();

KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null, null);
PrivateKey privateKey = (PrivateKey) keyStore.getKey("alias", null);
Signature signature = Signature.getInstance("SHA256withECDSA");
signature.initSign(privateKey);
signature.update("Hello".getBytes(Charset.defaultCharset()));
byte[] sign = signature.sign();

该代码抛出android.security.KeyStoreException: -69转换为PROOF_OF_PRESENCE_REQUIRED. 我也尝试将签名过程包装在一个 中BiometricPrompt,但无济于事。

标签: androidandroid-keystoreandroid-9.0-pie

解决方案


推荐阅读