TinyDb 的安全模型是“数据库级密码保护”:通过数据库头部安全元数据保存盐值与派生密钥信息,访问时验证密码。
1. 创建受保护数据库(推荐)
最直接的方式:TinyDbOptions.Password。
using TinyDb.Core;
var options = new TinyDbOptions
{
Password = "MySecurePassword123!",
DatabaseName = "SecureDb"
};
using var db = new TinyDbEngine("secure.db", options);
var users = db.GetCollection<User>();
users.Insert(new User { Name = "admin", Email = "admin@demo.com", Age = 30 });2. 正确/错误密码访问对比
// 正确密码
using (var ok = new TinyDbEngine("secure.db", new TinyDbOptions { Password = "MySecurePassword123!" }))
{
Console.WriteLine($"访问成功,集合数: {ok.CollectionCount}");
}
// 错误密码
try
{
using var fail = new TinyDbEngine("secure.db", new TinyDbOptions { Password = "WrongPassword" });
}
catch (UnauthorizedAccessException)
{
Console.WriteLine("密码错误,被拒绝访问");
}3. 使用 PasswordManager 管理密码
using TinyDb.Security;
// 验证密码
bool verified = PasswordManager.VerifyPassword("secure.db", "MySecurePassword123!");
// 修改密码
bool changed = PasswordManager.ChangePassword(
"secure.db",
oldPassword: "MySecurePassword123!",
newPassword: "MyNewPassword456!");
// 检查是否受保护
bool protectedFlag = PasswordManager.IsPasswordProtected("secure.db");
// 移除密码
bool removed = PasswordManager.RemovePassword("secure.db", "MyNewPassword456!");4. SecureTinyDbEngine 包装器
如果你希望通过包装器统一认证入口,也可以使用 SecureTinyDbEngine:
using TinyDb.Security;
using var secure = new SecureTinyDbEngine("secure.db", "MySecurePassword123!");
var users = secure.GetCollection<User>();
Console.WriteLine($"认证状态: {secure.IsAuthenticated}, 用户数: {users.Count()}");5. 密码策略建议
5.1 最低要求
长度至少 12。
含大小写 + 数字 + 特殊字符。
5.2 可用工具
using TinyDb.Security;
var randomStrong = PasswordManager.GenerateStrongPassword(length: 16, includeSpecialChars: true);
var strength = PasswordManager.CheckPasswordStrength(randomStrong);
Console.WriteLine($"生成密码强度: {strength}");6. 生产实践建议
不要硬编码密码。
密码放在环境变量、密钥服务或安全配置中心。
将“数据库文件权限”与“密码保护”一起做,二者互补。
对高价值设备,配合全盘加密或目录加密。
7. 易错点
用无密码方式打开已加密数据库:会抛
UnauthorizedAccessException。误以为“设置密码 = 字段级加密”:TinyDb 当前是数据库访问保护,不是列级加密框架。
在日志打印明文密码:严禁。
8. 总结
最推荐的做法:
new TinyDbEngine(path, new TinyDbOptions { Password = ... })。密码生命周期管理可用
PasswordManager。安全不是单点能力,密码保护要配合部署安全策略。
发表评论