一、代码
from cryptography.fernet import Fernet
import os
import bcrypt# 密钥管理和对称加密相关
def save_key_to_file(key: bytes, key_path: str):with open(key_path, 'wb') as file:file.write(key)def load_key_from_file(key_path: str) -> bytes:if not os.path.exists(key_path):raise FileNotFoundError(f"密钥文件 {key_path} 不存在")with open(key_path, 'rb') as file:return file.read()def encrypt_data(data: str, key: bytes) -> bytes:fernet = Fernet(key)encrypted_data = fernet.encrypt(data.encode())return encrypted_datadef decrypt_data(encrypted_data: bytes, key: bytes) -> str:fernet = Fernet(key)decrypted_data = fernet.decrypt(encrypted_data).decode()return decrypted_data# 密码哈希相关
def hash_password(password: str) -> str:salt = bcrypt.gensalt()hashed_password = bcrypt.hashpw(password.encode(), salt)return hashed_password.decode('utf-8')def verify_password(password: str, stored_hash: str) -> bool:return bcrypt.checkpw(password.encode(), stored_hash.encode())# 示例数据处理
def main():# 对称加密部分sensitive_data = "mysecretpassword"key_path = 'secret_key.key'# 生成并保存密钥key = Fernet.generate_key()save_key_to_file(key, key_path)# 加载已保存的密钥loaded_key = load_key_from_file(key_path)encrypted_data = encrypt_data(sensitive_data, loaded_key)print("Encrypted data:", encrypted_data)decrypted_data = decrypt_data(encrypted_data, loaded_key)print("Decrypted data:", decrypted_data)# 密码哈希部分password = "mysecretpassword"hashed_password = hash_password(password)print("Hashed password:", hashed_password)is_valid = verify_password(password, hashed_password)print("Password verification:", is_valid)if __name__ == "__main__":main()
二、运行结果:
三、报错解决
出现 ModuleNotFoundError: No module named ‘bcrypt’ 错误是因为Python环境尚未安装名为bcrypt的库,该库用于密码哈希。要解决这个问题,你需要在你的Python环境中安装bcrypt库。在终端(对于Linux/Mac用户)或命令提示符(对于Windows用户)中执行以下命令:
Shell
pip install bcrypt
如果你使用的是虚拟环境(如venv或conda环境),请确保激活对应的虚拟环境后再运行上述命令。
对于某些系统,可能需要通过特定包管理器或者使用特定的Python版本的pip来安装bcrypt,例如在Ubuntu上可能需要先安装libffi-dev和python3-dev等依赖,然后使用pip3来安装bcrypt:
Shell
sudo apt-get install libffi-dev python3-dev
pip3 install bcrypt
安装完成后,再尝试运行你的Python脚本,bcrypt模块就应该可以正常导入和使用了。