问题标签 [sqlcipher]

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 投票
4 回答
5565 浏览

php - SQLite3 数据库加密——确定加密库?

我正在考虑为 PHP 应用程序支持加密的 sqlite 数据库。我正在使用 PHP 的 SQLite3 扩展,似乎它们已经支持加密方法,至少 SQLite3::__construct 允许通过加密密钥。

我无法弄清楚的是,他们在文档中谈论的是哪个加密库。通过谷歌搜索,我发现以下内容:

  • sqlcipher
  • sqlite 见
  • sqlite地穴

我不清楚的是:

  • 这些库如何与 SQLite3 集成
  • 如果它们在指定加密密钥和设置数据访问等方面彼此共享兼容性。
  • 如果我可以在我的应用程序中自动检测是否有,以及我的 SQLite3 安装支持哪个加密库,那么我的应用程序可以支持不同的加密库

很感谢任何形式的帮助!

0 投票
1 回答
934 浏览

ios - 为 iOS 压缩加密的 SQLite FTS3 数据库

我的应用程序使用带有 FTS3 的 SQLite 数据库进行产品搜索。我正在尝试使用 SQLCipher 加密数据库,但这会导致数据库大小膨胀(7mb --> ~20mb)。

似乎没有一种很好的方法来压缩加密的 FTS SQLite 数据库。有人对此有什么建议吗?我必须缩小它以将应用程序保持在 20mb 3g 下载限制之下。

谢谢!

0 投票
4 回答
3006 浏览

android - 如何保护资产文件夹中的数据库 sqlite(通过加密)?

我有过逆向工程的经验,人们可以在 android 中流畅地访问您的数据库。我想知道有什么方法可以在创建时只加密我的数据库(不混淆整个 apk),然后在运行时我会使用我的数据库。

我对数据库的了解较少,因此任何建议都可以保护我在资产文件夹中的数据库。

0 投票
1 回答
969 浏览

ios - SQLite 表需要时间来获取 LIKE 查询中的记录

场景:数据库是 sqlite (需要加密数据库中的记录。因此使用 SQL cipher API for iOS)

数据库中有一个名为 partnumber 的表,其模式如下:

此表包含大约 80K 条记录。

UI 视图中有 3 个文本字段,用户可以在其中输入搜索词,并在用户输入字母后立即进行搜索。

3 个文本字段是:txtFieldDescription、txtFieldMake 和 txtFieldModel。

假设,第一个用户在 txtFieldDescription 中输入搜索词“监视器”。因此,每个字母都会执行的查询是:

1.

2.

3.

4.

5.

6.

7.

到目前为止,一切都很好。现在假设如果用户想要搜索模型(txtFieldDescription 仍然包含“监视器”)。所以用户点击txtFieldModel。一旦用户点击模型,就会触发一个查询:

此查询将返回描述包含监视器(在任何位置)的记录的所有模型。

现在,如果用户想要搜索所有包含单词“sony”的模型(描述字段仍然包含监视器),那么每个字母都会执行的查询是:

1.

2.

3.

4.

现在,如果用户点击 txtFieldMake 并输入搜索词“1980”,那么被触发的查询是:

1.

2.

3.

4.

此处,从 txtFieldDescription 到 txtFieldModel 或 txtFieldModel 到 txtFieldMake 转换的时间延迟太大,在 txtFieldModel 和 txtFieldMake 中,输入的字母在 5 或 6 秒后显示(在处理查询后),因此光标挂在那里.

在分析中,我知道在 like 关键字(如 '%monitor%' 中)中的搜索词之前的通配符会减慢执行速度。在这种情况下,可能有多达 3 个类似的关键字,它们之间带有 AND,因此,执行时间肯定会增加。此外,在 like 开头使用通配符会否定索引。

一些附加信息:

  1. 总记录数~80K

  2. SELECT 查询每次在表部件号上运行(~80K)

  3. 我执行的一些查询的结果:

    /li>
  4. 索引创建如下:

    /li>

