python基础:hashlib加密模块
hashlib加密模块
hashlib 是一个提供了一些流行的hash(摘要)算法的Python标准库。其中所包括的算法有 md5, sha1, sha224, sha256, sha384, sha512等
什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)
1 加密的含义简介
1.何为加密?
将明文数据处理成密文数据,让人无法看懂
2.为什么加密?
加密可以保证数据的安全,防止数据中途拦截泄漏
3.如何判断数据是否是加密的?
当一串字符串没有规律,中间包含无规律的字母、数字、符号
4.密文的长短代表了什么
密文越长表示使用的加密算法越复杂
5.常见的加密算法有哪些?
md5、base64、hmac、sha系列
2 加密算法基本操作
1.选择加密算法
import hashlib # 导入hashlib 加密模块
md5 = hashlib.md5() # 选择加密语法为md5,构建md5对象
2.传入明文数据
md5.updata(b'hello') # updata更新哈希对象以字符串参数
# 传入想要加密的明文,b''表示是二进制数据
"update属性的参数含义"
md5.undate('待加密的明文'.encode(encoding='utf8))
3.获取加密密文
res = md5.hexdigest() # hexdigest返回摘要,作为十六进制数据字符串值
print(res)
# 通过 md5.hexdigest() md5中的hexdigest方法来获取加密的密文
转换成二进制的三种方法
1
b''
2str.encode()
3bytes()
4*设定hashlib md5 加密函数
import hashlib
def hashlib_md5(password):
m = hashlib.md5() # 构建MD5对象
m.update(password.encode(encoding='utf-8')) # 设置编码格式 并将字符串添加到MD5对象中
password_md5 = m.hexdigest() # hexdigest()将加密字符串 生成十六进制数据字符串值
return password, password_md5
res = hashlib_md5('123456')
print(res)
--------------------
('123456', 'e10adc3949ba59abbe56e057f20f883e')
3 加密补充说明(hashlib的特点)
1.加密算法不变,如果传入的明文相同,加密后的密文相同
1.明文一次性输入
import hashlib
md5 = hashlib.md5()
md5.update(b'hello~world~python')
res = md5.hexdigest()
print(res) # 393f30266b770278539d8fd96ff521c0
2.明文分次输入
md5.update(b'hello')
md5.update(b'~world')
md5.update(b'~python')
res = md5.hexdigest()
print(res) # 393f30266b770278539d8fd96ff521c0
"""
由此可见,只要传入的明文完全相同,算法相同的情况下,输出的密文也会完全相同
"""
2.加密之后的结果是无法反解密的
hashlib 具有单向计算特性,无法通过密文反推明文,因此它可以在不存储明文口令的情况下验证用户口令
hashlib 具有单向计算特性,只能从明文到密文加密,不能从密文到明文解密
所谓解密只是已经记录了很多常用的明文加密的结果
3.加盐处理和动态加盐
1) 加盐处理
在明文中增加一些干扰项,防止明文过于简单容易被猜测
import hashlib
md5 = hashlib.md5()
md5.updata(b'公司干扰项', encoding='utf8') # 添加干扰项,防止明文过于简单
md5.update(b'hello~world~python')
res = md5.hexdigest()
# 动态加盐
干扰项是随机变化的,防止干扰项被泄露后用户数据被反向匹配到
ps:常用的一些动态干扰项---当前时间、用户名的部分字符...,将这些动态的字符也添加一起加密成密文,得到的结果更加安全,难以猜测结果
- 动态加盐
干扰项是随机变化的,防止干扰项被泄露后用户数据被反向匹配到(通过撞库可以反解)
ps:常用的一些动态干扰项---当前时间、用户名的部分字符...,将这些动态的字符也添加一起加密成密文,得到的结果更加安全,难以猜测结果
4 加密操作的用处
1.用户密码加密
2.文件安全性校验
3.文件内容一致性校验
利用hashlib 具有单向计算的特性。
在下载文件时,既下载文件本身的内容,也下载加密后的密文,通过下载后对文件进行加密处理。对比加密后的密文是否一致,如果密文一致则俩个文件内容相同,不一致则说明文件可能在下载过程中被恶意篡改。
4.大文件内容加密
由于大文件数据量很大,不会全部加密,然后对比密文,这样效率大大降低。会通过截取部分内容加密的方法,对比加密部分,验证文件的内容是否一致。
比如:将一个1000G的文件,截取其中的100个小部分。将这100个部分进行加密,在文件下载后对比这100个部分是否相同,如果有不同则说明文件在下载的时候被篡改了,文件就不安全了,即可提醒用户该文件可能被木马病毒感染了。
5 优秀hash算法的特性
正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值。
逆向困难:给定(若干) hash 值,在有限时间内很难(基本不可能)逆推出明文。
输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来应该都有很大不同。
冲突避免:很难找到两段内容不同的明文,使得它们的 hash 值一致(发生冲突)。即对于任意两个不同的数据块,其hash值相同的可能性极小;对于一个给定的数据块,找到和它hash值相同的数据块极为困难。