zoukankan      html  css  js  c++  java
  • hashlib和hmac模块

    hashlib模块

    • 这个模块针对不同的安全哈希和消息摘要算法实现了一个通用的接口。该算法接收传入的内容,经过运算得到一串hash值
    • 此模块中总是可用的哈希算法构造器有md5, sha1(), sha224(), sha256(), sha384(), sha512(), blake2b()blake2s()

    hash值的特点

    • 1、只要传入的内容一样,得到的hash值必然一样=========>>文件传输完整性校验。
    • 2、不能由hash值反解成内容==========>> 把密码做成hash值,不应该在网络传输明文密码。
    • 3、只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度是固定的。

    hashlib的使用

    • 注:向 update() 输入字符串对象是不被支持的,因为哈希基于字节而非字符。
    • update()可多次传值,与一次update这段长数据,得到的结果一样,但是update多次为校验大文件提供了可能。
    import hashlib
    m = hashlib.md5()
    m.update(b'abc')
    m.update('李白'.encode('utf-8'))
    print(m.hexdigest())
    # ddfe8b4099dee5a307bd8d72b5408332
    
    # 简要写法
    print(hashlib.md5('abc李白'.encode()).hexdigest())
    # ddfe8b4099dee5a307bd8d72b5408332
    

    撞库

    撞库是通过已有的大量密码进行hash运算得到hash值,将截获到的密码秘文与已有的hash值进行比对。

    import hashlib
    
    # 已有密码
    password_list = [
        "RuGxM62EgW",
        "rx3Nmu59oV",
        "eIgdXq6B4N",
        "75dY890jAA",
        "5yy4GJvTu0",
        "1BB775rZDU",
        "MTlmcz2kmL",
        "vN7MZ71FbL",
    ]
    
    
    class Hit_The_Library:
        # 将已有密码文件生成密码字典,key是明文密码,value是秘文
        def get_password_dict(self, password_list):
            self.password_dict = {}
            m = hashlib.md5()
            for i in password_list:
                m.update(i.encode('utf-8'))
                self.password_dict[i] = m.hexdigest()
            return self.password_dict
    
        # 破解
        def brute_force(self, private_password):
            for k, v in self.password_dict.items():
                if v == private_password:
                    return f'明文密码为:{k}
    密文密码为:{v}'
    
    hit = Hit_The_Library()
    hit.get_password_dict(password_list)
    print(hit.brute_force("a191f8c8408c5a90fd970a02d0a3b52a"))
    
    明文密码为:MTlmcz2kmL
    密文密码为:a191f8c8408c5a90fd970a02d0a3b52a
    

    密码加盐

    对于私密信息不能直接以明文传输,比如密码,应该将之加密后传输。为防止数据包被截获后通过撞库而破解,可在密码内掺入其他内容。

    import hashlib
    m = hashlib.sha512()
    m.update('首部添加的内容'.encode('utf-8'))
    m.update('password'.encode('utf-8'))
    m.update('尾部添加的内容'.encode('utf-8'))
    print(m.hexdigset())
    

    文件校验

    1、校验全部内容,如果文件过大耗时会比较长。

    import hashlib
    
    class FileVerification:
        def __init__(self,file):
            self.file = file
    
        def verification(self,hash):
            h = getattr(hashlib,hash)()
            with open(self.file, 'rb') as f:
                for line in f:
                    h.update(line)
                return h.hexdigest()
    
    file = FileVerification('password.txt')
    print(file.verification('md5'))
    
    3b673cf066e166e5c8f58e096cf02f85
    

    2、截取文件的部分位置校验,速度较快,但有误差。例如平均在文件每1/100位置上取10个字节进行校验。

    import os
    import hashlib
    
    class FileVerification:
        def __init__(self,file):
            self.file = file
    
        def verification(self,hash):
            h = getattr(hashlib,hash)()
            step = os.path.getsize(self.file) // 100
            with open(self.file, 'rb') as f:
                while 1:
                    content = f.read(10)
                    if len(content):
                        h.update(content)
                        f.seek(step,1)
                    else:
                        return h.hexdigest()
    
    file = FileVerification('password.txt')
    print(file.verification('md5'))
    
    c7ab5c06d3e9d70f1a40dd022609397b
    

    hmac模块

    new方法第一个参数指定加的盐,必须为bytes类型,第二个参数指定hash算法。hmac并不是简单的将盐插入数据首部或尾部,而是经过其他算法将盐混入数据。

    import hmac
    h1 = hmac.new(b'hash',digestmod='md5')
    h1.update(b'hello')
    h1.update(b'world')
    print(h1.hexdigest())
    
    905f549c5722b5850d602862c34a763e
    
  • 相关阅读:
    iterm2 配色修改
    让Dock自动 显示/隐藏 不再有延迟
    Xcode更改配色方案
    CocoaPods安装与使用
    CocoaPods安装和使用及问题:Setting up CocoaPods master repo
    CocoaPods安装和使用教程
    RubyGems 镜像
    iOS Mac系统下Ruby环境安装
    MAC机中安装RUBY环境
    Kibana+Logstash+Elasticsearch 日志查询系统
  • 原文地址:https://www.cnblogs.com/ChiRou/p/14269360.html
Copyright © 2011-2022 走看看