да, это то, что я думаю. Я просто думал, что представление аутентификации вручную отрицает цель установки свойства этого ключа. В любом случае, спасибо за быстрый ответ.

риложение входит в бесконечный цикл, когда я использую 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;
}

Ответы на вопрос(0)

Ваш ответ на вопрос