Python案例怎么实现MD5加密?

wen python案例 12

本文目录导读:

Python案例怎么实现MD5加密?

  1. 方法1:使用hashlib库(推荐)
  2. 方法2:处理大文件的MD5加密
  3. 方法3:带盐值的MD5加密
  4. 方法4:批量MD5加密
  5. 方法5:比较两个字符串的MD5
  6. 完整示例:用户密码管理系统
  7. 注意事项
  8. 输出示例

我来介绍几种在Python中实现MD5加密的方法。

方法1:使用hashlib库(推荐)

import hashlib
# 基本用法
def md5_basic(text):
    """MD5基本加密"""
    md5 = hashlib.md5()
    md5.update(text.encode('utf-8'))
    return md5.hexdigest()
# 一行代码实现
def md5_simple(text):
    """一行代码实现MD5"""
    return hashlib.md5(text.encode('utf-8')).hexdigest()
# 测试
text = "Hello, World!"
print(f"原始字符串: {text}")
print(f"MD5值: {md5_basic(text)}")
print(f"MD5值(一行): {md5_simple(text)}")

方法2:处理大文件的MD5加密

import hashlib
def md5_file(filename, chunk_size=8192):
    """计算文件的MD5值,适用于大文件"""
    md5 = hashlib.md5()
    try:
        with open(filename, 'rb') as f:
            while True:
                chunk = f.read(chunk_size)
                if not chunk:
                    break
                md5.update(chunk)
        return md5.hexdigest()
    except FileNotFoundError:
        return f"文件 {filename} 不存在"
    except Exception as e:
        return f"读取文件出错: {e}"
# 测试使用
# file_md5 = md5_file('example.txt')
# print(f"文件MD5: {file_md5}")

方法3:带盐值的MD5加密

import hashlib
import os
def md5_with_salt(password, salt=None):
    """
    带盐值的MD5加密
    salt: 盐值,如果不提供则自动生成
    """
    if salt is None:
        salt = os.urandom(16).hex()  # 生成随机盐值
    # 密码 + 盐值 混合后加密
    hash_obj = hashlib.md5()
    hash_obj.update((password + salt).encode('utf-8'))
    hashed = hash_obj.hexdigest()
    return f"{salt}${hashed}"
def verify_md5_with_salt(password, stored_hash):
    """验证带盐值的MD5"""
    try:
        salt, hashed = stored_hash.split('$')
        return md5_with_salt(password, salt) == stored_hash
    except ValueError:
        return False
# 测试
password = "my_password123"
stored = md5_with_salt(password)
print(f"原始密码: {password}")
print(f"加密结果: {stored}")
# 验证
is_valid = verify_md5_with_salt("my_password123", stored)
print(f"密码验证: {is_valid}")
is_valid = verify_md5_with_salt("wrong_password", stored)
print(f"错误密码验证: {is_valid}")

方法4:批量MD5加密

import hashlib
import json
class MD5Encryptor:
    """MD5加密工具类"""
    @staticmethod
    def encrypt(text):
        """单字符串加密"""
        return hashlib.md5(text.encode('utf-8')).hexdigest()
    @staticmethod
    def encrypt_batch(text_list):
        """批量加密"""
        results = {}
        for text in text_list:
            results[text] = hashlib.md5(text.encode('utf-8')).hexdigest()
        return results
    @staticmethod
    def encrypt_dict(data_dict):
        """加密字典中的所有字符串值"""
        encrypted = {}
        for key, value in data_dict.items():
            if isinstance(value, str):
                encrypted[key] = hashlib.md5(value.encode('utf-8')).hexdigest()
            else:
                encrypted[key] = value
        return encrypted
# 使用示例
encryptor = MD5Encryptor()
# 批量加密
texts = ["hello", "world", "python", "md5"]
results = encryptor.encrypt_batch(texts)
print("批量加密结果:")
for text, md5_value in results.items():
    print(f"  {text}: {md5_value}")
