#java #android #keystore
#java #Android #хранилище ключей
Вопрос:
Я хочу использовать хранилище ключей Android, чтобы скрыть криптографический ключ.
Это код.
String alias = "testalias";
KeyStoreManager.init(getApplicationContext());
String plain = "helloWorld";
String enc = KeyStoreManager.encryptData(plain, alias);
Log.d(TAG, "enc = " enc);
Я сохранил enc
строку в переменную с именем encText
и запустил снова.
String alias = "testalias";
KeyStoreManager.init(getApplicationContext());
String plain = "helloWorld";
String enc = KeyStoreManager.encryptData(plain, alias);
Log.d(TAG, "enc = " enc);
String encText = "AcasR3G2Oai Misqcsacw0Fmnj96vrEqV0Cdmc3ycT2FoEvmVZFAk6ZyG Srww26R slDl/32a/Dn"
"uaQQQxBqbW0uO5pwUL5HIFb3WBiPm1dh5JsHfQ==";
String dec = KeyStoreManager.decryptData(encText, alias);
// dec : helloWorld
Оно было декодировано правильно.
Однако проблема возникает на других устройствах. Расшифровка encText
на другом устройстве вызовет PaddingException
.
Это невозможно?
- device’A’ -> зашифровать текст с помощью хранилища ключей.
- device ‘B’ -> расшифровать этот текст с помощью хранилища ключей. —> исключение (с использованием того же .jks, того же приложения, того же кода)
=== О Keystoremanager ===
Класс Keystoremanager основан на java.security.Хранилище ключей с использованием файлов *.jks
public String encryptString(String alias, String plainText) throws NoSuchPaddingException, NoSuchAlgorithmException, NoSuchProviderException, InvalidKeyException, IOException, UnrecoverableEntryException, KeyStoreException, InvalidAlgorithmParameterException {
String encryptedText = "";
createKeys(context, alias);
KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) keyStore.getEntry(alias, null);
RSAPublicKey publicKey = (RSAPublicKey) privateKeyEntry.getCertificate().getPublicKey();
Cipher inCipher = getCipher();
inCipher.init(Cipher.ENCRYPT_MODE, publicKey);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
CipherOutputStream cipherOutputStream = new CipherOutputStream(outputStream, inCipher);
cipherOutputStream.write(plainText.getBytes(CHARSET));
cipherOutputStream.close();
byte[] vals = outputStream.toByteArray();
encryptedText = (Base64.encodeToString(vals, Base64.DEFAULT));
return encryptedText;
}
Комментарии:
1. Привет, Брайан! Хранилище ключей — это хранилище созданных ключей для вашего приложения. Я не совсем уверен, что понимаю вас, но хранилище ключей не используется для шифрования / расшифровки чего-либо.
2. Похоже, вы используете какую-то стороннюю библиотеку, которая предоставляет некоторый
KeyStoreManager
класс. Но вы не упомянули, что это за библиотека или как работаетKeyStoreManager
класс.3. Хранилище ключей AndroidKeyStore зависит от конкретного устройства, каждое устройство будет генерировать свой ключ. Поэтому шифрование и дешифрование AES работает только на одном устройстве.
4. Привет, Брайан. Если вам нужно, чтобы два устройства обменивались зашифрованными данными, вы должны зашифровать их с помощью открытого ключа устройства, которое собирается их расшифровать. Если устройство A собирается отправлять зашифрованные данные на устройство B, A должно сначала получить открытый ключ B и зашифровать данные с его помощью. Когда B получает данные, B может расшифровать их с помощью своего собственного закрытого ключа.
5. спасибо за ответы. Речь не идет о передаче между устройствами. Что я хочу сделать, это скрыть строку ключа шифрования в исходном коде моего Android. Я обеспокоен тем, что если другие просмотрят ключ шифрования с помощью такого инструмента, как jadx, они смогут расшифровать зашифрованный файл.
Ответ №1:
Ладно, пройдемся. Сценарий пароля, в котором ключ AES для шифрования пароля хранится в хранилище ключей.
В этом решении есть накладные расходы, и вот оно.
Поскольку хранилище ключей зависит от конкретного устройства, когда пользователь пытается войти в систему на новом устройстве, он проверяется по электронной почте / SMS. Если пользователь прошел проверку, вы можете попросить пользователя ввести новый пароль (или тот же текст), и на новом устройстве будет создан другой псевдоним хранилища ключей.
Итак, в целом, ваше приложение зависит от устройства, если пользователь хочет использовать его на другом устройстве, сначала его нужно будет подтвердить, затем пользователь может использовать тот же текст / другой.