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

    Hash,译做“散列”,也有直接音译为“哈希”的。把任意长度的输入,通过某种hash算法,变换成固定长度的输出,该输出就是散列值,也称摘要值。该算法就是哈希函数,也称摘要函数。

    MD5是最常见的摘要算法,速度很快,生成结果是固定的16字节,通常用一个32位的16进制字符串表示。SHA1算法更安全点,它的结果是20字节长度,通常用一个40位的16进制字符串表示。而比SHA1更安全的算法是SHA256和SHA512等等,不过越安全的算法越慢,并且摘要长度更长。

    两个模块主要用于加密相关的操作(加密数据时一定要指定数据编码格式。可以使用字符串前b' '的方法或使用.encode('UTF-8')的方法,使字符串变为bytes类型)

    hashlib模块

    md5

    import hashlib
    ha_m5 = hashlib.md5()#创建对象
    ha_m5.update('abc'.encode(encoding='utf-8'))#添加对象时需要指定编码
    print(ha_m5.digest())#以二进制格式显示加密信息
    print(ha_m5.hexdigest())#以十六进制格式显示加密信息(常用)

    应用实例:

        def md5_lower_32(dic,secret):
            """
            接口的鉴权方法
            把参数字典中value非空的键值对按顺序进行拼接后,再加上密钥secret进行MD5得到sign
            """
            lis = dic.items()
            lis = sorted(lis,reverse=False)
            key_value = []
            for key,value in lis:
                if value:
                    if type(value) is int:
                        value = str(value)
                    elif type(value) is not str:
                        continue
                    elif key == 'sign':
                        continue
                    s = key+'='+value
                    key_value.append(s)
            key_value.append('secret=%s'%secret)
            string = '&'.join(key_value)
            print(string)
            md = hashlib.md5()
            md.update(string.encode(encoding='utf-8'))
            ret = md.hexdigest()#以十六进制格式显示加密信息(常用),md.digest()是以二进制格式显示加密信息
            return ret

    sha1(sha224   sha256  sha384  sha512等不作赘述)

    ha_s1 = hashlib.sha1()
    ha_s1.update('abc'.encode(encoding='utf-8'))
    print(ha_s1.digest())#以二进制格式显示加密信息
    print(ha_s1.hexdigest())#以十六进制格式显示加密信息

     hmac模块

    sha1(方法支持加盐)

    import hmac
    key = b'salt'
    data = b'sjdhjwkdjk'
    hm = hmac.new(key,data,hashlib.sha1)
    hm.digest()#以二进制格式显示加密信息
    hm.hexdigest()#以十六进制格式显示加密信息

     应用实例:

    
    
    import hmac,base64
    def sha1_base64(key,data):
        data_sha1 = hmac.new(key,data,hashlib.sha1).digest()
        data_sha1_base64 = base64.b64encode(data_sha1)
        return data_sha1_base64

    以下代码是对应的php写法,当时用python实现是为了测试开发人员的接口实现的正确性

    base64_encode(hash_hmac("sha1", QUERY_STRING, KEY, TRUE))

    ps:有个搞不明白的地方在此记录,以上实际使用时,hmac模块的sha1加密算法得到的值,通过hashlib模块没法得到

    研究hashlib底层代码没看懂如何加盐即key,试着用如下方法,得到的结果不对~

    key = b'salt'
    data = b'sjdhjwkdjk'
    hm = hmac.new(key,data,hashlib.sha1) res1 = hm.digest() ha_s1 = hashlib.sha1(key) ha_s1.update(data) res2 = ha_s1.digest() res1和res2不相等
  • 相关阅读:
    拉格朗日插值模板题 luoguP4871
    FFT P3803 [模板]多项式乘法
    codeforces #629 F
    codeforces #629 E-Tree Queries
    数学—线性基
    codeforces #629 D.Carousel
    luogu P1447_能量采集 (莫比乌斯反演)
    luogu P2257- YY的GCD (莫比乌斯反演)
    luogu P2522-Problem b (莫比乌斯反演)
    luogu P3455 (莫比乌斯反演)
  • 原文地址:https://www.cnblogs.com/yy-cola/p/11683671.html
Copyright © 2011-2022 走看看