zoukankan      html  css  js  c++  java
  • python中hashlib模块用法示例

    python中hashlib模块用法示例

    我们以前介绍过一篇Python加密的文章:Python 加密的实例详解。今天我们看看python中hashlib模块用法示例,具体如下。
    hashlib

    hashlib主要提供字符加密功能,将md5和sha模块整合到了一起,支持md5,sha1, sha224, sha256, sha384, sha512等算法
    具体应用    
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    #pyversion:python3.5
    #owner:fuzj
     
    import hashlib
    # ######## md5 ########
    string = "beyongjie"
    md5 = hashlib.md5()
    md5.update(string.encode('utf-8'))   #注意转码
    res = md5.hexdigest()
    print("md5加密结果:",res)
    # ######## sha1 ########
    sha1 = hashlib.sha1()
    sha1.update(string.encode('utf-8'))
    res = sha1.hexdigest()
    print("sha1加密结果:",res)
    # ######## sha256 ########
    sha256 = hashlib.sha256()
    sha256.update(string.encode('utf-8'))
    res = sha256.hexdigest()
    print("sha256加密结果:",res)
    # ######## sha384 ########
    sha384 = hashlib.sha384()
    sha384.update(string.encode('utf-8'))
    res = sha384.hexdigest()
    print("sha384加密结果:",res)
    # ######## sha512 ########
    sha512= hashlib.sha512()
    sha512.update(string.encode('utf-8'))
    res = sha512.hexdigest()
    print("sha512加密结果:",res)

    输出结果:    
    md5加密结果: 0e725e477851ff4076f774dc312d4748
    sha1加密结果: 458d32be8ea38b66300174970ab0a8c0b734252f
    sha256加密结果: 1e62b55bfd02977943f885f6a0998af7cc9cfb95c8ac4a9f30ecccb7c05ec9f4
    sha384加密结果: e91cdf0d2570de5c96ee84e8a12cddf16508685e7a03b3e811099cfcd54b7f52183e20197cff7c07f312157f0ba4875b
    sha512加密结果: 3f0020a726e9c1cb5d22290c967f3dd1bcecb409a51a8088db520750c876aaec3f17a70d7981cd575ed4b89471f743f3f24a146a39d59f215ae3e208d0170073

    注意:hashlib 加密啊的字符串类型为二进制编码,直接加密字符串会报如下错误:    
    sha1 = hashlib.sha1()
    sha1.update(string)
    res = sha1.hexdigest()
    print("sha1加密结果:",res)
     
    TypeError: Unicode-objects must be encoded before hashing

    可以使用encode进行转换

    shaa1 = hashlib.sha1()
    shaa1.update(string.encode('utf-8'))
    res = shaa1.hexdigest()
    print("sha1采用encode转换加密结果:",res)

    或者使用byte转换为二进制    
    shab1 = hashlib.sha1()
    shab1.update(bytes(string,encoding='utf-8'))
    res = shab1.hexdigest()
    print("sha1采用byte转换的结果:",res)

    以上输出:    
    sha1采用encode转换加密结果: 458d32be8ea38b66300174970ab0a8c0b734252f
    sha1采用byte转换的结果: 458d32be8ea38b66300174970ab0a8c0b734252f
    常用方法
    hash.update(arg) 更新哈希对象以字符串参数, 注意:如果同一个hash对象重复调用该方法,则m.update(a); m.update(b) 等效于 m.update(a b),看下面例子    
    m = hashlib.md5()
    m.update('a'.encode('utf-8'))
    res = m.hexdigest()
    print("第一次a加密:",res)
    m.update('b'.encode('utf-8'))
    res = m.hexdigest()
    print("第二次b加密:",res)
     
    m1 = hashlib.md5()
    m1.update('b'.encode('utf-8'))
    res = m1.hexdigest()
    print("b单独加密:",res)
    m2 = hashlib.md5()
    m2.update('ab'.encode('utf-8'))
    res = m2.hexdigest()
    print("ab单独加密:",res)
     
    输出结果:
    第一次a加密: 0cc175b9c0f1b6a831c399e269772661
    第二次b加密: 187ef4436122d1cc2f40dc2b92f0eba0
    b单独加密: 92eb5ffee6ae2fec3ad71c777531578f
    ab单独加密: 187ef4436122d1cc2f40dc2b92f0eba0

    hash.digest() 返回摘要,作为二进制数据字符串值,

    hash.hexdigest() 返回摘要,作为十六进制数据字符串值,

    hash.copy() 复制

    高级加密
    以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。    
    low = hashlib.md5()
    low.update('ab'.encode('utf-8'))
    res = low.hexdigest()
    print("普通加密:",res)
    high = hashlib.md5(b'beyondjie')
    high.update('ab'.encode('utf-8'))
    res = high.hexdigest()
    print("采用key加密:",res)
    输出结果:
    普通加密: 187ef4436122d1cc2f40dc2b92f0eba0
    采用key加密: 1b073f6b8cffe609751e4c98537b7653

    附加HMAC-SHA1各语言版本实现

    在各大开放平台大行其道的互联网开发潮流中,调用各平台的API接口过程中,无一例外都会用到计算签名值(sig值)。而在各种计算签名的方法中,经常被采用的就是HMAC-SHA1,现对HMAC-SHA1做一个简单的介绍:

            HMAC,散列消息鉴别码,基于密钥的Hash算法认证协议。实现原理为:利用已经公开的Hash函数和私有的密钥,来生成固定长度的消息鉴别码;

           SHA1、MD5等Hash算法是比较常用的不可逆Hash签名计算方法;

           BASE64,将任意序列的8字节字符转换为人眼无法直接识别的符号编码的一种方法;

           各个语言版本的实现为:

           Python版:    
    import hmac
    import hashlib
    import base64
    hmac.new(Token,data,hashlib.sha1).digest().encode('base64').rstrip()

    Token:即接口的key

    data:要加密的数据

           PHP版:    
    base64_encode(hash_hmac("SHA1",clientStr,Token , true))

              C 版(Openssl):
        
    HMAC( EVP_sha1(),
      strKey.data(),
      strKey.size(),
      (unsigned char*) strRandom.data(),
      strRandom.size(), digest, &digest_len))

           Shell版:    
    echo -n '3f88a95c532bea70' | openssl dgst -hmac '123' -sha1 -binary | base64
    总结
    以上就是本文关于python中hashlib模块用法示例的全部内容,希望对大家有所帮助。

  • 相关阅读:
    MySQL-基本sql命令
    Java for LeetCode 203 Remove Linked List Elements
    Java for LeetCode 202 Happy Number
    Java for LeetCode 201 Bitwise AND of Numbers Range
    Java for LeetCode 200 Number of Islands
    Java for LeetCode 199 Binary Tree Right Side View
    Java for LeetCode 198 House Robber
    Java for LeetCode 191 Number of 1 Bits
    Java for LeetCode 190 Reverse Bits
    Java for LeetCode 189 Rotate Array
  • 原文地址:https://www.cnblogs.com/amengduo/p/9586341.html
Copyright © 2011-2022 走看看