【发布时间】:2017-07-12 08:11:17
【问题描述】:
我正在尝试使用Signature 对象通过指纹身份验证来签名和验证数据。它适用于签名,但在验证时我收到此错误:
java.lang.IllegalArgumentException:加密原语不受支持 AndroidKeyStore 提供者:签名对象: SHA256 与 ECDSA,spi: com.android.org.conscrypt.OpenSSLSignature$SHA256ECDSA@cf4a416
不是在生成密钥时抛出异常(这部分很好),而是在调用fingerprintManager.authenticate(cryptoObject, ...)时抛出异常
基本上这就是我生成CryptoObject 实例的方式:
KeyPairGenerator signatureKeyGenerator = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore");
signatureKeyGenerator.initialize(new KeyGenParameterSpec.Builder(keyName, KeyProperties.PURPOSE_SIGN)
.setDigests(KeyProperties.DIGEST_SHA256)
.setAlgorithmParameterSpec(new ECGenParameterSpec("secp256r1"))
.setUserAuthenticationRequired(true)
.build());
KeyPair signatureKey = signatureKeyGenerator.generateKeyPair();
Signature signature = Signature.getInstance("SHA256withECDSA");
switch (MODE) {
case KeyProperties.PURPOSE_SIGN:
signature.initSign(signatureKey.getPrivate());
break;
case KeyProperties.PURPOSE_VERIFY:
KeyFactory factory = KeyFactory.getInstance(signatureKey.getPublic().getAlgorithm());
X509EncodedKeySpec spec = new X509EncodedKeySpec(signatureKey.getPublic().getEncoded());
PublicKey unrestrictedPublicKey = factory.generatePublic(spec);
signature.initVerify(unrestrictedPublicKey);
break;
}
CryptoObject cryptoObject new CryptoObject(signature);
我尝试将| KeyProperties.PURPOSE_VERIFY 添加到KeyGenParameterSpec.Builder,但它也不起作用,无论如何,这就是他们在官方谷歌回购中的做法:https://github.com/googlesamples/android-AsymmetricFingerprintDialog(奇怪......)
最后我尝试查看 Android 源代码以了解引发异常的原因:AndroidKeyStoreProvider.java
Object spi = ((Signature) cryptoPrimitive).getCurrentSpi();
if (spi == null) {
throw new IllegalStateException("Crypto primitive not initialized");
} else if (!(spi instanceof KeyStoreCryptoOperation)) {
throw new IllegalArgumentException(
"Crypto primitive not backed by AndroidKeyStore provider: " + cryptoPrimitive
+ ", spi: " + spi);
}
但我什至找不到getCurrentSpi() 方法...
任何帮助将不胜感激!
【问题讨论】:
标签: android authentication keystore signature fingerprint