提高性能的一些替代方案:

  1. 由于distinct description的计数只有2599,make的计数只有7129,所以可以将表拆分成不同的表,一个包含DISTINCT description COLLATE NOCASE输出(共2599行),一个包含DISTINCT make COLLATE NOCASE(共7129 行)。就模型而言,为其创建不同的表将无济于事,因为行数 ~64644 几乎等于总记录 ~82135。但是这种方法的问题是我不知道如何在这些表中进行搜索,每个表中必须有哪些列以及必须创建多少表。如果用户输入一些描述然后输入模型然后再次输入新的描述会怎样。

  2. 由于此选择查询的结果显示在 UITableView 中,并且用户一次最多只能看到 5 行。因此,我们可以将返回的行数限制为 500,当用户滚动时,可以获取下一个 500,依此类推,直到最后搜索的记录。

但这里的问题是虽然我只需要 500 条记录,但我必须搜索整个表(SCAN ~80K 记录)。所以,我需要一个查询,它首先只搜索表的前 10% 并从中返回前 500 行,然后搜索接下来的 500 到前 10% 的记录,然后是下一个 10%,然后是下一个 10% 到 80000 条记录正在搜索(需要搜索 10-10% 的记录块)。

  1. 如果可以将80K记录的表拆分为4张20K记录的表,然后在所有4张表上同时(在不同的后台线程中)执行搜索以获得结果集。但是在这里我不知道如何在 4 个不同的线程中运行查询(某种批处理执行),何时组合结果以及如何知道所有线程都已完成执行。

  2. 如果我可以用另一个返回相同结果但执行速度更快的函数替换 like %monitor%' 并且该函数的使用不影响索引的使用,(即不绕过索引的使用) ,那么执行可能会变得更快。如果有人可以在 sqlite 中建议我这样的功能,那么我可以继续使用这种方法。

如果您可以帮助我实现这些替代方案中的任何一种,或者您可以向我推荐任何其他解决方案,那么我将能够提高查询的执行速度。并且请不要告诉我在 sqlite 中启用 FTS(全文搜索),因为我已经尝试过这样做,但我不知道确切的步骤。非常感谢您如此耐心地阅读这个问题......

编辑:

大家好,我取得了一些成功。我修改了我的选择查询,如下所示:

而宾果游戏,搜索时间前所未有。但现在的问题是,当我像这样执行命令 EXPLAIN QUERY PLAN 时,它显示我使用 B-Tree 来区分我不想使用的。

输出:

编辑:

对不起大家。上述方法(使用 rowid 进行搜索)在设备上花费的时间比原来的要多。我尝试过删除 distinct 和 order by 关键字,但没有用。在 iPhone 上仍然需要约 8-10 秒。请帮帮我。

0 投票
1 回答
4153 浏览

android - SQLCipher - 在桌面上打开加密数据库

我正在 Android 上尝试使用 SQLCipher。我写了一个小应用程序,它在模拟器上创建了一个包含一个表和几条记录的数据库。然后,我将数据库从模拟器中拉到我的桌面上。我查看了 SQLCipher 文档,但不知道如何在桌面上实际解密数据库,以便查询其内容。我想确保我确实插入了记录。访问记录的最简单过程是什么?谢谢。

0 投票
1 回答
1551 浏览

android - 如何在 android 上使用 sqlcipher 读取以前在 pc 上创建的加密数据库?

我正在尝试在我的 PC 上读取使用 sqlcipher 创建的加密数据库,但我无法在我的应用程序上读取它。例如:

结果如下

还有这个:

回到这个:

我正在使用 sdk-7 进行编译,如果我尝试使用未加密且没有 sqlcipher 的相同数据库,则没有任何问题。谁能教我如何在 android 上读取计算机上加密的数据库?欣赏 ;)

0 投票
1 回答
1130 浏览

android - SQLCipher - 与 Android 应用程序共享 Windows 创建的数据库

我在Windows上编译了sqlite3命令行shell的SQLCipher版本,成功创建了一个加密数据库。然后我想看看我是否可以在 Android 应用程序中使用这个预制数据库。我将数据库复制到 Android 应用程序并尝试调用 SQLiteDatabase.openDatabase 并传入我在 Windows 上使用的密钥,但得到以下结果:

“引起:info.guardianproject.database.sqlcipher.SQLiteException:文件已加密或不是数据库”

