【问题标题】:Android SQLCipher and DB from assets folder资产文件夹中的 Android SQLCipher 和 DB
【发布时间】:2012-12-16 22:44:43
【问题描述】:

目前,我的 sqlite db 文件加密,它从assets 文件夹复制到应用程序data/data/mypackage/databases 文件夹。

现在我想将SQLCipher 库添加到我的项目中并开始使用它们。 我可以加密 db 文件并将其复制到 assets 并在应用程序中使用相同的密钥吗? 是否可以在 Windows 上加密数据库?我需要做什么?

【问题讨论】:

  • SQLCipher 的目标是帮助用户 保护他们的 数据免受其他人的侵害。您似乎试图阻止用户访问他们的数据。这行不通。 “我可以加密 db 文件并将其复制到资产并在应用程序中使用相同的密钥吗?” ——是的,但是你在浪费每个人的时间,因为任何想要的人都可以简单地从你的应用程序中获取密钥并解密数据库。如果您不希望用户访问这些数据,请不要将数据放在用户的设备上。
  • 嗯,我明白你的意思了......所以这是不可能的,对吧?所以使用我在我的应用程序中集成 SQLCipher 的场景,我应该让用户选择密码,是这样吗?所以我不能使用资产中的数据库,我需要用语句构建数据库吗?
  • “所以不可能,对吧?” ——我不确定“它”是什么。 “是吗?” - 是的。 “所以我不能使用资产中的数据库,我需要用语句构建数据库吗?” -- 您可以在 assets 中发送一个未加密的数据库,然后使用 SQLCipher 使用用户选择的密码对其进行加密。

标签: android sqlcipher


【解决方案1】:

我认为我们应该这样做

SQLiteDatabase normalDB = null;
SQLiteDatabase cryptedDB = null;
normalDB = SQLiteDatabase.openDatabase(dbPath, "", null,
    SQLiteDatabase.OPEN_READONLY
    | SQLiteDatabase.NO_LOCALIZED_COLLATORS);

cryptedDB = SQLiteDatabase.openOrCreateDatabase(
    encrypteddbPath, Constants.CRYPT_KEY, null);

Cursor cursor;

cursor = normalDB.query(TABLE_CITY,
new String[] { FIELD_CITY_CODE, FIELD_NAME1,
    FIELD_NAME2, FIELD_NAME3 }, null, null, null,
    null, null);
int i = cursor.getCount();
while (i > 0) {
    ContentValues newLabelValues = new ContentValues();

newLabelValues.put(FIELD_CITY_CODE, cursor.getString(0));
        newLabelValues.put(FIELD_NAME1, cursor.getString(1));
        newLabelValues.put(FIELD_NAME2, cursor.getString(2));
        newLabelValues.put(FIELD_NAME3, cursor.getString(3));
        cryptedDB.insert(TABLE_CITY, null, newLabelValues);

cursor.moveToNext();
}

【讨论】:

    猜你喜欢
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 2018-01-29
    • 2011-01-22
    • 2010-12-28
    • 2011-10-01
    • 1970-01-01
    相关资源
    最近更新 更多