• hashlib模块


    一,什么是hash?

    hash是一种算法,该算法接受传入的内容,经过运算得到一串hash值。

    二,hash值的特点是:

    1.只要传入的内容一样,得到的hash值必然一样。————》要用明文传输密码文件完整性校验。

    2.不能由hash值反解成内容。

    3.只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度是固定的。

    基于1和2可以在下载文件时做文件一致性校验。

    基于1和3可以对密码进行加密。

    比喻:

    hash算法就像是一座工厂,工厂接收你送来的原材料,(可以用m.update()为工厂运送原材料),经过加工返回的产品就是hash值。

    操作如下:

    import hashlib
    m=hashlib.md5() #搞定算法
    m.update('你fxc'.encode('utf-8')) #传入原材料
    print(m.hexdigest()) #得到hash值。

    3、如何用
    '''
    import hashlib

    # #1、造出hash工厂
    # m=hashlib.md5()
    #
    # #2、运送原材料
    # m.update('你好啊美丽的'.encode('utf-8'))
    # m.update('张铭言'.encode('utf-8'))
    #
    # #3、产出hash值
    # print(m.hexdigest()) #66bcb9758826f562ae8cb70d277a4be9


    # #1、造出hash工厂
    # m=hashlib.md5('你'.encode('utf-8'))
    #
    # #2、运送原材料
    # m.update('好啊美丽的张铭言'.encode('utf-8'))
    #
    # #3、产出hash值
    # print(m.hexdigest()) #66bcb9758826f562ae8cb70d277a4be9


    三。应用一:文件一致性校验

    # #1、造出hash工厂
    # m=hashlib.sha512('你'.encode('utf-8'))
    #
    # #2、运送原材料
    # m.update('好啊美sadfsadf丽asdfsafdasdasdfsafsdafasdfasdfsadfsadfsadfsadfasdff的张铭言'.encode('utf-8'))
    #
    #
    # #3、产出hash值
    # print(m.hexdigest()) #2ff39b418bfc084c8f9a237d11b9da6d5c6c0fb6bebcde2ba43a433dc823966c


    # #1、造出hash工厂
    # m=hashlib.md5()
    #
    # #2、运送原材料
    # with open(r'E:1.mp4','rb') as f:
    # for line in f:
    # m.update(line)
    # #3、产出hash值
    # print(m.hexdigest()) #1273d366d2fe2dc57645cc1031414a05
    # # 1273d366d2fe2dc57645cc1031414a05


    # 应用二:对明文密码进行加密
    # password=input('>>>: ')
    #
    # m=hashlib.md5()
    # m.update('天王盖地虎'.encode('utf-8'))
    # m.update(password.encode('utf-8'))
    # print(m.hexdigest()) #95bd6eafefdf51d8b153785f3fb6263d



    注意:
    把一段很长的数据update多次,与一次update这段长数据,得到的结果是一样的。但是update多次为校验大文件提供了可能。

    以上加密算法虽然依然非常厉害,但有时候存在缺陷,即通过撞库可以反解。所以有必要对加密算法中添加自定义key再来做加密。


    模拟撞库破解密码:
    import hashlib
    passwds=[
    'alex3714',
    'alex1313',
    'alex94139413',
    'alex123456',
    '123456alex',
    'a123lex',
    ]
    def make_passwd_dic(passwds):
    dic={}
    for passwd in passwds:
    m=hashlib.md5()
    m.update(passwd.encode('utf-8'))
    dic[passwd]=m.hexdigest()
    return dic

    def break_code(cryptograph,passwd_dic):
    for k,v in passwd_dic.items():
    if v == cryptograph:
    print('密码是===>33[46m%s33[0m' %k)

    cryptograph='aee949757a2e698417463d47acac93df'
    break_code(cryptograph,make_passwd_dic(passwds))

  • 相关阅读:
    Zircon
    Linux与Windows的设备驱动模型对比
    c++11 右值引用、移动语义和完美转发
    【Java学习笔记之十四】Java中this用法小节
    【机器学习笔记之四】Adaboost 算法
    【Java学习笔记之十三】初探Java面向对象的过程及代码实现
    【Java学习笔记之十二】Java8增强的工具类:Arrays的用法整理总结
    【机器学习笔记之三】CART 分类与回归树
    【Java学习笔记之十一】Java中常用的8大排序算法详解总结
    【Java学习笔记之十】Java中循环语句foreach使用总结及foreach写法失效的问题
  • 原文地址:https://www.cnblogs.com/fxc-520520/p/9224763.html
Copyright © 2020-2023  润新知