【问题标题】:Encrypt/Decrypt SQLite-database and use it "on the fly"加密/解密 SQLite 数据库并“即时”使用它
【发布时间】:2011-02-04 00:34:30
【问题描述】:

事情是这样的: 在我的 Qt4.6 项目中,我使用 SQLite 数据库。这个数据库不应该在我的硬盘上未加密。所以我希望,在我的程序每次启动时,都会要求用户输入密码来解密数据库。当然,数据库永远不应该在我的硬盘上以“清晰”(未加密)的形式出现。
那么是否有可能“动态”解密 SQLite 数据库并读写数据?这里最好的算法是什么(也许是 AES)?
当不可能(或非常慢)时,最好加密数据库中的每个字符串并在密码正确时解密字符串(以便用户可以打开数据库,但不知道所有条目可能意味着什么) ?

【问题讨论】:

    标签: c++ qt sqlite encryption qt4


    【解决方案1】:

    没有内置支持,据说您确实有选择。

    1) 您可以自己加密/解密所有字符串,但这需要大量工作,不透明,并且不允许您执行诸如在数据库中搜索之类的操作。

    2) SQLiteCryptSQLCipher 做你想做的事。

    您几乎可以完全透明地使用它们,并且据说与没有加密的情况相比,它们通常只有大约 5% 的开销。

    【讨论】:

    • 但是当我使用不同的 API 时,我不再拥有 Qt 和 SQLite 的“可用性”,对吧?
    • @Berschi:您可能必须在 Qt 中重建 sqlite 组件,但它们为此类需求提供了源代码。我认为尝试使用这些组件之一将是您最好的选择。
    • 您应该能够使用 sqllite 驱动程序并针对 SqlLitCrypt 或 SQLCipher 提供的 sqllite 进行编译。您可能会在连接字符串中嵌入一些密码工具,或者扩展驱动程序类并直接调用驱动程序以获得扩展功能
    【解决方案2】:

    我建议使用为您执行此操作的库,而不是构建您自己的加密。

    http://www.hwaci.com/sw/sqlite/see.html 要么 http://sqlite-crypt.com/documentation.htm

    使用您最喜欢的搜索引擎寻找一些替代品。

    【讨论】:

      【解决方案3】:

      我能想到的最好方法是使用FUSE - “用户空间中的文件系统” - 适用于 Linux、Mac OS X 和其他系统,或其他加密文件系统。这将使 SQLite 在磁盘上物理加密时将其视为未加密。通过使用权限,您可以确保人们无法访问未加密的文件系统。

      我不确定 SQLite 是否有办法覆盖低级读/写例程,这将允许您在没有文件系统游戏的情况下即时实施加密。至少我从来不需要那样做。如果它不在 SQLite 问题跟踪器中,您可能希望搜索此类功能请求并将其归档。

      【讨论】:

        【解决方案4】:

        另一个选项是 Botan 1.9.x (src/wrap/sqlite) 附带的 SQLite 加密编解码器。

        该选项使您能够在编译时自定义加密类型,包括密码和模式。

        披露:我将编解码器贡献给 Botan。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-06-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-22
          • 1970-01-01
          相关资源
          最近更新 更多