zoukankan      html  css  js  c++  java
  • python hashlib模块 md5加密 sha256加密 sha1加密 sha512加密 sha384加密 MD5加盐

    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(),
    
                       /*key data*/ strKey.data(),
                       /*key len*/  strKey.size(),
                       /*data  */(unsigned char*) strRandom.data(),
                       /*data len*/ strRandom.size(), digest, &digest_len))
           Shell版:
                  echo -n '3f88a95c532bea70' | openssl dgst -hmac '123' -sha1 -binary | base64
    复制代码
  • 相关阅读:
    107. Binary Tree Level Order Traversal II
    103. Binary Tree Zigzag Level Order Traversal
    102. Binary Tree Level Order Traversal
    690. Employee Importance
    1723. Find Minimum Time to Finish All Jobs
    LeetCode 329 矩阵中最长增长路径
    7.2 物理内存管理
    LeetCode 面试题 特定深度节点链表
    LeetCode 100 相同的树
    npm安装包命令详解,dependencies与devDependencies实际区别
  • 原文地址:https://www.cnblogs.com/16795079a/p/10758920.html
Copyright © 2011-2022 走看看