【问题标题】:SQLite Context.MODE_PRIVATESQLite Context.MODE_PRIVATE
【发布时间】:2013-01-28 16:40:58
【问题描述】:

我想知道:

我们可以在创建数据库时在SQLite 中使用Context.MODE_PRIVATE 以防止不必要的数据库访问。

我在谷歌上没有得到任何示例。
如何在数据库中使用这个Context.MODE_PRIVATE
请帮助我。提供任何链接或示例。

IN THIS LINK 他们在谈论文件。所以数据库也是文件。

我该如何实现?

【问题讨论】:

  • myDB = openOrCreateDatabase(DATABASE_NAME,Context.MODE_PRIVATE,null);
  • 请提供任何链接。在创建数据库时使用此行。
  • 内部存储上的 SQLite 数据库默认是私有的。内部存储上的文件只能由您的应用访问。例外情况是在已植根的设备上,在这种情况下,用户可以访问您的内部存储。
  • 感谢 commonsWare 你总是给出完美的答案..但我想问一下,我正在尝试的是否可能。
  • 或者我可以说在外部 sdcard 中没有私有 .. 都是公共的吗?

标签: android sqlite


【解决方案1】:

正如 commonsware 所提到的,内部存储上的 SQLite 数据库默认是私有的。但正如其他人提到的那样,植根手机始终可以访问您的文件。

您可以使用任何加密算法将数据保存在数据库中,这将帮助您限制可读性,除非入侵者知道加密算法。

您不能在 SQLite 中设置“Context.MODE_PRIVATE”标志。

【讨论】:

    【解决方案2】:

    创建数据库时,以下语法很有用

    openOrCreateDatabase(String path, int mode, SQLiteDatabase.CursorFactory factory)
    

    例如,

    openOrCreateDatabase("StudentDB",Context.MODE_PRIVATE,null);
    

    this 网站上查看我的教程。

    【讨论】:

    • 它说“MODE_PRIVATE 上的必需类型 CursorFactory
    【解决方案3】:

    选项 1:使用SQLcipher

    选项 2:安全方法永远没有机会被黑客入侵。它并不完美,但总比没有好。

    1) 使用此函数插入​​数据:

    public static String getEncryptedString(String message) {
        String cipherText = null;
    
        try {
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(("YOUR-SECURE-PASSWORD-KEY").getBytes(), "AES"));
            byte[] bytes = cipher.doFinal(message.getBytes());
            cipherText = Base64.encodeToString(bytes, Base64.DEFAULT);
        } catch(Exception ex) {
            cipherText = "Error in encryption";
            Log.e(TAG , ex.getMessage());
            ex.printStackTrace();
        }
    
        return cipherText;
    }
    

    2) 从数据库中获取数据并传入该函数参数:

    //This function returns output string 
    public static String getDecryptedString(String encoded) {
        String decryptString = null;
    
        try {
            byte[] bytes = Base64.decode(encoded, Base64.DEFAULT);
    
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(("YOUR-SECURE-PASSWORD-KEY").getBytes() , "AES"));
            decryptString = new String(cipher.doFinal(bytes), "UTF-8");
        } catch(Exception ex) {
            decryptString = "Error in decryption";
            ex.printStackTrace();
        }
    
        return decryptString;
    }
    

    3) 这些方法的好处: - 没有正确的密钥就无法解密。 - AES 加密是一种非常安全的加密方法。

    4) 将您的 AES 密钥存储在 c++ 文件中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 2010-11-01
      • 2012-07-03
      • 2016-08-10
      相关资源
      最近更新 更多