#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
подходе.