# 字典加密
user_data = {
    "username": "admin",
    "password": "123456",
    "age": 25,
    "email": "admin@example.com"
}
encrypted_data = encryptor.encrypt_dict(user_data)
print("\n字典加密结果:")
print(json.dumps(encrypted_data, indent=2))

方法5:比较两个字符串的MD5

import hashlib
def compare_md5(text1, text2):
    """比较两个字符串的MD5值是否相同"""
    md5_1 = hashlib.md5(text1.encode('utf-8')).hexdigest()
    md5_2 = hashlib.md5(text2.encode('utf-8')).hexdigest()
    print(f"'{text1}'的MD5: {md5_1}")
    print(f"'{text2}'的MD5: {md5_2}")
    if md5_1 == md5_2:
        print("两个字符串的MD5值相同")
        return True
    else:
        print("两个字符串的MD5值不同")
        return False
# 测试
compare_md5("Hello", "Hello")    # 相同
print("---")
compare_md5("Hello", "hello")    # 不同(大小写敏感)

完整示例:用户密码管理系统

import hashlib
import os
class UserPasswordManager:
    """用户密码管理系统"""
    def __init__(self):
        self.users = {}  # 存储用户名和加密密码
    def register(self, username, password):
        """用户注册"""
        if username in self.users:
            return False, "用户名已存在"
        # 生成盐值
        salt = os.urandom(16).hex()
        # 创建MD5对象并加密
        md5 = hashlib.md5()
        md5.update((password + salt).encode('utf-8'))
        hashed_password = md5.hexdigest()
        # 存储用户信息
        self.users[username] = {
            'salt': salt,
            'password': hashed_password
        }
        return True, "注册成功"
    def login(self, username, password):
        """用户登录验证"""
        if username not in self.users:
            return False, "用户名不存在"
        user = self.users[username]
        # 使用相同的盐值加密密码
        md5 = hashlib.md5()
        md5.update((password + user['salt']).encode('utf-8'))
        hashed_password = md5.hexdigest()
        # 验证密码
        if hashed_password == user['password']:
            return True, f"{username}登录成功"
        else:
            return False, "密码错误"
    def list_users(self):
        """列出所有用户"""
        return list(self.users.keys())
# 使用示例
def demo():
    manager = UserPasswordManager()
    # 注册用户
    print("=== 用户注册 ===")
    result, msg = manager.register("alice", "password123")
    print(f"注册alice: {msg}")
    result, msg = manager.register("bob", "secure_pass")
    print(f"注册bob: {msg}")
    # 尝试注册重复用户名
    result, msg = manager.register("alice", "new_password")
    print(f"重复注册alice: {msg}")
    print(f"\n当前用户: {manager.list_users()}")
    # 登录测试
    print("\n=== 用户登录 ===")
    result, msg = manager.login("alice", "password123")
    print(f"alice正确密码登录: {msg}")
    result, msg = manager.login("alice", "wrong_password")
    print(f"alice错误密码登录: {msg}")
    result, msg = manager.login("charlie", "password123")
    print(f"不存在的用户登录: {msg}")
if __name__ == "__main__":
    demo()

注意事项

  1. 安全性:MD5已经被认为不够安全,不建议用于密码存储,建议使用SHA-256或bcrypt
  2. 编码问题:加密前需要将字符串转换为字节,指定编码格式
  3. 大小写敏感:MD5加密默认大小写敏感
  4. 盐值使用:为了增加安全性,建议使用盐值

输出示例

运行上述代码,你会看到类似这样的输出:

原始字符串: Hello, World!
MD5值: 65a8e27d8879283831b664bd8b7f0ad4
带盐值加密结果: a8f5f167f44f4964e6c998d13e1c6e5b$e99a18c428cb38d5f260853678922e03
批量加密结果:
  hello: 5d41402abc4b2a76b9719d911017c592
  world: 7d793037a0760186574b0282f2f435e7

希望这些案例能帮助你理解如何在Python中实现MD5加密!

抱歉,评论功能暂时关闭!