Ответ 1
Хороший вопрос.
Для использования должен быть доступен открытый ключ на устройстве. Как только он приходит на устройство, он больше не защищается. Сам ключ не секрет, но нам нужно сделать его возможную замену более сложной задачей.
Что вы можете сделать, так это использовать так называемое XOR-шифрование. Вот пример, если методы XOR-encrypter и decrypter.
public static String xorEncrypt(String input, String key) {
byte[] inputBytes = input.getBytes();
int inputSize = inputBytes.length;
byte[] keyBytes = key.getBytes();
int keySize = keyBytes.length - 1;
byte[] outBytes = new byte[inputSize];
for (int i=0; i<inputSize; i++) {
outBytes[i] = (byte) (inputBytes[i] ^ keyBytes[i % keySize]);
}
return new String(Base64.encode(outBytes, Base64.DEFAULT));
}
public static String xorDecrypt(String input, String key) {
byte[] inputBytes = Base64.decode(input, Base64.DEFAULT);
int inputSize = inputBytes.length;
byte[] keyBytes = key.getBytes();
int keySize = keyBytes.length - 1;
byte[] outBytes = new byte[inputSize];
for (int i=0; i<inputSize; i++) {
outBytes[i] = (byte) (inputBytes[i] ^ keyBytes[i % keySize]);
}
return new String(outBytes);
}
Как вам нужно выбрать строку пароля (String key
) и зашифровать свой открытый ключ (String input
), используя его. Этот зашифрованный ключ, который вы можете сохранить в классе. Когда вам нужно ваше реальное значение ключа, вы вызываете xorDecrypt()
с помощью пароля и общедоступной (зашифрованной) строки ключа. Пароль - это строка, которую вы храните где-то в своем коде. Как я уже сказал, мы действительно не защищаем его, но мы затрудняем его поиск и/или замену.
Вы можете добавить более сложную логику о том, как объединить зашифрованный открытый ключ и пароль. Это просто добавляет больше сложностей, но не даст вам никаких гарантий, что ваш ключ не будет дешифрован. В любом случае Google подтверждает Шифрование XOR лучше, чем ничего.
Android 4.3 добавил еще некоторые функции безопасности, которые можно использовать и для хранения открытых ключей. Это решение потребует, чтобы серверная связь и аппаратная поддержка были действительно безопасными. Это Улучшения Key Chain и Android Keystore Provider.