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. 生产实践建议

  1. 不要硬编码密码。

  2. 密码放在环境变量、密钥服务或安全配置中心。

  3. 将“数据库文件权限”与“密码保护”一起做,二者互补。

  4. 对高价值设备,配合全盘加密或目录加密。

7. 易错点

  • 用无密码方式打开已加密数据库:会抛 UnauthorizedAccessException

  • 误以为“设置密码 = 字段级加密”:TinyDb 当前是数据库访问保护,不是列级加密框架。

  • 在日志打印明文密码:严禁。

8. 总结

  • 最推荐的做法:new TinyDbEngine(path, new TinyDbOptions { Password = ... })

  • 密码生命周期管理可用 PasswordManager

  • 安全不是单点能力,密码保护要配合部署安全策略。