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''
2 str.encode()
3 bytes()

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:常用的一些动态干扰项---当前时间、用户名的部分字符...,将这些动态的字符也添加一起加密成密文,得到的结果更加安全,难以猜测结果
  1. 动态加盐

干扰项是随机变化的,防止干扰项被泄露后用户数据被反向匹配到(通过撞库可以反解)

​ ps:常用的一些动态干扰项---当前时间、用户名的部分字符...,将这些动态的字符也添加一起加密成密文,得到的结果更加安全,难以猜测结果

4 加密操作的用处

1.用户密码加密

2.文件安全性校验

3.文件内容一致性校验

​ 利用hashlib 具有单向计算的特性。

​ 在下载文件时,既下载文件本身的内容,也下载加密后的密文,通过下载后对文件进行加密处理。对比加密后的密文是否一致,如果密文一致则俩个文件内容相同,不一致则说明文件可能在下载过程中被恶意篡改。

4.大文件内容加密

​ 由于大文件数据量很大,不会全部加密,然后对比密文,这样效率大大降低。会通过截取部分内容加密的方法,对比加密部分,验证文件的内容是否一致。

​ 比如:将一个1000G的文件,截取其中的100个小部分。将这100个部分进行加密,在文件下载后对比这100个部分是否相同,如果有不同则说明文件在下载的时候被篡改了,文件就不安全了,即可提醒用户该文件可能被木马病毒感染了。

5 优秀hash算法的特性

​ 正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值。

​ 逆向困难:给定(若干) hash 值,在有限时间内很难(基本不可能)逆推出明文。

​ 输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来应该都有很大不同。

​ 冲突避免:很难找到两段内容不同的明文,使得它们的 hash 值一致(发生冲突)。即对于任意两个不同的数据块,其hash值相同的可能性极小;对于一个给定的数据块,找到和它hash值相同的数据块极为困难。

posted @ 2022-10-27 18:44  Duosg  阅读(174)  评论(0编辑  收藏  举报