本文目录导读:

我来介绍几种在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()
注意事项
- 安全性:MD5已经被认为不够安全,不建议用于密码存储,建议使用SHA-256或bcrypt
- 编码问题:加密前需要将字符串转换为字节,指定编码格式
- 大小写敏感:MD5加密默认大小写敏感
- 盐值使用:为了增加安全性,建议使用盐值
输出示例
运行上述代码,你会看到类似这样的输出:
原始字符串: Hello, World!
MD5值: 65a8e27d8879283831b664bd8b7f0ad4
带盐值加密结果: a8f5f167f44f4964e6c998d13e1c6e5b$e99a18c428cb38d5f260853678922e03
批量加密结果:
hello: 5d41402abc4b2a76b9719d911017c592
world: 7d793037a0760186574b0282f2f435e7
希望这些案例能帮助你理解如何在Python中实现MD5加密!