问题标签 [sqlcipher-android]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
503 浏览

android - TimeoutException:net.sqlcipher.database.SQLiteCompiledSql.finalize() 10 秒后超时 (Android)

在我的 android 应用程序中,我使用 Room 和 sqlcipher 库进行加密/解密。我经常在 Crashlytic 中看到以下崩溃:

java.util.concurrent.TimeoutException:net.sqlcipher.database.SQLiteCompiledSql.finalize() 在 java.util.concurrent.locks.LockSupport.park(LockSupport 的 sun.misc.Unsafe.park(Native Method) 处的 10 秒后超时.java:190) 在 java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:902) 在 java.util.concurrent. locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1227) at java.util.concurrent.locks.ReentrantLock$FairSync.lock(ReentrantLock.java:231) at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java: 294) 在 net.sqlcipher.database.SQLiteDatabase.lock(SQLiteDatabase.java:567) 在 net.sqlcipher.database.SQLiteCompiledSql。releaseSqlStatement(SQLiteCompiledSql.java:104) 在 net.sqlcipher.database.SQLiteCompiledSql.finalize(SQLiteCompiledSql.java:146) 在 java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:289) 在 java.lang.Daemons$FinalizerDaemon .runInternal(Daemons.java:276) 在 java.lang.Daemons$Daemon.run(Daemons.java:137) 在 java.lang.Thread.run(Thread.java:929)

它崩溃的线是SQLiteDatabase.lock() line 567

以前是第 566 行,但在那个方法中我插入了一个检查:如果数据库未打开 -> 返回并且不继续锁定,但它没有帮助并且崩溃再次出现。我认为这个崩溃可能是因为垃圾收集发生在应用程序在后台时(我们的应用程序有一个一直工作的前台服务)。但不确定如何解决。至于房间:我没有关闭它,它一直打开,因为我的应用程序一直在运行,所以经常需要它。每次查询数据库后关闭它是不好的做法。

我询问了 sqlcipher 的开发人员,但他们不知道,什么会导致这个崩溃。也许有人知道?

0 投票
1 回答
322 浏览

android-room - Android 使用 SQLCipher 更改加密 Room DB 的密码

我成功地使用 SQLCipher 加密了我的 Room DB。

我现在想让用户选择更改数据库密码。那么如何使用 Room DB 更改 SQLCipher 密码呢?

0 投票
1 回答
276 浏览

android - Room SQLCipher 提供了一个替代的 LibraryLoader

我想知道是否有办法为 SQLCipher 添加替代 LibraryLoader。
某些设备Huawei Enjoy 9s(Android 5.1 rooted)和Nexus 4(Android 6.0.1 not rooted)会产生下一次崩溃:

致命异常:java.lang.UnsatisfiedLinkError dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.application-1/base.apk"], nativeLibraryDirectories=[/data/app/com.application.app -1/lib/arm, /v​​endor/lib, /system/lib]]] 找不到“libsqlcipher.so”

如果可能,我如何找到要加载的适当库名称以及在哪里执行操作?
这是来自的代码SQLiteDatabase

这就是我创建数据库实例的方式:

0 投票
0 回答
305 浏览

android - 当我们使用 Koin 依赖注入时,将密码设置为用户的房间加密

我们有这样的数据库 module

现在我们想像这样加密我们的数据库SQLiteDatabase

并设置factory如下:

那么我们就不会passwordstatic我们"123"想要从用户动态中获取它一样。

像这样的东西:

注意:考虑到我们使用Koin它并在编译时创建实例,这怎么可能?

0 投票
0 回答
65 浏览

android - Android 房间数据库查询不适用于 SQLCipher

我在从表中检索同一日期的最高记录时遇到问题。使用最新版本的 SQLCipher 4.4.2 & 房间数据库版本是 2.2.6。

编号 | 日期值 | 产品名称 | 价格

  • 1 | 2021/01/20 | 美国广播公司 | 50
  • 2 | 2021/01/20 | XYZ | 60
  • 3 | 2021/01/20 | XYZ | 65
  • 4 | 2021/01/20 | 美国广播公司 | 60
  • 5 | 2021/01/21 | 美国广播公司 | 70

询问:

select t.*, (select t2.id from table_product t2 where t.date_value = t2.date_value order by t2.id desc limit 1) as id1 from table_product t group by t.date_value order by t.date_value

结果:

1 | 2021/01/20 | 美国广播公司 | 50

返回第一条记录,而不是同一日期的最新记录。

我做错了还是有其他方法可以从同一日期的多条记录中获取最新记录?

请帮忙!!

谢谢

  • 测试班

0 投票
5 回答
558 浏览

android - 使用 SQLCipher 后我的 SQLite 数据库是否安全?

我已将 SQLiteOpenHelper 替换为import net.sqlcipher.database.SQLiteOpenHelper

为了将数据插入数据库并从中获取数据,我使用了
SQLiteDatabase db = this.getWritableDatabase("mypassword");

而不是下面

SQLiteDatabase db = this.getWritableDatabase();

下面是我的 oncreate 和 onUpgrade,

在 MainActivity 中,

