如何开始使用SQLCipher for Android?

23

我需要使用SQLCipher来开发Android应用...我已经使用SQLite制作了我的应用程序,现在只想将其转换为SQLCipher。

问题是,我对SQLCipher一无所知。

我在这个链接中阅读了有关它的信息: http://sqlcipher.net/sqlcipher-for-android/

但我还是不太清楚。

我想知道是否能提供一些基本的针对Android的SQLCipher教程,其中所有内容都是从绝对基础开始以简单易懂的方式讲解的。

谢谢!


4
我曾做过一场关于SQLCipher及相关安全问题的会议研讨(http://www.slideshare.net/commonsguy/sqlcipher-for-android),并在我的书中有两章内容介绍SQLCipher,其中包括我在那次研讨会实践环节所使用的教程(http://commonsware.com/Android)。 - CommonsWare
您是否有一些不太清楚的具体问题? - Nick Parker
3个回答

26

为了在 Android 中正确使用 SQL Cipher,您需要使用外部库并更改与数据库交互的一些代码。

  1. 首先必须将它们添加到您的项目中(位于libs文件夹中)。请参考此处以获得这些内容:http://sqlcipher.net/sqlcipher-for-android/

  2. 其次,您需要将icudt4dl.zip文件添加到资产文件夹中,该Zip带有SQL Cipher库。

  3. 右键单击您的项目,转到属性,然后转到Java生成路径,然后包括类库,例如commons-codec.jar、guava-r09.jar、sqlcipher.jar。完成此操作后,请进行干净的构建。

  4. 然后在您的应用程序中,不要导入android.database.sqlite,而是导入net.sqlcipher.database

  5. 更改任何与DB交互的代码,例如:

    SQLiteDatabase.loadLibs(context);

    String dbPath = this.getDatabasePath("dbname.db").getPath();

    SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbPath,"dbPassword", null);

  6. 验证数据库是否已加密,转到Eclipse的DDMS透视图,单击文件浏览器选项卡,导航到data/data/,单击.db文件并选择获取设备文件,将其保存到桌面并使用文本编辑器打开。查找您一直在插入数据库中的明文值,如果仍然可以读取它们,则出了些问题。

在实施SQL Cipher之前,检查一下一些SQLite教程也是一个好主意。这里提到了一个很好的教程:Android sqlite database - where do i start as the tutorial has gone for notepad?

更新

此答案现已过时,Eclipse 在 Android 开发中几乎已经被淘汰。我最近必须在 Android Studio 中构建一个使用 SQLCipher 的应用程序,适用于 Android 5 + 6,以下是我遵循的步骤。

在 Android Studio 中,您可以将 SQLCipher 作为依赖项包含在您的构建文件中。更新build gradle中的依赖项以包括以下行:

dependencies{
    compile 'net.zetetic:android-database-sqlcipher:3.5.4@aar'
}
你可以在这里了解版本更新情况: https://mvnrepository.com/artifact/net.zetetic/android-database-sqlcipher 如果我的应用程序无法构建,除非我删除lib文件夹和asset文件夹中的SQLCipher文件,但是删除后应用程序将按预期工作。一旦你进行了这些更改,请运行构建/清理并检查是否有效。 更改代码的同样步骤仍然适用。

2
请参考此贴,因为它更为更新:https://dev59.com/347da4cB1Zd3GeqP9ikG#34309425 - Alécio Carvalho

9
虽然您仍可以按照Zetetic的Eclipse教程添加.so库,但您无需在Android Studio中这样做。只需添加Gradle依赖项,例如compile net.zetetic:android-database-sqlcipher:3.3.1-2@aar ,即可使用!此处 您可以始终检查最新的aar版本,在这里,您可以了解更多有关集成的内容。

0
//in build.gradle
implementation 'net.zetetic:android-database-sqlcipher:4.4.0@aar'
implementation "androidx.sqlite:sqlite:2.1.0"

 // in activity
 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // initialize sqlite libraries
        SQLiteDatabase.loadLibs(this)

        // initializing db
        val database = SQLiteDatabase.openOrCreateDatabase(
            "/some/path",
            "mypassword",
            null
        )

        // creating table if not exists
        database.execSQL("create table if not exists $DB_TABLE_NAME($DB_COLUMN1_NAME,  $DB_COLUMN2_SURNAME)")

        // get data from db
        s = loadFromDB()
    }




  private fun loadFromDb(): String {
        var s = ""
        var i = 0

        createTableIfNotExist()
        val cursor = database.rawQuery("select * from $DB_TABLE_NAME", null)
        cursor?.moveToFirst()
        if (!cursor.isAfterLast) {
            do {
                s += "col_${i++}: name:${cursor.getString(0)} surname:${cursor.getString(1)}\n"
            } while (cursor.moveToNext())

            cursor.close()
            return s
        }

        return s
    }

没有真实世界的例子和文档,开始可能有些困难!这里有一个简单的 例子文档。它非常简单、方便使用!

如果你喜欢这个例子,请别忘了点赞并在需要时做出贡献。谢谢!


虽然这些链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。仅有链接的答案如果链接页面更改可能会变得无效。 - Matt Ke
谢谢您的建议!我会尽快更新我的答案。 - Khamidjon Khamidov

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