__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'))
#关于加密,以后用到啥再补充,暂时先这么多。