Python使用哈希算法、加解密算法

文章正文
发布时间:2025-02-21 15:22

__Author__ = 'VictoryHan' __Date__ = '2022-09-20' ''' 哈希函数 哈希,hash 哈希函数可以把任意长度的数据(字节串)【源数据】计算出一个为固定长度的结果数据【哈希值】 哈希函数有好几种,对应不同的算法,比如MD5、SHA1、SHA224、SHA256、SHA384、SHA512 哈希计算的特点: 1)、相同的源数据,哈希算法相同计算出来的哈希值就一定相同。 2)、不管源数据有多大,哈希算法相同计算出来的哈希值长度就一样长。 基于以上两点哈希值常被用来验证文件是否有改动。 算法 结果计算长度 MD5 16字节 SHA1 20字节 SHA224 28字节 SHA256 32字节 SHA384 48字节 SHA512 64字节 3)、算法不可逆,即不能通过哈希值反过来计算出源数据 4)、不同的源数据使用同样的哈希算法可能会产生相同的哈希值,这种现象被称为碰撞率(collision rate) ps:各种哈希算法,计算的结果长度越长,碰撞率越低,通常耗费的计算时长也越长。即使是 MD5 算法, 碰撞率也 非常小,小到几乎可以忽略不计。大约是 1.47*10的负29次方 ''' #python计算哈希值 #hashlib官方文档:https://docs.python.org/3/library/hashlib.html ''' 哈希算法加盐(以下为个人表述) 所谓加盐,就是向需要加密的内容里额外添加一些唯一的内容,使破解难度大大增加 比如,当用户首次提供密码时(通常是注册时),由系统自动往这个密码里撒一些“盐”,然后再加密。 而当用户登录时,系统为用户提供的代码撒上同样的“盐”,然后加密,再比较加密值,来判断密码是否正确。 ''' #导入关键包 import hashlib ''' 哈希加盐 ''' #调用hash计算方法新建变量并加盐 m = hashlib.md5("[盐]".encode("utf-8")) #放入原料 m.update("[原料]".encode("utf-8")) #算出hash值对应的bytes对象 m.digest() #产生哈希值的十六进制表示 m.hexdigest() ''' 直接加密,不加盐 ''' #调用hash计算方法新建变量 n = hashlib.md5() #计算需要加密的内容 n.update("[原料]".encode("utf-8")) #算出hash值对应的bytes对象 n.digest() #产生哈希值的十六进制表示 n.hexdigest() ''' 加解密 加解密算法,顾名思义,是对源数据进行运算产生加密数据,以及逆运算,对加密数据反算出源数据。 加解密算法和hash算法的不同点: 1、加解密算法是可逆的,hash算法是不可逆的。 2、hash算法可以对很大的数据产生比较小的哈希值,而加解密算法元数据很大加密后的数据也会很大。 加解密算法可以分为:1、对称加密;2、不对称的加密。 对称加密指加密和解密使用相同的密钥,不对称加密与之相反,使用不同的密钥,一般是一对密钥,分别称之为公钥【用来加密】、私钥【用来解密】。 比较常见的对称加密算法有:AES(安全等级此列中最高)、RC4、DES、3DES、IDEA......... RSA(Rivest–Shamir–Adleman)最知名的的不对称加密系统 ''' #python语言加解密 ''' 加解密的库,Python 没有内置的。我们需要安装使用第三方开发的库。 目前口碑比较好的Python加解密库有 cryptography 和 PyNaCl。 本人目前倾向于cryptography(Paramiko就使用该库作为底层加解密计算) github地址:https://github.com/pyca/cryptography paramiko之前python ssh那片博客里有提到,一个ssh相关的库 ''' #导入相关的包 from cryptography.fernet import Fernet #设置密钥,这是加密解密必须的 key = Fernet.generate_key() f = Fernet(key) #源数据,必须是字节串对象 text = "Hello, world!" #字节串对象需要encode一下 textSrc = text.encode("utf-8") #生成加密字节串并打印 keyword = f.encrypt(textSrc) print(keyword) #解密,返回值是字节串对象 source = f.decrypt(keyword) print(source.decode('utf-8')) #关于加密,以后用到啥再补充,暂时先这么多。