数据分析常用加密方式MD5、SHA256、RSA

GitHub地址:
https://github.com/gao7025/md5_rsa_tool.git

简单来说

数据测试与分析需要经常将用户的敏感信息加密,将原有的明文信息经过加密算法转换成不可读的字符串,从而达到加密的目的,常用的加密算法有MD5、SHA256、RSA等。

  1. MD5、SHA256都是哈希算法,python中都来自hashlib包,主要是将一段字符串通过一定的加密算法转换成另一种字符串,因具有不可逆的特点,从而保证了数据的安全。
  2. 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结果截图展示:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值