强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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 服务器。