《密码管理:从设备到云端》
第3章 设备端密码管理器搭建(一)
3. 设备端密码管理器搭建(一):环境准备
在开始搭建本地密码管理器之前,我们需要准备好开发环境。本节将引导您完成 Python 环境配置、cryptography 库安装,并创建第一个 本地密码数据库。这是整个密码管理系统的基石,确保后续所有加密操作安全可靠。
3.1 安装 Python 与配置虚拟环境
推荐使用 Python 3.9 及以上版本,以支持最新的类型注解和安全性特性。请从 python.org 下载对应操作系统的安装包。
创建并激活虚拟环境(推荐):
# 创建虚拟环境 python3 -m venv password_manager_env # 激活虚拟环境 (Windows) password_manager_env\Scripts\activate # 激活虚拟环境 (macOS/Linux) source password_manager_env/bin/activate # 确认环境已激活 (终端会显示环境名称)
3.2 安装 cryptography 加密库
cryptography 是 Python 生态中最成熟的加密库之一,提供 Fernet 对称加密、公钥加密、哈希函数等。安装命令如下:
# 确保虚拟环境已激活,然后执行
pip install cryptography
# 验证安装
python -c "from cryptography.fernet import Fernet; print('cryptography 安装成功!')"
安装完成后,您将获得以下核心模块:
- cryptography.fernet — 对称加密,适合加密密码数据库文件
- cryptography.hazmat.primitives — 底层加密原语(AES、RSA、哈希等)
- cryptography.hazmat.backends — 加密后端(OpenSSL 等)
3.3 创建本地密码数据库(SQLite + 加密)
我们将使用 SQLite 作为本地数据库引擎,配合 cryptography 对敏感字段进行加密。以下是创建数据库的完整代码:
import sqlite3
import os
from cryptography.fernet import Fernet
# 1. 生成或加载加密密钥
KEY_FILE = "master.key"
if not os.path.exists(KEY_FILE):
key = Fernet.generate_key()
with open(KEY_FILE, "wb") as f:
f.write(key)
print("✅ 新密钥已生成并保存到 master.key")
else:
with open(KEY_FILE, "rb") as f:
key = f.read()
print("🔑 已加载现有密钥")
cipher = Fernet(key)
# 2. 创建 SQLite 数据库
DB_FILE = "password_vault.db"
conn = sqlite3.connect(DB_FILE)
cursor = conn.cursor()
# 3. 创建密码条目表(加密存储密码字段)
cursor.execute("""
CREATE TABLE IF NOT EXISTS passwords (
id INTEGER PRIMARY KEY AUTOINCREMENT,
service TEXT NOT NULL, -- 服务名称(明文)
username TEXT NOT NULL, -- 用户名(明文)
encrypted_password BLOB NOT NULL, -- 加密后的密码
notes TEXT, -- 备注(明文)
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
""")
conn.commit()
conn.close()
print(f"📁 数据库 {DB_FILE} 创建成功!")
print("📋 表结构:passwords (id, service, username, encrypted_password, notes, created_at)")
3.4 验证数据库与加密功能
运行以下代码测试数据库写入和加密/解密流程:
import sqlite3
from cryptography.fernet import Fernet
# 加载密钥
with open("master.key", "rb") as f:
key = f.read()
cipher = Fernet(key)
# 连接数据库
conn = sqlite3.connect("password_vault.db")
cursor = conn.cursor()
# 插入一条测试数据
service = "GitHub"
username = "demo_user"
password = "MyS3cur3P@ss!"
encrypted_pwd = cipher.encrypt(password.encode())
cursor.execute("""
INSERT INTO passwords (service, username, encrypted_password, notes)
VALUES (?, ?, ?, ?)
""", (service, username, encrypted_pwd, "测试条目 - 请及时删除"))
conn.commit()
print("✅ 测试数据已插入")
# 读取并解密
cursor.execute("SELECT service, username, encrypted_password FROM passwords WHERE service=?", (service,))
row = cursor.fetchone()
if row:
decrypted_pwd = cipher.decrypt(row[2]).decode()
print(f"🔓 解密成功:{row[0]} / {row[1]} -> 密码: {decrypted_pwd}")
conn.close()
预期输出:
✅ 测试数据已插入 🔓 解密成功:GitHub / demo_user -> 密码: MyS3cur3P@ss!
⚠️ 安全提醒: 请务必将
master.key 文件存放在安全位置,切勿提交到版本控制系统(如 Git)。建议使用环境变量或硬件安全模块(HSM)管理主密钥。
至此,您的设备端密码管理器环境已准备就绪!下一节我们将实现密码的增删改查(CRUD)操作界面。