Возражения против использования javax.crypto непосредственно на Android

#android #encryption

#Android #шифрование

Вопрос:

Я читал о шифровании на Android с использованием классов Android, например, здесь: https://android-developers.googleblog.com/2020/02/data-encryption-on-android-with-jetpack.html .

Однако безопасность AndroidX и другие классы из android.security like KeyGenParameterSpec могут использоваться только в API 23 и выше.

Поэтому я подумал, есть ли какие-либо возражения против использования javax.crypto классов непосредственно на Android, например, как это сделано здесь: https://mkyong.com/java/java-aes-encryption-and-decryption /

 public class EncryptorAesGcmPasswordFile {

    private static final String ENCRYPT_ALGO = "AES/GCM/NoPadding";
    private static final int TAG_LENGTH_BIT = 128; // must be one of {128, 120, 112, 104, 96}
    private static final int IV_LENGTH_BYTE = 12;
    private static final int SALT_LENGTH_BYTE = 16;

    private static final Charset UTF_8 = Charset.forName("UTF-8");

    public static byte[] encrypt(byte[] pText, String password) throws Exception {

        byte[] salt = CryptoUtils.getRandomNonce(SALT_LENGTH_BYTE);

        byte[] iv = CryptoUtils.getRandomNonce(IV_LENGTH_BYTE);

        SecretKey aesKeyFromPassword = CryptoUtils.getAESKeyFromPassword(password.toCharArray(), salt);

        Cipher cipher = Cipher.getInstance(ENCRYPT_ALGO);

        cipher.init(Cipher.ENCRYPT_MODE, aesKeyFromPassword, new GCMParameterSpec(TAG_LENGTH_BIT, iv));

        byte[] cipherText = cipher.doFinal(pText);

        byte[] cipherTextWithIvSalt = ByteBuffer.allocate(iv.length   salt.length   cipherText.length)
                .put(iv)
                .put(salt)
                .put(cipherText)
                .array();

        return cipherTextWithIvSa<

    }

    // ...
}
  

Существуют ли какие-либо проблемы с безопасностью или другие проблемы с использованием чистого кода javax.crypto на Android?

Комментарии:

1. Я не знаю ни одного простого использования javax.crypto — в конце концов, даже с этими API-интерфейсами Android вы все еще используете javax.crypto для большинства вещей. Есть способы неправильно использовать этот API . И фактическая его реализация менялась (первоначально это был форк Bouncy Castle, позже замененный на тот, который поддерживается conscrypt(?)). Частью побуждения к использованию android.security API-интерфейсов является возможность создания хранилищ ключей с аппаратной поддержкой, которые вы не можете получить при чистом javax.crypto подходе.