- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我的 Android 应用程序中有一个 Room 数据库,在我的 AppClass 中,我有一些检查数据库加密状态的逻辑,以便处理一些可能需要对数据库执行的潜在加密操作。但是,每当我在加密数据库上调用 SQLCipherUtils.getDatabaseState 时,它都会抛出 SQLiteException。但有趣的是,从 getDatabaseState 返回的状态不是 null 并且工作得很好,并且围绕对 getDatabaseState 的调用的 try-catch block 没有捕获异常。因此,据我所知,异常不会影响其余逻辑。但是,每次在数据库加密后启动应用程序时,都会在 LogCat 中看到此错误,这令人沮丧。所以我的问题是,这个错误实际上是否表明存在问题?如果是,我该如何修复它,如果不是,我如何消除错误?
Application 类中的数据库逻辑(第一行抛出的异常):
try {
// Get database state
SQLCipherUtils.State state = SQLCipherUtils.getDatabaseState(getApplicationContext(), DB_NAME);
// Check whether database is encrypted
if (state == SQLCipherUtils.State.UNENCRYPTED) {
// If it's unencrypted, encrypt the database
try {
// Get database instance
FinancesDatabase db = FinancesDatabase.getDatabase(getApplicationContext());
// Close database
db.close();
// Encrypt database with encryption key
SQLCipherUtils.encrypt(getApplicationContext(), DB_NAME, sharedPrefs.getEncryptKey());
Timber.i("Successfully encrypted database!");
} catch (IOException e) {
Timber.e(e, "Failed to encrypt previously unencrypted database!");
}
} else if (state == SQLCipherUtils.State.ENCRYPTED)
// Otherwise, good to go
Timber.i("Database is encrypted. No action necessary.");
else if (state == SQLCipherUtils.State.DOES_NOT_EXIST)
// No database found. Normal if first launch
Timber.w("No database found.");
} catch(Exception e) {
Timber.e(e, "Failed to get database encryption state!");
}
异常(exception):
E/Database: file is not a database: , while compiling: select count(*) from sqlite_master;
net.sqlcipher.database.SQLiteException: file is not a database: , while compiling: select count(*) from sqlite_master;
at net.sqlcipher.database.SQLiteCompiledSql.native_compile(Native Method)
at net.sqlcipher.database.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:91)
at net.sqlcipher.database.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:64)
at net.sqlcipher.database.SQLiteProgram.<init>(SQLiteProgram.java:89)
at net.sqlcipher.database.SQLiteQuery.<init>(SQLiteQuery.java:48)
at net.sqlcipher.database.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:60)
at net.sqlcipher.database.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1867)
at net.sqlcipher.database.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1785)
at net.sqlcipher.database.SQLiteDatabase.keyDatabase(SQLiteDatabase.java:2486)
at net.sqlcipher.database.SQLiteDatabase.openDatabaseInternal(SQLiteDatabase.java:2415)
at net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1149)
at net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1116)
at net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1065)
at net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1019)
at com.commonsware.cwac.saferoom.SQLCipherUtils.getDatabaseState(SQLCipherUtils.java:62)
at com.commonsware.cwac.saferoom.SQLCipherUtils.getDatabaseState(SQLCipherUtils.java:46)
at edu.usm.cs.csc414.pocketfinances.AppClass.onCreate(AppClass.java:118)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1125)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6056)
at android.app.ActivityThread.-wrap1(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1764)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6938)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
库中的 SQLCipherUtils.getDatabaseState 实现:
public static State getDatabaseState(Context ctxt, String dbName) {
SQLiteDatabase.loadLibs(ctxt);
return(getDatabaseState(ctxt.getDatabasePath(dbName)));
}
public static State getDatabaseState(File dbPath) {
if (dbPath.exists()) {
SQLiteDatabase db=null;
try {
db=
SQLiteDatabase.openDatabase(dbPath.getAbsolutePath(), "",
null, SQLiteDatabase.OPEN_READONLY);
db.getVersion();
return(State.UNENCRYPTED);
}
catch (Exception e) {
return(State.ENCRYPTED);
}
finally {
if (db != null) {
db.close();
}
}
}
return(State.DOES_NOT_EXIST);
}
最佳答案
那是直接记录by SQLCipher for Android .任何时候使用无效密码都会被记录下来。 getDatabaseState()
尝试使用空字符串作为密码打开数据库,因为这是未加密数据库的“密码”。
避免此日志消息的选项是:
不要为 Android 使用 SQLCipher,或者
不要使用 getDatabaseState()
,并确保用户永远不会提供无效的密码
关于android - SQLCipherUtils.getDatabaseState 中带有 Room Persistence Library 异常的 SQLCipher,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53452700/
它在页面级别对 SQLLite 数据库进行加密,好的,没问题! 但是你的源代码呢?它已编译,但即使有人可以反编译它,检索您的密码并解密数据库? 最佳答案 SQLCipher 的安全性如何? 根据SQL
我正在关注 sqlcipher Api 文档中的示例:http://sqlcipher.net/sqlcipher-api#attach ATTACH DATABASE 'encrypted.db'
这是我的演示项目 public class SQLDemoActivity extends Activity { EventDataSQLHelper eventsData; @Ove
我使用过 DBFlow,它在数据库方面非常简单,但我想问是否有一个很好的例子来将 SQLCipher 与 DBFlow 一起使用 我已通过此链接寻求帮助 Raizlabs/DBFlow 但是,如果有人
首先,我使用 mingw 完成了构建并创建了 sqlcipher.exe 文件。顺便说一下,构建过程中出现了警告。所以,我怀疑我是否正确构建了它。 警告内容: $ make ./libtool --m
我的问题与这个非常相似one但略有不同。当我只是尝试查询表中已被 SQLCiper 加密的所有内容时,出现以下错误. 12-29 11:37:54.329: E/Cursor(10837): Fin
我已经对我的应用程序进行了一段时间的测试,没有出现任何问题。但是,今天我的 myTouch 4G 收到了 T-Mobile 的系统更新。我的应用程序使用 SQLCipher 现在在打开时崩溃并出现以下
我们将 SqlCiper sqlite 数据库集成到我们的 Android 项目中。我们发现未加密的 SqlCiper sqlite db 和加密的 SqlCiper sqlite db 的数据库查询
我正在 Android 上试验 SQLCipher。我写了一个小应用程序,它在模拟器上创建了一个包含一张表和几条记录的数据库。然后,我将数据库从模拟器拉到我的桌面上。我查看了 SQLCipher 文档
我想为我的 Raspberry Pi 使用 OpenSSL 交叉编译 SQL-Cipher。我使用 crosstool-ng 作为编译器工具链。 ./configure --enable-tempst
我正在尝试用 sqlcipher 替换 POCO 的 sqlite|在我的 Mac Lion 上。关于构建过程和替换的信息不多,但我想我应该试一试。 我有 sqlcipher 合并,然后我用 sqlc
是否可以检查给定 key 是否是已打开和解锁数据库的正确解密? #define SQLITE_HAS_CODEC #include #include sqlite3 *open_db(void)
我有一个使用 SQLCipher 的 Android 应用程序,我使用了 SQLCipher 主网站 还有这个question 我已准备好所有正确的 jars 和 .so 文件。 在混淆文件中,我指定
在我的应用中,我们在工作线程中为大约 2000 条记录执行 applyBatch。 同时,如果我旋转屏幕,我会出现黑屏。 "main@6280" prio=5 waiting java.lang.Th
我尝试使用 SQLCipher 来加密/解密我的数据库。它似乎有效,但我想确定我做的是否正确。这是我的代码: public class MainActivity extends Activity {
大家好,我在使用 SQLcipher db for android 时遇到了一些问题该文档描述性不强,所以我无法理解。 我正在尝试修改 sqlcipher for android 的默认迭代次数,我正
我目前正在关注 Mark Murphys 的 SQLite android 教程。我偶然发现了 SQLCihper,当它从设备上取下时,它能够使数据不可读。我制作了自己的示例应用程序,DB 和 Mai
是否可以使用 SQLCipher 打开现有的 SQLite 数据库? 到目前为止,我只能使用 SQLCipher 创建一个新数据库才能使用它。 谢谢! 最佳答案 是的,您可以打开现有的 SQLite
我遵循了列出的所有步骤 here ,但我不知道为什么我无法构建项目。我遇到了一些编译器错误 /Users/macbook2/Library/Developer/Xcode/DerivedData/My
关于 Android 中 SQLCipher 稳定性的一般问题,以及 github readme可能只需要更新。图书馆的最新完整描述非常古老(5 月 11 日),内容如下: the Android s
我是一名优秀的程序员,十分优秀!