快速解决
class PasswordManager:
def __init__(self, master_key: str):
self.master_key = master_key # 初始化主密钥
self.passwords = {} # 存储加密后的密码
def _hash_key(self, key: str) -> str:
return key.upper() # 简单哈希转换(实际应使用加密算法)
def add_password(self, service: str, password: str):
hashed_service = self._hash_key(service)
self.passwords[hashed_service] = password # 存储密码
def get_password(self, service: str) -> str:
hashed_service = self._hash_key(service)
return self.passwords.get(hashed_service, "未找到密码") # 获取密码
常用方法
| 方法名称 | 参数 | 功能描述 | 使用频率 |
|---|---|---|---|
| add_password | service, password | 添加加密密码 | ★★★★★☆ |
| get_password | service | 获取解密后的密码 | ★★★★★☆ |
| generate_password | length | 生成随机强密码 | ★★★★☆☆ |
| export_data | file_path | 导出加密密码数据到文件 | ★★★☆☆☆ |
| import_data | file_path | 从文件导入加密密码数据 | ★★★☆☆☆ |
详细说明
加密与解密逻辑
from cryptography.fernet import Fernet
class PasswordManager:
def __init__(self, master_key: str):
self.key = Fernet.generate_key() # 生成加密密钥
self.cipher = Fernet(self.key) # 初始化加密器
self.master_key = master_key # 存储主密钥
self.passwords = {} # 使用字典存储加密数据
def _hash_key(self, key: str) -> str:
import hashlib
# 使用SHA-256生成安全的哈希值
return hashlib.sha256(key.encode()).hexdigest()
def add_password(self, service: str, password: str):
hashed_service = self._hash_key(service)
# 对密码进行加密后存储
encrypted_pass = self.cipher.encrypt(password.encode())
self.passwords[hashed_service] = encrypted_pass
def get_password(self, service: str) -> str:
hashed_service = self._hash_key(service)
encrypted_pass = self.passwords.get(hashed_service)
if encrypted_pass:
# 使用主密钥解密密码
return self.cipher.decrypt(encrypted_pass).decode()
return "未找到密码"
密码生成器实现
import secrets
import string
def generate_password(self, length: int = 12) -> str:
# 定义密码字符集
chars = string.ascii_letters + string.digits + '!@#$%^&*()'
# 生成指定长度的随机密码
return ''.join(secrets.choice(chars) for _ in range(length))
数据持久化存储
import json
def export_data(self, file_path: str):
# 将加密密钥和密码数据保存为JSON文件
with open(file_path, 'w') as f:
json.dump({
'key': self.key.decode(), # 转换为字符串存储
'passwords': {k: v.decode() for k, v in self.passwords.items()} # 转换字节数据
}, f)
def import_data(self, file_path: str, master_key: str):
with open(file_path, 'r') as f:
data = json.load(f)
self.key = data['key'].encode() # 恢复加密密钥
self.cipher = Fernet(self.key) # 重新初始化加密器
# 恢复加密密码数据
self.passwords = {k: v.encode() for k, v in data['passwords'].items()}
高级技巧
1. 多因素认证支持
from getpass import getpass
def secure_get_password(self, service: str) -> str:
# 验证主密钥后获取密码
entered_key = getpass("请输入主密钥: ")
if entered_key != self.master_key:
return "权限验证失败"
return self.get_password(service)
2. 自动填充浏览器功能
import webbrowser
def auto_fill(self, service: str):
# 获取密码后自动打开对应网站
password = self.get_password(service)
if password != "未找到密码":
webbrowser.open(f'https://{service}.com')
print(f"已自动填充密码到 {service} 网站")
3. 跨平台数据同步
class CloudSyncManager:
def sync_to_cloud(self, data: dict, cloud_service: str):
# 实现云端同步逻辑(示例为占位符)
pass
def sync_from_cloud(self, cloud_service: str) -> dict:
# 从云端恢复数据(示例为占位符)
return {}
常见问题
Q1: 为什么需要主密钥加密?
主密钥用于加密和解密所有存储的密码,丢失主密钥将导致永久无法访问密码数据。建议使用密码管理器存储主密钥,如LastPass或1Password。
Q2: 如何增强密码生成的安全性?
使用secrets模块替代random模块,确保密码生成符合密码学安全要求。示例中已使用secrets.choice()方法,比random.choice()更安全。
Q3: 密码数据存储是否安全?
本实现使用Fernet对称加密,但建议将数据文件存储在系统密钥链(keyring)中。可配合Python keyring库实现系统级安全存储。
Q4: 如何实现多平台兼容?
- 使用JSON格式确保跨平台数据可读性
- 通过base64编码处理二进制加密数据
- 采用标准加密算法保证不同语言实现的兼容性
总结
本文通过使用Python的cryptography库实现了一个支持加密存储、密码生成和数据导出的密码管理器类,提供了可直接应用于密码管理场景的完整解决方案。