Hash的简介与hashlib模块的使用、模拟撞库与密码加盐

什么是Hash呢?

hash(哈希)是一类算法(如md5),hash算法又称为散列表(hash table),也叫做哈希表,该算法接受传入的内容,经过运算得到一串hash值(字符串)

hash值的特点:
1.只要传入的内容一样,得到的值一定一样 ----> 要用明文传输密码文件完整性校验(下载文件时的安全措施)
2.不能由hash值反解出传入的内容 ----> 把密码做成hash值,不应该在网络传输明文密码
3.只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度是固定的

Hash有什么用呢?

转为密文密码

我们在使用客户端时注册一个账号,向服务端发送了自己的密码,我们大家知道,抓包也就是截取这些包含用户密码的信息是十分容易的,故如果不对密码进行加密,我们在使用服务时便基本毫无安全性可言

Hash可以在一定程度上帮助我们解决这一类烦恼,它首先是一类数学算法,选取其中的一种将我们的明文密码转为Hash值,对其进行加密即转为密文密码,其最大的适用点是其是不能被反解的(虽然现在有很多反解的工具、网站,如md5算法,做到这一数学突破的似乎是我国山东大学一位数学性的教授~)

用于文件校验

服务端在向客户端传文件时,可以使用hash算法得到一个hash值,客户端收到文件时会用其相应的算法得到的hash值进行比对,用于判断文件的完整性或是否被修改过

Hash 构造方法与算法过程

  • 直接定址方法

    • 公式一:hash(key) = key
    • 公式二:hash(key) = a*key+b
    • 我们可以查看到直接定址方法具有线性的特点,因此适用在关键字分布连续的情况
  • 数学分析方法

    • 方式:提取关键字中随机性好的数字位,将其拼接为哈希地址
    • 适用场景:关键字已知的情况下,对关键字中每一位进行取值情况分析
  • 除留余数方法

    • 公式:hash(key) = key % p
    • 除数采用取余模运算
  • 算法过程:

    • hash 函数接收到输入的字符串,首先会先进行预处理-哈希计算-输入摘要
    • 预处理:将字符串进行填充、分割N块,为hash进行初始化
    • 哈希计算:将预处理的数据完成指定算法生成消息摘要
    • 每指定一种hash算法只会生成固定长度的摘要,长度越长的安全性越高

转自:
作者Id:盆友圈的小可爱

hashlib模块的使用

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())               # 这样得到的密文就加密程度更高了

希望该文章能对您有所帮助,文章所涉及如有不正之处,望各位不吝指正赐教!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值