如何在C# WinForm中使用SQLCipher加密SQLite数据库
在C# WinForm中用SQLCipher加密SQLite数据库实现步骤
1. 初始化加密数据库
如果是新建数据库,创建连接后立即设置密码,数据库会自动完成加密:
using SQLite; using System.IO; using System.Windows.Forms; // 数据库路径,可根据程序目录调整 string dbPath = Path.Combine(Application.StartupPath, "login_credentials.db"); var dbConn = new SQLiteConnection(dbPath); // 设置加密密码,替换为你的高强度密码 dbConn.Execute("PRAGMA key = 'YourStrongPassword123!';"); // 创建存储账号密码的表(需提前定义实体类) dbConn.CreateTable<LoginRecord>();
对应的实体类示例:
public class LoginRecord { [PrimaryKey, AutoIncrement] public int Id { get; set; } public string Username { get; set; } // 建议对密码做哈希加盐存储,双重保障安全 public string HashedPassword { get; set; } }
2. 连接已加密数据库
每次访问加密数据库都必须先验证密码,否则无法读取或写入数据:
var dbConn = new SQLiteConnection(dbPath); // 先执行密码验证 dbConn.Execute("PRAGMA key = 'YourStrongPassword123!';"); // 执行常规数据操作 // 查询所有记录 var allRecords = dbConn.Table<LoginRecord>().ToList(); // 插入新记录示例 dbConn.Insert(new LoginRecord { Username = "test_user", HashedPassword = "your_hashed_password" });
3. 加密现有未加密数据库
如果之前已有未加密的SQLite数据库,可通过以下步骤转换为加密版本:
string originalDb = "old_unencrypted.db"; string encryptedDb = "new_encrypted.db"; string password = "YourStrongPassword123!"; var originalConn = new SQLiteConnection(originalDb); // 附加新数据库并设置加密密码 originalConn.Execute($"ATTACH DATABASE '{encryptedDb}' AS encrypted KEY '{password}';"); // 将原数据库数据导出到加密数据库 originalConn.Execute("SELECT sqlcipher_export('encrypted');"); // 分离加密数据库 originalConn.Execute("DETACH DATABASE encrypted;"); originalConn.Close(); // 之后替换程序中的数据库路径为新加密数据库路径即可
关键注意事项
- 禁止硬编码密码:绝对不能把密码直接写在代码里,可让用户设置主密码,或从Windows凭据管理器等安全存储中读取密钥
- 密码双重保护:即使数据库加密,存储的密码也要做哈希加盐处理(比如使用BCrypt库),避免数据库泄露后明文密码直接暴露
- 版本兼容:确保你添加的
SQLite.cs文件与sqlite-net-sqlcipherNuGet包版本匹配,避免API冲突
内容的提问来源于stack exchange,提问作者JRMY
相关产品推荐
相关产品推荐

