Encryption 具有加密/密码保护的SQLite
我正在学习使用SQLite,我很好奇这是否可能:Encryption 具有加密/密码保护的SQLite,encryption,sqlite,password-protection,Encryption,Sqlite,Password Protection,我正在学习使用SQLite,我很好奇这是否可能: 数据库文件的加密 密码保护打开数据库 另外,我知道有这个“SQLite加密扩展(SEE)”,但根据文档,“SEE是许可软件…”和“SEE的永久源代码许可的成本是2000美元。”您可以始终在客户端加密数据。请注意,并非所有数据都必须加密,因为它存在性能问题 SQLite具有内置的用于加密的钩子,这些钩子在正态分布中不使用,但我知道以下几个实现: -正式实施 —一个WXWIDGEST样式的C++包装器,它也实现SQLite加密。 -使用openSS
另外,我知道有这个“SQLite加密扩展(SEE)”,但根据文档,“SEE是许可软件…”和“SEE的永久源代码许可的成本是2000美元。”您可以始终在客户端加密数据。请注意,并非所有数据都必须加密,因为它存在性能问题 SQLite具有内置的用于加密的钩子,这些钩子在正态分布中不使用,但我知道以下几个实现:
- -正式实施
- —一个WXWIDGEST样式的C++包装器,它也实现SQLite加密。
- -使用openSSL的libcrypto实现
- -自定义实现,修改API
- -botansqlite3是SQLite3的加密编解码器,可以使用Botan中的任何算法进行加密
- -另一种加密实现,使用ChaCha20/Poly1305原语。注意,上面提到的wxSQLite可以将其用作加密提供程序
披露:我创建了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