【问题标题】:Is my SQLite Database is secured after using SQLCipher?使用 SQLCipher 后我的 SQLite 数据库是否安全?
【发布时间】:2021-06-14 12:52:40
【问题描述】:

我已将 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/ 目录中的数据

root 设备可以访问 data/data/com.applicationname/ 目录权限。那么使用 SQLCipher 将不允许用户访问该目录?

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

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

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

提前致谢。

【问题讨论】:

    标签: android database encryption sqlcipher-android


    【解决方案1】:

    不,你不安全。为什么? android pentest有很多黑盒和白盒。

    此外,当您向所有人提供您的 APK 文件时,其中包含您的数据库和该密码。很快就会有人发现

    在根设备或虚拟机或模拟器上,攻击者的事情变得更容易。他可以使用 Cydia 之类的工具在运行时观察您的应用程序行为。并找出一切。

    因此,如果您真的想隐藏某些内容,请不要显示出来。使用服务器 API 并每次请求真正需要的确切数据量。

    【讨论】:

      【解决方案2】:

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

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

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

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

      要从字符串创建 SHA-256,请检查 link

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

          【解决方案4】:

          密码硬编码不安全

          如果您将密码硬编码到代码中,那么它肯定不安全。如果攻击者得到了你的 APK 并且知道如何反编译它,他就可以很容易地得到 DB 密码,而且代码的混淆程度并不重要。

          然后怎么办

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

          【讨论】:

            【解决方案5】:

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

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

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

            【讨论】:

              【解决方案6】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2022-10-13
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-07-31
                • 1970-01-01
                • 2011-11-08
                相关资源
                最近更新 更多