使用 Python 实现一个密码管理器类(建议收藏)

快速解决

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: 如何实现多平台兼容?

  1. 使用JSON格式确保跨平台数据可读性
  2. 通过base64编码处理二进制加密数据
  3. 采用标准加密算法保证不同语言实现的兼容性

总结

本文通过使用Python的cryptography库实现了一个支持加密存储、密码生成和数据导出的密码管理器类,提供了可直接应用于密码管理场景的完整解决方案。