да, это то, что я думаю. Я просто думал, что представление аутентификации вручную отрицает цель установки свойства этого ключа. В любом случае, спасибо за быстрый ответ.
риложение входит в бесконечный цикл, когда я использую AndroidKeyStore, требующий аутентификации пользователя для использования ключей
.setUserAuthenticationRequired(true);
.setUserAuthenticationValidityDurationSeconds(60);
Предполагается, что операция, которая использует закрытый ключ пользователя, требует, чтобы устройство было разблокировано, в противном случаеUserNotAuthenticatedException
генерируется. Приложение должно представить экран аутентификации устройства, и следующее использование ключа будет работать.
Но, в моем случае всегда брошенUserNotAuthenticatedException
заставляя приложение показывать экран разблокировки, Это происходит только в некоторых устройствах. У меня два Nexus 5 с Android 6.0.1, и только один из них дает сбой.
Это основной код деятельности
KeyPair keyPair;
private void attemptRegisterKey(){
try{
//generate key pair using AndroidKeyStore only once.
if (keyPair != null)
generateKeyPair(alias);
//Sample Signature
Signature sig = Signature.getInstance("SHA256withRSA");
sig.initSign(keyPair.getPrivate());
sig.update("hello".getBytes());
byte signature[] = sig.sign();
}catch (UserNotAuthenticatedException e){
//show Authentication Screen
Intent intent = mKeyguardManager.createConfirmDeviceCredentialIntent(null, null);
startActivityForResult(intent, REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS);
}
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS) {
// Challenge completed, proceed
if (resultCode == RESULT_OK) {
attemptRegisterKey();
} else {
//Process error
}
}
}
И код для генерации ключа
public KeyPair generateKeyPair(String alias) throws Exception {
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);
KeyPairGenerator kpg = KeyPairGenerator.getInstance(
KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore");
KeyGenParameterSpec.Builder builder = new KeyGenParameterSpec.Builder(
alias,
KeyProperties.PURPOSE_SIGN | KeyProperties.PURPOSE_VERIFY)
.setDigests(KeyProperties.DIGEST_SHA256, KeyProperties.DIGEST_SHA512)
.setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
.setUserAuthenticationRequired(true);
.setUserAuthenticationValidityDurationSeconds(60);
kpg.initialize(builder.build());
KeyPair kp = kpg.generateKeyPair();
return kp;
}