检查文件是否是具有 SQLCipher 加密的有效 SQLite 数据库
Check if file is a valid SQLite database with SQLCipher encryption
有没有办法在不知道加密密钥的情况下使用 SQLCipher 验证文件是有效的 SQLite 数据库?换句话说,有没有未加密的校验和或魔法字?
来自 this post I understand normal SQLite 3 databases just start with the string "sqlite 3", and if I know the password I could check validity of the actual high-level database structure using this.
错误消息“文件已加密或不是数据库”found here 表明答案是否定的 - 但有人可以确认吗?
没有。
加密的数据库文件与包含随机数据的文件没有区别。
我在 DBHelper 的构造函数中通过这段代码解决了(它不是纯粹的干净,但它可以工作......)
private DBHelper() {
SQLiteDatabase.loadLibs(context);
File dbFile = context.getDatabasePath(DB_NAME);
try {
if (dbFile.exists()) { // is db file exists?
// check if db file can be opened
SQLiteDatabase.openDatabase(dbFile.getAbsolutePath(), DB_PASSWORD, null, SQLiteDatabase.OPEN_READWRITE).close();
}
} catch (SQLiteException ex) { // it's impossible open db file - we must encrypt it
encryptDatabase(context, dbFile);
}
}
有没有办法在不知道加密密钥的情况下使用 SQLCipher 验证文件是有效的 SQLite 数据库?换句话说,有没有未加密的校验和或魔法字?
来自 this post I understand normal SQLite 3 databases just start with the string "sqlite 3", and if I know the password I could check validity of the actual high-level database structure using this.
错误消息“文件已加密或不是数据库”found here 表明答案是否定的 - 但有人可以确认吗?
没有。 加密的数据库文件与包含随机数据的文件没有区别。
我在 DBHelper 的构造函数中通过这段代码解决了(它不是纯粹的干净,但它可以工作......)
private DBHelper() {
SQLiteDatabase.loadLibs(context);
File dbFile = context.getDatabasePath(DB_NAME);
try {
if (dbFile.exists()) { // is db file exists?
// check if db file can be opened
SQLiteDatabase.openDatabase(dbFile.getAbsolutePath(), DB_PASSWORD, null, SQLiteDatabase.OPEN_READWRITE).close();
}
} catch (SQLiteException ex) { // it's impossible open db file - we must encrypt it
encryptDatabase(context, dbFile);
}
}