Encryption 具有加密/密码保护的SQLite

Encryption 具有加密/密码保护的SQLite,encryption,sqlite,password-protection,Encryption,Sqlite,Password Protection,我正在学习使用SQLite,我很好奇这是否可能: 数据库文件的加密 密码保护打开数据库 另外,我知道有这个“SQLite加密扩展(SEE)”,但根据文档,“SEE是许可软件…”和“SEE的永久源代码许可的成本是2000美元。”您可以始终在客户端加密数据。请注意,并非所有数据都必须加密,因为它存在性能问题 SQLite具有内置的用于加密的钩子,这些钩子在正态分布中不使用,但我知道以下几个实现: -正式实施 —一个WXWIDGEST样式的C++包装器,它也实现SQLite加密。 -使用openSS

我正在学习使用SQLite,我很好奇这是否可能:

  • 数据库文件的加密

  • 密码保护打开数据库


  • 另外,我知道有这个“SQLite加密扩展(SEE)”,但根据文档,“SEE是许可软件…”和“SEE的永久源代码许可的成本是2000美元。”

    您可以始终在客户端加密数据。请注意,并非所有数据都必须加密,因为它存在性能问题

    SQLite具有内置的用于加密的钩子,这些钩子在正态分布中不使用,但我知道以下几个实现:

    • -正式实施
    • —一个WXWIDGEST样式的C++包装器,它也实现SQLite加密。
    • -使用openSSL的libcrypto实现
    • -自定义实现,修改API
    • -botansqlite3是SQLite3的加密编解码器,可以使用Botan中的任何算法进行加密
    • -另一种加密实现,使用ChaCha20/Poly1305原语。注意,上面提到的wxSQLite可以将其用作加密提供程序
    SEE和SQLiteCrypt需要购买许可证


    披露:我创建了SQLite3。

    该.net库还提供了加密功能

    您可以使用密码保护SQLite3 DB。 在执行任何操作之前,请按如下所示设置密码

    SQLiteConnection conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;");
    conn.SetPassword("password");
    conn.open();
    
    然后下次你可以像这样访问它

    conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;Password=password;");
    conn.Open();
    
    这不允许任何GUI编辑器查看您的数据。 稍后,如果您希望更改密码,请使用
    conn.ChangePassword(“新密码”)
    
    要重置或删除密码,请使用
    conn.ChangePassword(String.Empty)

    您可以从获取具有加密支持的
    sqlite3.dll
    文件

    1-转到并下载其中一个软件包。NET版本与此无关

    2-从包中提取
    SQLite.Interop.dll
    ,并将其重命名为
    sqlite3.dll
    。此DLL支持通过明文密码或加密密钥进行加密

    提到的文件是本机文件,不需要.NET framework。它可能需要VisualC++运行时,这取决于所下载的包。p> 更新


    这是我下载的用于32位开发的软件包:

    请记住,以下内容并不能替代适当的安全解决方案

    在玩了四天之后,我只使用NuGet的开源System.Data.SQLite包编写了一个解决方案。我不知道这能提供多少保护。我只是把它用在我自己的课程上。这将创建数据库、加密数据库、创建表并添加数据

    using System.Data.SQLite;
    
    namespace EncryptDB
    {
        class Program
        {
            static void Main(string[] args)
            {
                string connectionString = @"C:\Programming\sqlite3\db.db";
                string passwordString = "password";
                byte[] passwordBytes = GetBytes(passwordString);
                SQLiteConnection.CreateFile(connectionString);
                SQLiteConnection conn = new SQLiteConnection("Data Source=" + connectionString + ";Version=3;");
                conn.SetPassword(passwordBytes);
                conn.Open();
                SQLiteCommand sqlCmd = new SQLiteCommand("CREATE TABLE data(filename TEXT, filepath TEXT, filelength INTEGER, directory TEXT)", conn);
                sqlCmd.ExecuteNonQuery();
                sqlCmd = new SQLiteCommand("INSERT INTO data VALUES('name', 'path', 200, 'dir')", conn);
                sqlCmd.ExecuteNonQuery();
                conn.Close();
            }
            static byte[] GetBytes(string str)
            {
                byte[] bytes = new byte[str.Length * sizeof(char)];
                bytes = System.Text.Encoding.Default.GetBytes(str);
                return bytes;
            }
        }
    }
    
    或者,您可以删除
    conn.SetPassword(passwordBytes),并将其替换为
    conn.ChangePassword(“密码”)需要放在
    连接打开()之后而不是之前。那么就不需要GetBytes方法了

    要解密,只需在调用open之前将密码放入连接字符串中

            string filename = @"C:\Programming\sqlite3\db.db";
            string passwordString = "password";
            SQLiteConnection conn = new SQLiteConnection("Data Source=" + filename + ";Version=3;Password=" + passwordString + ";");
            conn.Open();
    

    您可以使用SQLite的函数创建例程():

    插入数据时,可以直接使用加密功能插入加密数据,也可以使用自定义功能传递未加密数据:

    $insert_obj = $db_obj->prepare('INSERT INTO table (Clear, Encrypted) ' .
     'VALUES (:clear, Encrypt(:data, "' . $passwordhash_str . '"))');
    检索数据时,还可以使用SQL搜索功能:

    $select_obj = $db_obj->prepare('SELECT Clear, ' .
     'Decrypt(Encrypted, "' . $passwordhash_str . '") AS PlainText FROM table ' .
     'WHERE PlainText LIKE :searchterm');

    嗯,
    SEE
    很贵。但是,
    SQLite
    内置了加密接口(寻呼机)。这意味着,在现有代码的基础上,可以轻松开发一些加密机制,而不必是
    AES
    。什么都可以。 请看我的帖子:

    您需要定义SQLITE_HAS_CODEC=1以启用寻呼机加密。下面的示例代码(原始
    SQLite
    source):

    对于使用AES256的
    SQLite
    加密,有一个商业版的
    C语言
    ——它也可以与
    PHP
    一起工作,但需要使用
    PHP
    SQLite
    扩展来编译。它动态地对数据库文件进行反加密,文件内容总是加密的。非常有用


    我也有类似的问题。需要在简单数据库中存储敏感数据(除了安全性之外,SQLite是最佳选择)。最后,我将数据库文件放在TrueCrypt加密的valume上

    其他控制台应用程序使用TrueCrypt CLI装载临时驱动器,然后启动数据库应用程序。等待数据库应用程序退出,然后再次卸载驱动器


    可能不是所有情况下都适用的解决方案,但对我来说效果很好…

    您有关于如何使用Botan进行SQLite数据库加密的文档吗?Botan网站没有提到这一功能。BotanaSqlite3现在独立于Botan发行。还有。它使用ChaCha密码,比基于ARMv7SQLite3.Net的便携式设备上的AES更快,因为它现在内置了对加密的支持,这在很大程度上使这个答案无效。嗨,我用System.Data.Sqlite c#创建了一个文件,它有密码,我想在php中使用它。你知道怎么做吗?谢谢你SQL Server!=已安装SQL Server实例,但不是来自Microsoft。这个问题不是关于.Net的,但若它是关于.Net的,那个么其他兼容性和不兼容性将是重要的。它不会和开源Sqlite一起工作。不知道这应该是什么语言实现、语言或API。我如何知道使用了哪种加密方式
    ChangePassword
    ?AES 128?RSA..?RSA 1024还是2048?是否有任何文档可以看到更多细节?在我自己的测试中,从这里获取文档,我发现
    SetPassword
    方法(此时)基本上没有用处。我能够获得
    System.Data.SQLite
    库以正确应用密码的唯一方法是使用$select_obj = $db_obj->prepare('SELECT Clear, ' . 'Decrypt(Encrypted, "' . $passwordhash_str . '") AS PlainText FROM table ' . 'WHERE PlainText LIKE :searchterm');
    #ifdef SQLITE_HAS_CODEC
    /*
    ** This function is called by the wal module when writing page content
    ** into the log file.
    **
    ** This function returns a pointer to a buffer containing the encrypted
    ** page content. If a malloc fails, this function may return NULL.
    */
    SQLITE_PRIVATE void *sqlite3PagerCodec(PgHdr *pPg){
      void *aData = 0;
      CODEC2(pPg->pPager, pPg->pData, pPg->pgno, 6, return 0, aData);
      return aData;
    }
    #endif