hash(哈希)是一类算法(如md5),hash算法又称为散列表(hash table),也叫做哈希表,该算法接受传入的内容,经过运算得到一串hash值(字符串)
hash值的特点:
1.只要传入的内容一样,得到的值一定一样 ----> 要用明文传输密码文件完整性校验(下载文件时的安全措施)
2.不能由hash值反解出传入的内容 ----> 把密码做成hash值,不应该在网络传输明文密码
3.只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度是固定的
我们在使用客户端时注册一个账号,向服务端发送了自己的密码,我们大家知道,抓包也就是截取这些包含用户密码的信息是十分容易的,故如果不对密码进行加密,我们在使用服务时便基本毫无安全性可言
Hash可以在一定程度上帮助我们解决这一类烦恼,它首先是一类数学算法,选取其中的一种将我们的明文密码转为Hash值,对其进行加密即转为密文密码,其最大的适用点是其是不能被反解的(虽然现在有很多反解的工具、网站,如md5算法,做到这一数学突破的似乎是我国山东大学一位数学性的教授~)
服务端在向客户端传文件时,可以使用hash算法得到一个hash值,客户端收到文件时会用其相应的算法得到的hash值进行比对,用于判断文件的完整性或是否被修改过
直接定址方法
数学分析方法
除留余数方法
算法过程:
转自:
作者Id:盆友圈的小可爱
Python当中有一个可以让我们很轻松的使用hash诸多算法对信息进行加密的模块:hashlib
hashlib模块
import hashlib
obj = hashlib.md5() # 相当于得到一个md5算法的加工厂,也可以直接传值 常见的有md5、rsa算法
obj.update('hello'.encode('utf-8')) # 向加工厂传数据,注意只能传入byte类型的数据
obj.update('world'.encode('utf-8'))
# updata()方法是可以直接进行字符串拼接的,故推荐在读文件时使用for循环一行一行的读,以此防止内存溢出
res = obj.hexdigest() # 产品出厂
print(res)
不过,在要检验的hash值过大时,如果使用for循环去读每一行的话,会花费很多时间,这种情况可以选择去校验hash值的随机的每一段,用f.seek()方法选取几个点进行校验,类似随机抽样,介绍时间与内存成本的同时又可以大概率的确定文件的完整性与正确性
通过hash算法生成的hash值对密码进行加密仅是一种防御手段,这里我们探讨一下如何破解hash值加密后的密码
爆破解法(撞库):将猜到的用户可能设置的密码通过已截取或已知的客户端加密的hash算法得到的密文与截获的密文进行不断比对
import hashlib
catch_code = 'asdqf4658716qwf984651fasf4654afs' # 抓包获取的hash值
password = [ # 猜的可能撞上的密码
'1234',
'a123',
'123456',
'acsccsc'
]
def make_code_dic(password, catch_code): # 制作密码字典
dic = {}
for p in password:
res = hashlib.md5(p.encode('utf-8'))
dic[p] = res.hexdigest() # 字典中键是明文密码,值是hash值
for k, v in dic.items():
if v == catch_code:
print(f'撞库成功,明文密码是{k}') # 如果字典中的值对上了即得到了明文密码
树立良好价值观,保障信息安全,那如果有些人真的不计机器成本和时间成本,把一个大用户的密码的密文给解惑了,用十几台机器在每日每夜的撞库,咋办咧?
结果是:如果真没日没夜的撞,迟早会撞上的,这似乎避免不了,但可以加重破解的成本,毕竟坚持才是胜利,说不定一些不坚定的不法分子破了几个月后心态出问题了,知难而退
加重撞库的成本,可以为密码加加盐
密码加盐:在密码中随机地加入一些无用的、耐人寻味的字节,但将加入的位置与加入的内容转给需要进行合法通信的双方以正常解密,但对截获信息者就需要花更多的时间解密了
import hashlib
# 密码是steak0107
obj = hashlib.md5()
obj.update('我是盐'.encode('utf-8')) # 加入混淆信息
obj.update('steak'.encode('utf-8'))
obj.update('我也是盐'.encode('utf-8'))
obj.update('0107'.encode('utf-8'))
print(obj.hexdigest()) # 这样得到的密文就加密程度更高了
希望该文章能对您有所帮助,文章所涉及如有不正之处,望各位不吝指正赐教!