以下是我的依赖项

我正在使用 SQLCipher 来防止我的应用程序被攻击者访问存储在 /data/data/com.applicationname/ 目录中的数据

有根设备可以访问 data/data/com.applicationname/ 目录。然后使用 SQLCipher 不会允许用户访问该目录?

  1. 现在我想确定我的数据库现在是否安全。怎么知道?
  2. 我在 getWritableDatabase 中使用硬编码密码。这是好方法吗?或者它可能被黑客入侵?

我还看到了下面的加密教程。所以现在我很困惑。使用 SQLCipher 本身很好或需要像下面的教程那样做

https://www.raywenderlich.com/778533-encryption-tutorial-for-android-getting-started%20tutorial#toc-anchor-001

提前致谢。

0 投票
0 回答
74 浏览

android - 无法使用 amitshekhar 打开加密数据库

您好,我一直在使用这个库,但现在没有 sqlcipher,我已经将我的数据库转换为 sqlcipher,并在应用程序启动后按照此处定义的所有步骤进行操作IP 用于正确显示共享首选项数据,但是当我单击我的 sqlcipher 数据库时,它什么也不显示并且也获取日志

在 Build.gradle

实现的库

1

2

当我点击我的数据库时,我也在日志中得到这个

2021-04-22 13:24:05.712 7274-7372/com.xxx.xxxE/ClientServer:例外。net.sqlcipher.database.SQLiteException: file is not a database: ,编译时:select count(*) from sqlite_master; 在 net.sqlcipher.database.SQLiteCompiledSql.native_compile(Native Method) 在 net.sqlcipher.database.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:89) 在 net.sqlcipher.database.SQLiteCompiledSql.(SQLiteCompiledSql.java:62) 在 net. sqlcipher.database.SQLiteProgram.(SQLiteProgram.java:91) 在 net.sqlcipher.database.SQLiteQuery.(SQLiteQuery.java:48) 在 net.sqlcipher.database.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:60) 在 net.sqlcipher .database.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:2016) 在 net.sqlcipher.database.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1902) 在 net.sqlcipher.database.SQLiteDatabase。

0 投票
0 回答
117 浏览

android - UndeliverableException:android.database.sqlite.SQLiteReadOnlyDatabaseException:尝试写入只读数据库

我正在使用带有 SQLCipher 的 DBFlow。我正在尝试在 Android 中使用 SQLCipher 加密已经存在的 SQLite 数据库(使用 DBFlow)。

我使用以下代码加密数据库:

数据库加密得很好,但是当我尝试编写任何操作时:

数据库型号:

然后得到以下异常:

io.reactivex.exceptions.UndeliverableException:android.database.sqlite.SQLiteReadOnlyDatabaseException:尝试写入只读数据库(代码 1032 SQLITE_READONLY_DBMOVED[1032])

我在这里找到了类似的帖子,但没有找到任何解决方案。

另外,我发现是用 SQLCipher 加密 DBFlow 数据库并实现它。然后,如果我将它作为新应用程序安装它就可以工作,但是当我将此应用程序安装在没有加密数据库的旧应用程序之上时,它就会失败。

net.sqlcipher.database.SQLiteException: file is not a database: ,编译时:select count(*) from sqlite_master;

请建议我该如何解决这个问题?

0 投票
0 回答
116 浏览

android - DB Flow - net.sqlcipher.database.SQLiteException: file is not a database: ,编译时:select count(*) from sqlite_master;

我有一个已经投入生产多年的应用程序。它使用内部使用标准 SQLite DB的DBFlow 。该应用程序的最新版本集成了 SqlCipher 4.4.3 库。

我按照这种方法加密数据库,然后如果我将它安装为新应用程序,它就可以工作,但是当我将此应用程序安装在未加密数据库的旧应用程序之上时,它会因此异常而失败。

我试图从表中读取一些数据:

我试图像这样打开数据库:

用户表:

用户模型:

问题:如何为现有应用打开加密数据库以在 DB Flow 中执行读/写操作?

0 投票
0 回答
75 浏览

android - 从 apk 迁移到 aab 后 SQLite 崩溃

我们刚刚迁移了我们的应用程序以使用应用程序包 (aab) 而不是 apk。在测试过程中没有发现任何问题,但是当我们真正交付给用户时,我们开始收到奇怪的崩溃报告。

SQLite 似乎存在一些内部问题:

如果清除数据库或卸载应用程序然后重新安装,则不再重现该问题。

您认为这可能与 apk 到 aab 的迁移有关吗?有没有人遇到过这样的事情?

我试图在网上搜索类似的问题,但到目前为止我还没有发现任何类似的问题。

我打算尝试以下选项来解决这个问题:

  • 增加数据库版本并回退到特定版本的破坏性迁移,以重新创建手动解决问题的“清除数据”方法。
  • 尝试使用 Google 的新侧载逻辑。基本上,它会在应用程序启动时检测到缺少的必需组件并提示用户重新安装。它不漂亮,但总比崩溃好。我对这种方法有点怀疑,因为我们没有收到任何LinkageErrors 或ResourceNotFound错误,但我别无选择。