时间:2022-04-25 10:49:00 | 栏目:Python代码 | 点击:次
散列算法(Hash Algorithm),又称哈希算法,杂凑算法,是一种从任意文件中创造小的数字「指纹」的方法。与指纹一样,散列算法就是一种以较短的信息来保证文件唯一性的标志,这种标志与文件的每一个字节都相关,而且难以找到逆向规律。因此,当原有文件发生改变时,其标志值也会发生改变,从而告诉文件使用者当前的文件已经不是你所需求的文件
Hash简单点讲就是把任意一段数据经过某种算法生成一段唯一的固定长度的数据
也可以把哈希值当做是文件指纹,因为它是文件唯一性的标志,与每一个字节都有关,当文件发生改变是,指纹值也会改变
只要传入的内容一样,得到的hash值必然一样
常见 Hash 算法有 MD5 和 SHA 系列,目前 MD5 和 SHA1 已经被破解,一般推荐至少使用 SHA2-256 算法
哈希算法 | 输出长度(bit) | 输出长度(字节) |
---|---|---|
MD5 | 128 bit | 16 bytes |
RipeMD160 | 160 bits | 20 bytes |
SHA-1 | 160 bits | 20 bytes |
SHA-256 | 256 bits | 32 bytes |
SHA-512 | 512 bits | 64 bytes |
稍微想一下就可以发现,既然输入数据长度不固定,而输出的哈希值却是固定长度的,这意味着哈希值是一个有限集合,而输入数据则可以是无穷多个,那么建立一对一关系明显是不现实的。所以“碰撞”是必然会发生的,所以一个成熟的哈希算法会有较好的抗冲突性,同时在实现哈希表的结构时也要考虑到哈希冲突的问题
当然,如果有三万台电脑同时破解,也还是一天 -_-|||。
不过道高一尺,魔高一丈。谁又会傻乎乎的一个站着打一个等着挨。都是相对的
所以密码尽量不要用纯数字,因为根本没有任何安全性
对数字内容进行 Hash 运算,获取唯一的摘要值来指代原始完整的数字内容,利用 Hash 函数的抗碰撞性来确保内容未被篡改
常用于用户名和密码来确保用户信息安全,为了防止攻击会采用加盐的方法,就是原来的明文加上一个随机数之后的 Hash 值,Hash 值和盐会保存在两个地方,只要不是同时泄漏就很难被破解
如果在Python中需要对用户输入的密码或者其他内容进行加密,首选的方法是生成hash值
在Python中可以利用二个模块来进行:
使用:hashlib.md5()
名称 | 描述 |
---|---|
md5(…) | 利用md5算法加密 |
sha1(…) | 利用sha1算法加密 |
sha224(…) | 利用sha224算法加密 |
sha256(…) | 利用sha256算法加密 |
sha384(…) | 利用sha384算法加密 |
sha512(…) | 利用sha512算法加密 |
如果你利用hashlib
生成了一个Hash对象,那么这个Hash对象会包含如下方法
名称 | 描述 |
---|---|
update(arg) | 可以重复利用指定了特殊加密算法的Hash对象,对arg 进行加密 |
digest(…) | 以字符形式返回加密内容 |
hexdigest(…) | 以16进制形式返回加密内容 |
copy(…) | 为了达到重复利用Hash对象的目的,而克隆Hash对象 |
直接使用hashlib方法
import hashlib hashlib.sha224("Nobody inspects the spammish repetition".encode("utf-8")) # 加密 hashlib.sha224("Nobody inspects the spammish repetition".encode("utf-8")).hexdigest() # 返回加密内容
直接使用Hash对象中的方法
import hashlib # 造出工厂 m = hashlib.md5() # 放入原料 m.update("Nobody inspects".encode('utf-8')) # 产出hash值 m.digest() m.update("the spammish repetition".encode("utf-8")) m.digest() m.hexdigest()
import hashlib # 造出工厂 m = hashlib.md5("this is salt".encode("utf-8")) # 放入原料 m.update("Nobody inspects".encode('utf-8')) # 产出hash值 m.digest() m.update("the spammish repetition".encode("utf-8")) m.digest() m.hexdigest()
主要方法
名称 | 类型 | 描述 |
---|---|---|
crypt(…) | 方法 | 对指定内容进行hash加密 |
mksalt(…) | 方法 | 根据加密算法生成salt |
methods | list | 返回可用加密算法的列表 |
MOTHOD_CRYPT | 常量 | 加密算法 |
METHOD_MD5 | 常量 | md5加密算法 |
METHOD_SHA256 | 常量 | sha256加密算法 |
METHOD_SHA512 | 常量 | sha512加密算法 |
使用crypt.crypt(…)进行hash加密的时候,需要提供二个参数:
import crypt salt = crypt.mksalt(crypt.METHOD_SHA512) hash = crypt.crypt("helloworld",salt)
m=hashlib.md5() m.update('key'.encode('utf-8')) #添加个其他元素,提升密码复杂度,不是加盐 m.update(password.encode('utf-8')) print(m.hexdigest())
m = hashlib.md5() with open(r'E:\01.mp4','rb') as f: for line in f: m.update(line) print(m.hexdigest)