#android #sqlite #encryption
#Android #sqlite #шифрование
Вопрос:
я очень усердно ищу возможность зашифровать мою базу данных sqlite на устройствах Android, но мне не удалось найти удовлетворительного решения.
Мне нужно что-то вроде библиотеки для ссылки, чтобы иметь шифрование / дешифрование моей базы данных «на лету» при использовании обычных функций sqlite.
Я не хочу шифровать данные перед сохранением.
Я не хочу шифровать весь файл базы данных целиком, чтобы расшифровать его перед использованием.
Я знаю о следующих проектах:
Но я не могу найти ни одного рабочего примера для этого материала.
Кстати, я абсолютно готов приобрести коммерческую сборку, но мне нужно протестировать ist, прежде чем тратить несколько сотен долларов.
Кто-нибудь решил эту проблему самостоятельно?
Комментарии:
1. Нет никакой веской причины шифровать базу данных. Если кто-то захочет получить к нему доступ, он всегда может перепроектировать ваше приложение, чтобы получить ключ.
2. нет, нет, если я заставлю пользователя ввести пароль при запуске приложения
3. Не можете найти никаких примеров для SQLCipher? Видишь zetetic.net/sqlcipher/sqlcipher-for-android
Ответ №1:
Попробуйте порт SQLCipher для Android вместо обычного SQLCipher.
Комментарии:
1. Использование SQLCypher делает мое приложение на 8-10 МБ более объемным, после включения icudt46.zip файл для решения проблемы совместимости. Есть какой-нибудь другой легкий способ шифрования базы данных?
2. @Saty: Насколько мне известно, ничего подобного.
3. Как именно мне загрузить двоичный файл, страница Zetetic ведет на страницу загрузки без фактической загрузки.
4. @Michael: Добавьте
compile 'net.zetetic:android-database-sqlcipher:3.3.1-2@aar'
к себеdependencies
вbuild.gradle
файл вашего модуля.5. @CommonsWare О, хм. Неужели больше невозможно загрузить zip-файл и удалить файлы где-нибудь в моем проекте в Android Studio?
Ответ №2:
litereplica поддерживает шифрование с использованием шифра ChaCha, что быстрее, чем AES на портативных устройствах.
Для Android существуют привязки.
Для создания и открытия зашифрованной базы данных мы используем URI, подобный этому:
"file:/path/to/file.db?cipher=...amp;key=..."
Ответ №3:
Если кто-то все еще ищет:
Переопределить SQLiteOpenHelper
функцию, как показано ниже:
void onConfigure(SQLiteDatabase db){
db.execSQL("PRAGMA key = 'secretkey'");
}
Ответ №4:
private String encrypt(String password) {
try {
SecretKeySpec keySpec = generateKey(password);
Cipher c = Cipher.getInstance("AES");
c.init(Cipher.ENCRYPT_MODE,keySpec);
byte[] encVal = c.doFinal(password.getBytes());
String encryptedValue = Base64.encodeToString(encVal,Base64.DEFAULT);
return encryptedValue;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private SecretKeySpec generateKey(String password) throws Exception {
final MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] bytes = password.getBytes(StandardCharsets.UTF_8);
digest.update(bytes,0,bytes.length);
byte[] key = digest.digest();
SecretKeySpec secretKeySpec = new SecretKeySpec(key,"AES");
return secretKeySpec;
}
Я просто использовал encrypt
функцию для шифрования пароля. Здесь я использовал пароль пользователя в качестве ключа. Поэтому мне не нужно хранить ключ внутри приложения. Когда пользователь хочет войти в систему, просто зашифруйте пароль и попытайтесь сопоставить его с зашифрованным паролем в базе данных и разрешить им войти в систему.