Buku 书签管理完全指南 / 第 07 章:加密与安全
第 07 章:加密与安全
学习使用 AES-256 加密保护书签数据库,理解安全存储策略和最佳实践。
7.1 加密功能概述
Buku 内置数据库加密功能,使用 AES-256-OCB(Offset Codebook Mode)算法对整个 SQLite 数据库文件进行加密保护。
加密特性
┌────────────────────────────────────────────────────────────┐
│ Buku 加密特性 │
├────────────────────────────────────────────────────────────┤
│ │
│ 算法 AES-256-OCB │
│ 密钥派生 SHA-256 (密码 → 密钥) │
│ 加密范围 整个数据库文件 │
│ 加密方式 流式加密,透明解密 │
│ 密码存储 不存储,每次输入 │
│ 依赖库 cryptography (Python) │
│ │
│ 安全特性: │
│ ✅ 全盘加密 - 整个数据库文件被加密 │
│ ✅ 密码派生 - 使用 SHA-256 派生加密密钥 │
│ ✅ 无后门 - 没有密钥恢复机制 │
│ ✅ 本地操作 - 加密/解密完全在本地完成 │
│ │
└────────────────────────────────────────────────────────────┘
AES-256 简介
| 特性 | 说明 |
|---|
| 算法 | Advanced Encryption Standard |
| 密钥长度 | 256 位(32 字节) |
| 模式 | OCB (Offset Codebook Mode) |
| 安全级别 | 军事级/政府级 |
| 性能 | 硬件加速(AES-NI) |
| 标准 | NIST FIPS 197 |
7.2 安装加密依赖
# 安装 cryptography 库
pip3 install cryptography
# 验证安装
python3 -c "import cryptography; print(cryptography.__version__)"
# 输出示例: 41.0.5
# 如果使用 Buku 的 extras 安装
pip3 install buku[crypto]
加密依赖说明
# Buku 的加密功能依赖 cryptography 库
# 该库提供以下功能:
# - AES 对称加密
# - SHA-256 哈希
# - 密钥派生
# - 安全随机数生成
# 检查是否已安装
python3 -c "
try:
from cryptography.hazmat.primitives.ciphers.aead import AESOCB3
print('加密依赖已安装')
except ImportError:
print('需要安装: pip3 install cryptography')
"
7.3 加密数据库
设置加密密码
# 锁定数据库(设置密码)
buku --lock mypassword
# 输出示例:
# Database locked
# ⚠️ 密码安全建议
# - 使用强密码(至少 12 位,包含大小写字母、数字、特殊字符)
# - 不要使用与其他账号相同的密码
# - 记住密码,丢失后无法恢复
# 使用强密码
buku --lock "MyStr0ng!P@ssw0rd#2024"
加密后的数据库
# 加密前
ls -la ~/.local/share/buku/bookmarks.db
# -rw------- 1 user user 36864 May 10 10:00 bookmarks.db
file ~/.local/share/buku/bookmarks.db
# SQLite 3.x database
# 加密后
file ~/.local/share/buku/bookmarks.db
# data (加密后无法识别文件类型)
# 加密后的数据库无法直接用 SQLite 工具读取
sqlite3 ~/.local/share/buku/bookmarks.db ".tables"
# Error: file is not a database
解锁数据库
# 解锁数据库(解密)
buku --unlock mypassword
# 输出示例:
# Database unlocked
# 解锁后可以正常访问
buku -p
更改密码
# 更改加密密码
# Buku 没有直接的更改密码命令
# 需要先解锁,再用新密码重新锁定
# 步骤 1:解锁
buku --unlock oldpassword
# 步骤 2:用新密码锁定
buku --lock newpassword
# 密码已更改
7.4 加密工作流
日常使用工作流
# 典型的加密工作流
# 方案一:每次使用前解锁,使用后锁定
buku --unlock mypassword
buku -s python
buku -a https://example.com "标题" ,tag
buku --lock mypassword
# 方案二:使用环境变量保存密码(不推荐,安全性较低)
export BUKU_PASSWORD="mypassword"
buku --unlock "$BUKU_PASSWORD"
# ... 使用 buku ...
buku --lock "$BUKU_PASSWORD"
# 方案三:使用 Shell 函数封装
buku_safe() {
local password
read -s -p "输入 Buku 密码: " password
echo
buku --unlock "$password" 2>/dev/null
buku "$@"
buku --lock "$password" 2>/dev/null
}
# 使用
buku_safe -s python
buku_safe -p
自动化脚本中的加密
#!/bin/bash
# buku_encrypted.sh - 加密 Buku 操作封装
BUKU_PASS="${BUKU_PASS:-}"
unlock() {
if [ -z "$BUKU_PASS" ]; then
read -s -p "Buku 密码: " BUKU_PASS
echo
fi
buku --unlock "$BUKU_PASS" 2>/dev/null
}
lock() {
if [ -n "$BUKU_PASS" ]; then
buku --lock "$BUKU_PASS" 2>/dev/null
fi
}
# 设置 trap 确保脚本退出时锁定数据库
trap lock EXIT
# 使用
unlock
buku "$@"
7.5 密码管理策略
密码安全最佳实践
┌────────────────────────────────────────────────────────────┐
│ 密码管理安全建议 │
├────────────────────────────────────────────────────────────┤
│ │
│ ✅ 推荐做法 │
│ ├── 使用密码管理器生成和存储强密码 │
│ ├── 密码至少 16 位字符 │
│ ├── 包含大小写字母、数字、特殊字符 │
│ ├── 不与其他账号共用密码 │
│ └── 定期更换密码(每 6-12 个月) │
│ │
│ ❌ 避免做法 │
│ ├── 使用简单密码(如 123456、password) │
│ ├── 在脚本中硬编码密码 │
│ ├── 将密码存储在明文文件中 │
│ ├── 与他人共享密码 │
│ └── 在公共场合输入密码 │
│ │
└────────────────────────────────────────────────────────────┘
使用密码管理器
# 使用 pass (Password Store) 管理 Buku 密码
# 安装 pass
sudo apt install pass # Debian/Ubuntu
# 或
sudo pacman -S pass # Arch Linux
# 初始化 pass
pass init "Your GPG Key ID"
# 存储 Buku 密码
pass insert buku/database
# 输入密码
# 使用 pass 中的密码
buku --unlock $(pass buku/database)
# 封装函数
buku_pass() {
buku --unlock "$(pass buku/database)" 2>/dev/null
buku "$@"
buku --lock "$(pass buku/database)" 2>/dev/null
}
使用 GPG 加密密码
# 将密码存储在 GPG 加密文件中
echo "mypassword" | gpg -c > ~/.buku_password.gpg
# 使用时解密
buku --unlock $(gpg -d ~/.buku_password.gpg 2>/dev/null)
# 完整脚本
#!/bin/bash
PASSWORD=$(gpg -d ~/.buku_password.gpg 2>/dev/null)
trap "buku --lock '$PASSWORD'" EXIT
buku --unlock "$PASSWORD"
buku "$@"
7.6 安全存储
数据库文件权限
# 确保数据库文件权限正确
chmod 600 ~/.local/share/buku/bookmarks.db
# 仅所有者可读写
# 确保目录权限正确
chmod 700 ~/.local/share/buku/
# 仅所有者可访问
# 检查权限
ls -la ~/.local/share/buku/
# drwx------ 2 user user 4096 May 10 10:00 .
# -rw------- 1 user user 36864 May 10 10:00 bookmarks.db
备份加密注意事项
# 备份加密的数据库
cp ~/.local/share/buku/bookmarks.db ~/backups/bookmarks_encrypted.db
# ⚠️ 注意:备份的数据库仍然是加密的
# 恢复时需要密码才能访问
# 如果需要明文备份(不推荐,除非必要)
buku --unlock mypassword
cp ~/.local/share/buku/bookmarks.db ~/backups/bookmarks_plain.db
buku --lock mypassword
# 明文备份的安全措施:
# 1. 存储在加密分区
# 2. 使用后立即删除
# 3. 不通过网络传输
安全删除
# 安全删除敏感文件(覆写多次)
shred -vfz -n 3 ~/backups/bookmarks_plain.db
# 删除数据库(如果不再需要)
shred -vfz -n 3 ~/.local/share/buku/bookmarks.db
rm -f ~/.local/share/buku/bookmarks.db
# 注意:简单的 rm 删除不会覆写数据,可通过数据恢复工具找回
7.7 安全威胁模型
威胁分析
| 威胁 | 风险等级 | Buku 加密防护 | 额外建议 |
|---|
| 设备被盗 | 高 | ✅ 数据库加密 | 全盘加密 |
| 恶意软件 | 高 | 部分防护 | 杀毒软件 |
| 物理访问 | 高 | ✅ 数据库加密 | 锁屏保护 |
| 网络窃听 | 中 | 不适用(本地存储) | 不传输明文 |
| 备份泄露 | 中 | ✅ 加密备份 | 加密备份存储 |
| 密码泄露 | 高 | ❌ 无法防护 | 密码管理器 |
安全加固建议
# 1. 全盘加密(额外保护层)
# Linux: 使用 LUKS 加密分区
# macOS: 使用 FileVault
# Windows: 使用 BitLocker
# 2. 确保系统安全
sudo apt update && sudo apt upgrade # 保持系统更新
sudo apt install ufw # 启用防火墙
sudo ufw enable
# 3. 限制数据库访问
# 设置文件系统 ACL
setfacl -m u:root:rwx ~/.local/share/buku/
setfacl -m u:youruser:rwx ~/.local/share/buku/
# 4. 监控数据库访问
# 使用 auditd 监控文件访问
sudo auditctl -w ~/.local/share/buku/bookmarks.db -p rwxa -k buku_access
7.8 加密限制与注意事项
已知限制
┌────────────────────────────────────────────────────────────┐
│ 加密功能限制 │
├────────────────────────────────────────────────────────────┤
│ │
│ ⚠️ 密码丢失无法恢复 │
│ - Buku 不存储密码 │
│ - 没有密钥恢复机制 │
│ - 必须记住密码或使用密码管理器 │
│ │
│ ⚠️ 加密影响性能 │
│ - 每次操作需要解密 │
│ - 大数据库首次解密可能较慢 │
│ - 建议:小数据库 (<10,000 条) 性能影响可忽略 │
│ │
│ ⚠️ Web 服务需要解锁 │
│ - bukuserver 需要先解锁数据库 │
│ - API 访问需要数据库处于解锁状态 │
│ │
│ ⚠️ 并发访问限制 │
│ - 加密数据库不支持多进程同时写入 │
│ - 建议:使用 Web 服务时避免同时使用 CLI │
│ │
└────────────────────────────────────────────────────────────┘
与未加密数据库的对比
| 特性 | 加密数据库 | 未加密数据库 |
|---|
| 文件可读性 | 不可读 | 可用 SQLite 工具读取 |
| 性能 | 略低(解密开销) | 正常 |
| 安全性 | 高(需要密码) | 低(文件权限保护) |
| 备份 | 加密备份 | 需要额外加密 |
| 多工具访问 | 需要 Buku 解锁 | 任何 SQLite 工具 |
| 数据恢复 | 密码丢失则无法恢复 | 可通过文件恢复 |
7.9 加密故障排查
常见问题
| 问题 | 原因 | 解决方案 |
|---|
No module named 'cryptography' | 未安装依赖 | pip3 install cryptography |
Failed to unlock | 密码错误 | 确认密码正确 |
Database is locked | 已锁定状态 | 先解锁再操作 |
Not a database | 加密后用 SQLite 工具打开 | 使用 Buku 解锁后访问 |
Permission denied | 文件权限问题 | chmod 600 bookmarks.db |
| 加密后数据库变大 | 加密元数据 | 正常现象 |
密码重置(无法恢复)
# ⚠️ 警告:如果忘记密码,数据将无法恢复
# 如果没有重要数据,可以重建数据库
rm ~/.local/share/buku/bookmarks.db
buku -p # 自动创建新数据库
# 如果有备份的明文数据
cp ~/backups/bookmarks_plain.db ~/.local/share/buku/bookmarks.db
buku --lock newpassword
7.10 安全检查清单
┌────────────────────────────────────────────────────────────┐
│ Buku 安全检查清单 │
├────────────────────────────────────────────────────────────┤
│ │
│ □ 数据库已使用 AES-256 加密 │
│ □ 使用强密码(16+ 字符,混合字符集) │
│ □ 密码存储在密码管理器中 │
│ □ 数据库文件权限设置为 600 │
│ □ 备份已加密存储 │
│ □ 系统已启用全盘加密 │
│ □ 系统和软件保持最新版本 │
│ □ 不在脚本中硬编码密码 │
│ □ 定期更换密码 │
│ □ 有密码恢复计划(密码管理器备份) │
│ │
└────────────────────────────────────────────────────────────┘
7.11 本章小结
| 要点 | 说明 |
|---|
| 加密算法 | AES-256-OCB |
| 依赖 | pip3 install cryptography |
| 锁定 | buku --lock password |
| 解锁 | buku --unlock password |
| 密码安全 | 使用强密码,密码管理器存储 |
| 文件权限 | chmod 600 bookmarks.db |
| 限制 | 密码丢失无法恢复 |
扩展阅读
下一章:第 08 章:Web 服务器 — 学习启动和配置 Buku 内置的 Web 服务器。