GitHub地址:
https://github.com/gao7025/md5_rsa_tool.git
简单来说
数据测试与分析需要经常将用户的敏感信息加密,将原有的明文信息经过加密算法转换成不可读的字符串,从而达到加密的目的,常用的加密算法有MD5、SHA256、RSA等。
- MD5、SHA256都是哈希算法,python中都来自hashlib包,主要是将一段字符串通过一定的加密算法转换成另一种字符串,因具有不可逆的特点,从而保证了数据的安全。
- RSA是一种非对称加密算法,对极大整数做因数分解的难度决定了 RSA 算法的可靠性,假如有人找到一种快速因数分解的算法的话,那么用 RSA 加密的信息的可靠性就肯定会极度下降,目前看来找到这样的算法的可能性非常小。
以下是对 MD5、SHA256 和 RSA 三种加密算法优缺点及适用场景的详细分析:
一、哈希算法(MD5 与 SHA256)
1. MD5
优点:
- 速度极快:计算效率高,适用于对性能要求极高的场景。
- 固定输出:生成 128 位(16 字节)哈希值,便于存储和比较。
缺点:
- 安全性低:已被证明存在碰撞攻击(可伪造相同哈希值),不适合用于安全认证。
- 不抗篡改:微小输入变化会导致哈希值完全不同,但无法防止逆向工程。
适用场景:
- 非安全场景:如文件校验(确认文件完整性)、数据索引(如数据库键值)。
- 历史遗留系统:仅用于兼容性需求,新系统应避免使用。
2. SHA256
优点:
- 安全性高:属于 SHA-2 家族,目前未被发现有效碰撞攻击,广泛用于安全领域。
- 输出长度适中:生成 256 位(32 字节)哈希值,平衡性好。
缺点:
- 性能较低:计算速度慢于 MD5,尤其在处理大量数据时。
- 仍需注意:SHA-2 家族存在理论上的弱点(如长度扩展攻击),但 SHA256 实际中仍安全。
适用场景:
- 密码存储:如用户密码哈希(需配合盐值)。
- 数字签名:如区块链(比特币使用 SHA256)、软件包校验。
- 数据完整性:确保数据未被篡改(如 TLS 证书)。
二、非对称加密(RSA)
优点:
- 安全性高:基于大数分解难题,目前无法被有效破解(密钥足够长时)。
- 无需共享密钥:公钥公开,私钥保密,适合分布式系统(如 HTTPS)。
- 可用于签名:私钥签名,公钥验证,确保数据来源可信。
缺点:
- 性能极慢:比对称加密(如 AES)慢 100-1000 倍,不适合大量数据加密。
- 密钥管理复杂:密钥长度需足够长(现代建议≥2048 位),否则易被破解。
- 密文膨胀:加密后数据长度通常大于原文。
适用场景:
- 密钥交换:如 TLS 握手阶段交换对称加密密钥。
- 数字签名:如代码签名、证书颁发(CA 认证)。
- 小数据加密:如加密对称密钥、身份验证令牌。
三、对比与组合使用
算法 类型 安全性 速度 典型场景
MD5 哈希 低 极快 文件校验、非安全索引
SHA256 哈希 高 较快 密码存储、数字签名、区块链
RSA 非对称加密 高 极慢 密钥交换、数字签名、小数据加密
组合使用示例:
- HTTPS:RSA 用于握手阶段交换 AES 密钥,SHA256 用于验证证书和数据完整性。
- 密码存储:用户密码 → SHA256 + 盐值 → 存储(防止彩虹表攻击)。
MD5加密算法的Python举例:
# -*- coding: utf-8 -*-
import hashlib
import csv
class Md5Func:
def __init__(self):
pass
@staticmethod
def to_md5(target):
m = hashlib.md5()
m.update(target.encode('utf-8'))
return m.hexdigest()
def transfer_func(self, csv_reader, csv_writer):
for row in csv_reader:
row_list = list(row)
if str(row[0]).find('name') > 0:
row_list.append('id_md5')
row_list.append('num_md5')
else:
row_list.append(self.to_md5(row[1]))
row_list.append(self.to_md5(row[2]))
csv_writer.writerow(row_list)
return csv_writer
def main(self, path_input, data):
data_out = open((path_input + '/{name}_md5.csv').format(name=data.split('.')[0]), 'w', encoding='utf8',
newline='')
csv_writer = csv.writer(data_out)
data_in = open((path_input + '/{dataset}').format(dataset=data), encoding='utf-8')
csv_reader = csv.reader(data_in)
self.transfer_func(csv_reader, csv_writer)
data_out.close()
data_in.close()
if __name__ == '__main__':
path_in = './'
Md5Func().main(path_in, 'abc.csv')
结果展示
RSA加密算法举例:
# -*- coding:utf-8 -*-
import os
import rsa
class RsaFunc:
def __init__(self):
pass
# 生成秘钥并保存
@staticmethod
def pub_privkey(n):
(pubkey, privkey) = rsa.newkeys(n)
file_path = os.path.split(os.path.realpath(__file__))[0] + '\\output'
if not os.path.exists(file_path):
os.mkdir(file_path)
with open(file_path + '/public.pem', 'w+') as f:
f.write(pubkey.save_pkcs1().decode())
with open(file_path + '/private.pem', 'w+') as f:
f.write(privkey.save_pkcs1().decode())
return file_path
# 导入公钥并加密得到密文
def encode_rsa(self, info, n):
file_path = self.pub_privkey(n)
with open(file_path + '/public.pem', 'r') as f:
pubkey = rsa.PublicKey.load_pkcs1(f.read().encode())
crypto_text = rsa.encrypt(info.encode(), pubkey)
return file_path, crypto_text
# 导入私钥并解密得到明文
@staticmethod
def decode_rsa(file_path, crypto_text):
with open(file_path + '/private.pem', 'r') as f:
privkey = rsa.PrivateKey.load_pkcs1(f.read().encode())
message = rsa.decrypt(crypto_text, privkey).decode()
return message
if __name__ == '__main__':
info_in = '张三'
filepath, cp_text = RsaFunc().encode_rsa(info_in, 1024)
ex_text = RsaFunc.decode_rsa(filepath, cp_text)
RSA结果截图展示: