精华内容
下载资源
问答
  • hashlib模块

    2021-02-23 12:48:11
    hashlib模块的使用方法

    Hashlib模块

    1. 什么是哈希hash?
        hash一类算法,该算法接受传入的内容,经过运算得到一串hash

    2. hash值的特点
        I 只要传入的内容一样,得到的hash值必然一样
        II 不能由hash值返解成原有内容
        III 不管传入的内容有多大,只要使用的hash算法不变,得到的hash值长度是一定

    3. hash的用途
        用途1:特点II用于密码密文传输与验证
        用途1:特点II用于密码密文传输与验证

    4. 如何在Python3中使用hash模块
        hash算法就像一座工厂,工厂接收你送来的原材料 (可以用m.update()为工厂运送原材料),经过加工返回的产品就是hash值
      在这里插入图片描述

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Time    : 2021/2/23 9:42
    # @Author  : 小梁同学@0311
    # @File    : hash001.py
    # @Software: PyCharm
    
    import hashlib
    
    m1 = hashlib.md5()
    m1.update('小梁同学'.encode('utf-8'))
    m1.update('0311'.encode('utf-8'))
    res1 = m1.hexdigest()
    print(res1)
    
    m2 = hashlib.md5()
    m2.update('小梁同学0311'.encode('utf-8'))
    res2 = m2.hexdigest()
    print(res2)
    
    # 两种得到的结果是一致的
    # 结果
    	# a719a4a6e2ffebd0bb97291fd3236536
    	# a719a4a6e2ffebd0bb97291fd3236536
    
    
    m3 = hashlib.md5('加盐,可以是任意值'.encode('utf-8'))
    m3.update('小梁同学'.encode('utf-8'))
    res3 = m3.hexdigest()
    print(res3)
    
    1. 模拟撞库
    import hashlib
    
    md5_password = 'c1ff61b3d1999fa5648817ea85226b94'
    
    # 制作密码字段
    passwords = [
        'Lawrence3714',
        'Lawrence0311',
        'Lawrence930293',
        '123Lawrence',
        'Lawrence934434',
        'Lawrence9625',
    ]
    
    dic = {}
    for p in passwords:
        res = hashlib.md5(p.encode('utf-8'))
        dic[p] = res.hexdigest()
    
    # 模拟撞库得到密码
    for k, v in dic.items():
        if v == md5_password:
            print('撞库成功,明文密码是:%s' % k)
            break
    else:
        print('数据库中没有找到....')
    
    
    import hashlib
    
    passwords = ['Lawrence3714', 'Lawrence0311', 'Lawrence930293', '123Lawrence', 'Lawrence934434', 'Lawrence9625']
    
    
    def make_password_dic(pwds):
        dic = {}
        for password in pwds:
            m = hashlib.md5()
            m.update(password.encode('utf-8'))
            dic[password] = m.hexdigest()
        return dic
    
    
    def break_code(md5_pwd, password_dic):
        for k, v in password_dic.items():
            if v == md5_pwd:
                print('密码是===>\033[46m%s\033[0m' % k)
    
    
    if __name__ == '__main__':
        md5_password = 'c1ff61b3d1999fa5648817ea85226b94'
        break_code(md5_password, make_password_dic(passwords))
    
    1. HMAC的使用
        通过哈希算法,我们可以验证一段数据是否有效,方法就是对比该数据的哈希值,例如,判断用户口令是否正确,我们用保存在数据库中的password_md5对比计算md5(password)的结果,如果一致,用户输入的口令就是正确的。

        为了防止黑客通过彩虹表根据哈希值反推原始口令,在计算哈希的时候,不能仅针对原始输入计算,需要增加一个salt来使得相同的输入也能得到不同的哈希,这样,大大增加了黑客破解的难度

        如果salt是我们自己随机生成的,通常我们计算MD5时采用md5(message + salt)。但实际上,把salt看做一个“口令”,加salt的哈希就是:计算一段message的哈希时,根据不同口令计算出不同的哈希。要验证哈希值,必须同时提供正确的口令

        这实际上就是Hmac算法:Keyed-Hashing for Message Authentication。它通过一个标准算法,在计算哈希的过程中,把key混入计算过程中.

        和我们自定义的加salt算法不同,Hmac算法针对所有哈希算法都通用,无论是MD5还是SHA-1。采用Hmac替代我们自己的salt算法,可以使程序算法更标准化,也更安全。

        Python自带的hmac模块实现了标准的Hmac算法。我们来看看如何使用hmac实现带key的哈希

        我们首先需要准备待计算的原始消息message,随机key,哈希算法,这里采用MD5,使用hmac的代码如下:
    import hmac
    
    message = '小梁同学,杭州欢迎您!'
    key = '加盐'
    h = hmac.new(key.encode('utf-8'), message.encode('utf-8'), digestmod='MD5')
    # 如果消息很长,可以多次调用h.update(msg)
    
    print(h.hexdigest())
    # 'd0093df8081bd3db85829b8c7468f0a1'
    
    # 要想保证hmac最终结果一致,必须保证:
    # 1:hmac.new括号内指定的初始key一样
    # 2:无论update多少次,校验的内容累加到一起是一样的内容
    
    # 操作一
    import hmac
    
    h1 = hmac.new('加盐'.encode('utf-8'), digestmod='md5')
    h1.update('小梁同学,杭州欢迎您!'.encode('utf-8'))
    
    print(h1.hexdigest())  # d0093df8081bd3db85829b8c7468f0a1
    
    # 操作二
    h2 = hmac.new('加盐'.encode('utf-8'), digestmod='md5')
    h2.update('小梁同学,'.encode('utf-8'))
    h2.update('杭州欢迎您!'.encode('utf-8'))
    
    print(h1.hexdigest())  # d0093df8081bd3db85829b8c7468f0a1
    

      补充: hmac 模块,它内部对我们创建 key 和 内容 进行进一步的处理然后再加密:

    import hmac
    h1=hmac.new('加盐'.encode('utf-8'),digestmod='md5')
    h1.update('小梁同学,杭州欢迎您!'.encode('utf-8'))
    
    print(h1.hexdigest())
    
    展开全文
  • hashlib 模块

    2018-09-06 19:40:00
    hashlib模块的本质:  1、内部有算法的模块  2、内部不止一种算法 hashlib模块的作用:  1、由于数据的不安全性,为了保证用户的信息绝对的安全,所以所有人的密码都不可以  2、明文的形式存储,而应该经过...

    hashlib模块的本质:

      1、内部有算法的模块

      2、内部不止一种算法

    hashlib模块的作用:

      1、由于数据的不安全性,为了保证用户的信息绝对的安全,所以所有人的密码都不可以

      2、明文的形式存储,而应该经过适当的处理以密文的形式存起来

    hashlib模块的作用:

      1、大家去计算这个密文 使用的是相同的算法

      2、这个算法不可逆

      3、不同的字符串通过这个算法的计算得到的密文总是不同的

      4、相同的算法 相同的字符串 获得的结果总是相同的

      5、不同的语言 不同的环境(操作系统、版本、时间)

    hashlib的基本用法

    import hashlib
    md5_obj = hashlib.md5()     # 选择不同的哈希算法(不同系列)
    md5_obj.update('666'.encode('utf-8'))   # update只接受字节。(b'you911230'或者.encode('utf-8'))
    ret = md5_obj.hexdigest()  # hex十六进制,digest消化
    print(ret)   
    结果为:
    699bb2b220096188a700ac5129dda46f # md5为32位的十六进制的密文

    加入哈希算法的登录程序

    import hashlib
    def get_md5(s):
        md5_obj = hashlib.md5()
        md5_obj.update(s.encode('utf-8'))
        ret = md5_obj.hexdigest()
        return ret
    name = input('name>>>')
    pwd = input('password>>>')
    with open('userinfor') as f:        # str
        for line in f:
            user,paswd = line.strip().split('|')
            if name == user and get_md5(pwd) == paswd:      # hashlib之后再存储、比较
                print('登陆成功')
                break
        else:
            print('登录失败')

    注意:1、文件操作:f.readlines()浪费内存

       2、md5不能重复使用

     

    hashlib 摘要算法
      多种算法

      md5算法 :32位16进制的数字字符组成的字符串
            应用最广大的摘要算法
            效率高,相对不复杂,如果只是传统摘要不安全
      sha算法 :40位的16进制的数字字符组成的字符串
          sha算法要比md5算法更复杂
          且shan n的数字越大算法越复杂,耗时越久,结果越长,越安全
    sha_obj = hashlib.sha1()
    sha_obj.update('alex3714'.encode('utf-8'))
    ret = sha_obj.hexdigest()
    print(len(ret)) # 40

    动态加盐

    import hashlib
    def get_md5(user,s):
        md5_obj = hashlib.md5(user.encode('utf-8'))   # 用户名作为盐
        md5_obj.update(s.encode('utf-8'))
        ret = md5_obj.hexdigest()
        return ret
    
    print(get_md5('alex', 'alex3714')) # ee838c58e5bb3c9e687065edd0ec454f
    print(get_md5('wuser', '666'))  # 2193ed3002d63fea40ddfcc0178cb8fe
    print(get_md5('zhangsan ', '666'))  # d3f40c7661e1d28d3df38aa1f5c85029
    文件的一致校验
    给一个文件中的所有内容进行摘要算法得到一个md5的结果
    import hashlib
    def get_file_md5(file_path):
        md5_obj = hashlib.md5()                     # md5不能重复使用
        with open(file_path,encoding='utf-8') as f:
            for line in f:
                md5_obj.update(line.encode('utf-8'))    # update可以叠加 
        ret = md5_obj.hexdigest()
        print(ret)
    get_file_md5('D:\骑士计划\第五周\Day25\课堂代码.py')

    视频文件的校验

    1、以rb的形式来读,读出来的是bytes

    2、并且不能按行读,也不能一次性读出来

    3、getsize()-->字节大小

    import os
    import hashlib
    def get_file_md5(file_path,buffer = 1024):
        md5_odj = hashlib.md5()
        file_size = os.path.getsize(file_path)
        with open(file_path,'rb') as f:
            while file_size:
                content = f.read(buffer)        # 读1024个bytes类型的字节
                file_size -= len(content)
                md5_odj.update(content)
        return md5_odj.hexdigest()
    print(get_file_md5(r'D:\Python视屏资料\day25\video\选课系统讲解4.mp4'))

     



    转载于:https://www.cnblogs.com/youhongliang/p/9600463.html

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,917
精华内容 4,366
关键字:

hashlib模块