如何在Android中解密SQLCipher加密文件?

5

我已经使用SQLCipher在Android上开发了一个应用程序,这是一种保护应用程序中的数据库文件的安全方式。它对加密工作得很好,但我想要解密加密的DB文件,并在SQLite Browser中查看它。

实际上,我有很多可用的表格和数据。现在,如果我想查看加密的DB数据,没有办法查看它(只能查看日志)。但是使用SQLite Browser,我看不到它。

我正在使用"info.guardianproject.database.sqlcipher.SQLiteDatabase"

我尝试了许多方法来解密它并在SQLite Browser中查看它,但是它会出现错误“An Error Occured:file is not a sqlite3 database”。

有人能帮助我解密加密的DB文件吗?

或者我应该复制加密的DB文件并使用"info.guardianproject.database.sqlcipher.SQLiteDatabase"进行解密,然后使用它来查看所有表格。

谢谢,

Mishal Shah


请查看此链接 - http://stackoverflow.com/a/25132385/847575 - Vinay W
5个回答

5

我通过从设备中提取并解密数据库来解决了这个问题。下面的脚本将生成一个解密后的数据库文件。该文件可以使用SQLite查看器打开。

decrypt.sh

#!/bin/bash
# Bashscript to decrypt databases

echo "pull db from device.."
adb pull /data/data/com.example/databases/database.db

echo "removing previous decrypted db, if existent.."
rm -r decrypted_database.db

echo "decrypting database.db into decrypted_database.db"
sqlcipher -line database.db 'PRAGMA key = "encryption_key";ATTACH DATABASE "decrypted_database.db" AS decrypted_database KEY "";SELECT sqlcipher_export("decrypted_database");DETACH DATABASE decrypted_database;'

应该在您的PATH中:

在脚本中替换:

  • com.example 使用您的包名进行替换
  • database.db 使用数据库文件名进行替换
  • encryption_key 使用加密密码进行替换

注意:设备必须已经root。


这个错误仍然显示为“错误:文件已加密或不是数据库”。在上述语句中,我只是将database.db替换为我的文件名。有什么我漏掉的吗? - CoDe
@Shubh,你需要替换包名、database.db文件名和加密密钥。如果我有时间,我会更新这个脚本,让它从命令行接收参数。 - Tobrun
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - CoDe

2
您需要使用一个集成了SQLCipher扩展的SQLite工具。您可以在Linux上下载和构建SQLCipher代码,这将为您提供一个sqlite3工具,您可以使用它来访问数据库(使用适当的PRAGMA语句指定密码等)。请注意保留HTML标签。

感谢您分享。我之前已经将它用在应用程序中并查看了示例,但是我该如何解密并打开它到 SQLite 浏览器中呢?您能否分享一个示例或安卓代码,以便解密该文件并将其打开到 SQLite 浏览器中。 - Developer
@Mishal:我不知道你所说的“SQLite浏览器”是什么。如果它不是sqlite3命令行实用程序,那么你将不得不联系“SQLite浏览器”的作者,并询问他们是否支持SQLCipher。 - CommonsWare
我正在使用 "info.guardianproject.database.sqlcipher.SQLiteDatabase" 来使用 SQLCipher 加密数据库,并希望以相同的方式解密它并打开它,以便可以在一个视图中查看所有表。 - Developer
1
另一种选择:您可以使用sqlcipher_export()命令行工具将加密的数据库导出到标准sqlite数据库,然后可以使用任何工具打开它。请注意,这将暴露SQLCipher数据库中的所有机密信息,因此仅适用于测试数据。此外,您应该升级到最新版本的SQLCipher for Android,因为使用info.guardianproject.database.sqlcipher的版本已经非常过时了。 - Stephen Lombardo
我想通过代码本身来实现。我正在使用“info.guardianproject.database.sqlcipher”包对数据库进行加密。现在,我想要一些帮助,仅使用“info.guardianproject.database.sqlcipher”包解密数据库文件,以便创建一个完全解密并可以在“SQLite数据库浏览器”中打开的全新副本。如果有人拥有使用“info.guardianproject.database.sqlcipher”包解密数据库的源代码,请分享。否则,我将从加密的数据库创建不同的解密数据库副本。请告诉我是否可能。 - Developer

0

在你的安卓应用程序代码中,在

dbHelper.getReadableDatabase(dbKey);之后,文件将被解密...通过编写文件复制代码将数据库文件复制到某个外部SD卡文件路径,并使用任何sqllite工具打开它。


0

decrypt.sh脚本曾经帮了我很多忙。但是过了一段时间,我发现SQLiteManager开始支持SQLCipher加密数据库了。它有一个漂亮的用户界面。虽然它不是免费的,你仍然需要从设备中提取数据库文件,但我认为这值得一试。


-1

Gnome的GDA可以做到这一点。在这里下载。


我已经下载并安装了该应用程序,但是当我尝试使用加密的DB打开它时,它不允许。它会显示错误信息:“DB文件已加密”,请问为什么无法打开我已经设置密码的SQLCipher加密的DB文件,能否帮我解决这个问题? - Developer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接