有没有人尝试过先在 Windows 上创建一个加密数据库,然后将该数据库与他们的应用程序打包在一起?如果是这样,在 Android 应用程序中键入和打开数据库的过程是什么?

我已阅读以下链接,但没有找到解决方案:

https://groups.google.com/group/sqlcipher/browse_thread/thread/d2694975e8f3809f

如何在 android 上使用 sqlcipher 读取以前在 pc 上创建的加密数据库?

0 投票
2 回答
2660 浏览

android - 使用 sql 密码时我的应用程序崩溃

我在我的应用程序中使用 sql cipher(用于 android的 sql cipher ),它适用于 android 平板电脑以及 android 2.3 以上的版本。但它在 android 2.2 版本中崩溃。任何人都知道这个问题,如果是,请给我一个解决方案。我已经包含了崩溃日志

03-24 05:04:26.440:E/AndroidRuntime(15069):致命异常:主要 03-24 05:04:26.440:E/AndroidRuntime(15069):info.guardianproject.database.sqlcipher.SQLiteException:不是错误 03 -24 05:04:26.440: E/AndroidRuntime(15069): 在 info.guardianproject.database.sqlcipher.SQLiteDatabase.dbopen(Native Method) 03-24 05:04:26.440: E/AndroidRuntime(15069): 在 info. Guardianproject.database.sqlcipher.SQLiteDatabase.(SQLiteDatabase.java:1870) 03-24 05:04:26.440: E/AndroidRuntime(15069): 在 info.guardianproject.database.sqlcipher.SQLiteDatabase.openDatabase(SQLiteDatabase.java:863) 03-24 05:04:26.440: E/AndroidRuntime(15069): 在 info.guardianproject.database.sqlcipher.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:183) 03-24 05:04:26.440: E/AndroidRuntime(15069) : 在 android.view.View.performClick(View.java:2408) 03-24 05:04:26.440: E/AndroidRuntime(15069): 在 android.view.View$PerformClick.run(View.java:8818) 03-24 05:04:26.440: E/AndroidRuntime(15069) : 在 android.os.Handler.handleCallback(Handler.java:587) 03-24 05:04:26.440: E/AndroidRuntime(15069): 在 android.os.Handler.dispatchMessage(Handler.java:92) 03-24 05:04:26.440: E/AndroidRuntime(15069): 在 android.os.Looper.loop(Looper.java:123) 03-24 05:04:26.440: E/AndroidRuntime(15069): 在 android.app.ActivityThread .main(ActivityThread.java:4627) 03-24 05:04:26.440: E/AndroidRuntime(15069): at java.lang.reflect.Method.invokeNative(Native Method) 03-24 05:04:26.440: E/ AndroidRuntime(15069): at java.lang.reflect.Method.invoke(Method.java:521) 03-24 05:04:26.440: E/AndroidRuntime(15069): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller .run(ZygoteInit.java:871) 03-24 05:04:26.440: E/AndroidRuntime(15069): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629) 03-24 05:04:26.440: E/AndroidRuntime( 15069):在 dalvik.system.NativeStart.main(本机方法)

0 投票
1 回答
330 浏览

android - SqlCipher 开放游标是否存在安全问题?

我将 SqlCipher 与内容提供程序一起使用。现在,当我想锁定应用程序时,我只需清除缓存的密码。但是,该应用程序可以继续使用任何打开的光标。这意味着重新打开应用程序会授予对敏感数据的访问权限。如果应用程序没有密码,我会通过重定向到登录屏幕来解决这个问题。

但是,我担心这些打开的游标是否存在任何安全问题,或者我是否应该继续阻止 UI 访问而不担心?SqlCipher 的文档说它动态读取/写入加密页面,而不是解密整个数据库,这让我认为打开的游标仍然是安全的。

这里的主要问题是有人丢失了他们的手机,然后知识渊博的人可以使用这些打开的游标来提取敏感数据。

0 投票
1 回答
2791 浏览

sqlite - SQLCipher Windows 构建

我无法按照这些步骤在 Windows 上构建 sqlcipher 。

在链接阶段,gcc 给出了这个错误: