【问题标题】:sqlite encryption for android安卓的sqlite加密
【发布时间】:2011-05-18 11:33:51
【问题描述】:

我正在努力寻找在 Android 设备上加密我的 sqlite 数据库的可能性,但我找不到令人满意的解决方案。

我需要类似库之类的东西来引用,以便在使用普通 sqlite 函数时对我的数据库进行“即时”加密/解密。

我不想在存储之前加密数据。

我不想加密整个数据库文件,以便在使用前对其进行解密。

我知道以下项目:

但我找不到这些东西的任何工作示例。

顺便说一句,我绝对愿意购买商业版本,但我必须在花费几百美元之前进行测试。

有人自己解决了这个问题吗?

【问题讨论】:

  • 没有充分的理由加密数据库。如果有人想访问它,他总是可以对您的应用程序进行逆向工程以检索密钥。
  • 不,如果我强制用户在启动应用程序时输入密码,则不会
  • 找不到 SQLCipher 的任何示例?见zetetic.net/sqlcipher/sqlcipher-for-android

标签: android sqlite encryption


【解决方案1】:

尝试使用 SQLCipher port to Android 代替常规 SQLCipher。

【讨论】:

  • 在包含 icudt46.zip 文件以解决兼容性问题后,使用 SQLCypher 会使我的应用程序变得更大 8-10MB。还有其他加密数据库的简单方法吗?
  • @Saty:我不知道。
  • 我究竟如何下载二进制文件,Zetetic 页面导致下载页面没有实际下载。
  • @Michael:将compile 'net.zetetic:android-database-sqlcipher:3.3.1-2@aar' 添加到您模块的dependencies 文件中的build.gradle。
  • @CommonsWare 哦,嗯。是否不再可以在 Android Studio 的项目中下载 zip 文件并将文件拖放到某个位置?
【解决方案2】:

litereplica 支持 encryption 使用 ChaCha 密码,比便携式设备上的 AES 更快。

Android 有bindings。

要创建和打开加密数据库,我们使用如下 URI:

"file:/path/to/file.db?cipher=...&key=..."

【讨论】:

    【解决方案3】:

    如果有人还在寻找:

    覆盖SQLiteOpenHelper函数如下:

    void onConfigure(SQLiteDatabase db){
        db.execSQL("PRAGMA key = 'secretkey'");
    }
    

    【讨论】:

      【解决方案4】:
      private String encrypt(String password) {
         try {
              SecretKeySpec keySpec = generateKey(password);
              Cipher c = Cipher.getInstance("AES");
              c.init(Cipher.ENCRYPT_MODE,keySpec);
              byte[] encVal = c.doFinal(password.getBytes());
              String encryptedValue = Base64.encodeToString(encVal,Base64.DEFAULT);
              return encryptedValue;
      
          } catch (Exception e) {
              e.printStackTrace();
              return null;
          }
      }
      
      private SecretKeySpec generateKey(String password) throws Exception {
          final MessageDigest digest = MessageDigest.getInstance("SHA-256");
          byte[] bytes = password.getBytes(StandardCharsets.UTF_8);
          digest.update(bytes,0,bytes.length);
          byte[] key = digest.digest();
          SecretKeySpec secretKeySpec = new SecretKeySpec(key,"AES");
          return secretKeySpec;
      }
      

      我只是使用encrypt 函数来加密密码。这里我使用了用户的密码作为密钥。因此我不需要将密钥保留在应用程序中。当用户想登录时,只需将密码加密,并尝试与数据库中的加密密码匹配,并允许他们登录。

      【讨论】:

        猜你喜欢
        • 2011-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多