8

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

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

而不是下面

SQLiteDatabase db = this.getWritableDatabase();

下面是我的 oncreate 和 onUpgrade,

@Override
    public void onCreate(net.sqlcipher.database.SQLiteDatabase db) {

        db.execSQL(ARecords.CREATE_TABLE);
        db.execSQL(BRecords.CREATE_TABLE);
    }

    @Override
    public void onUpgrade(net.sqlcipher.database.SQLiteDatabase db, int oldVersion, int newVersion) {
// Drop older table if existed
        db.execSQL("DROP TABLE IF EXISTS " + ARecords.TABLE_NAME);
        db.execSQL("DROP TABLE IF EXISTS " + BRecords.TABLE_NAME);
        //Create tables again
        onCreate(db);

    }

在 MainActivity 中,

SQLiteDatabase.loadLibs(this);

以下是我的依赖项

implementation 'net.zetetic:android-database-sqlcipher:4.4.3'
    implementation 'androidx.sqlite:sqlite:2.1.0'

我正在使用 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

提前致谢。

4

5 回答 5

3

我假设您将数据库捆绑在资产或类似的东西中,在这种情况下,无论您尝试多少,总有攻击者可以攻击您(但在大多数情况下,他们不会,因为有对他们来说什么都没有)但是密码可能会减慢攻击者的速度(但是如果要捆绑,您还必须将密码放入您的代码中,这意味着根本没有安全性)

于 2021-03-20T13:51:02.030 回答
1

你几乎没问题,你只需要一个额外的步骤来实现一个安全的数据库:使用运行时/随机生成的密码

SQLCipher 将加密您的数据库文件。这意味着 root 设备上的任何人都可以访问设备的任何目录,但 DB 文件将被加密(来源:https : //www.zetetic.net/sqlcipher/about/)。SQLCipher 只是一个库,它不会影响文件系统,因此它不能阻止任何目录访问。

正如其他用户所说:硬编码密码不安全
任何攻击者都可以轻松读取它们并解密任何内容。所以你应该做的是在第一次应用程序启动时生成一个随机密码,并用它来加密/解密你的数据库。你可以生成一个 UUID,一个随机数,随你喜欢。
永远不要依赖与设备相关的标识符(IMEI、DeviceId 等):其他任何人都可以简单地对您的应用程序进行逆向工程并发现密码!

最后一步是:在哪里以安全的方式存储我生成的密码,这样没有人可以读取它?在这样一个安全的地方:https ://developer.android.com/training/articles/keystore

于 2021-03-25T09:26:54.010 回答
1

密码硬编码不安全

如果您将密码硬编码到代码中,那么它绝对不安全。如果攻击者得到了你的 APK 并且知道如何反编译它,他就可以很容易地得到 DB 密码,而且不管代码有多模糊。

那怎么办

一种方法是在每次建立数据库连接之前要求用户填写密码(通过一些对话框)。然后,此密码可用于打开连接。显然,它必须足够强大,并且之后不能存储在任何地方。为您的数据库提供更改密码也是一个好主意,因为用户倾向于对多个服务使用相同的密码,如果他们的密码被泄露,他们需要能够更改它。

于 2021-03-24T17:36:07.103 回答
0

我在 getWritableDatabase 中使用硬编码密码。

出于什么目的?如果您将它们存储在那里以使用用户输入的密码进行验证,并在它们匹配时允许某些操作,那是不好的方法

但是为什么不存储原始输入密码的 SHA-256 呢?当人们输入密码时,您将检查输入密码的 SHA-256 是否与存储到 db SHA-256 的匹配。

最酷的是没有人可以从 SHA-256 获得原始字符串。这是安全的。

要从字符串创建 SHA-256,请检查此链接

于 2021-03-26T06:55:54.440 回答
0

使用 SQLCipher 并不能保证数据库的安全性。您需要考虑为您的数据库添加一个额外的层。

硬编码密码是不安全的。您可以使用盐,甚至通过组合特定于硬件的值(如序列号、IMEI 等)来提高强度。

这可以使您的数据库更加安全。没有100%的安全,总是有缺陷的。

于 2021-03-23T06:53:42.073 回答