专栏首页Python疯子python hashlib模块

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

学习提高自己,能力证明自己,技能创造价值

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • iOS加密方式:RSA DES MD5

    DES:对称加密(服务器和客户端公用同一个秘钥),缺点:一旦被抓包破解了秘钥,就能破解所有的传递信息

    Python疯子
  • Python:TTS语音合成技术,市场各大平台对比以及实现

    前景提要:在线的实时合成TTS技术,巴拉巴拉... 此处省略3千字 市场的TTS平台:讯飞语音,百度智能语音开放平台,阿里云,腾讯云,思必驰,捷通华声(灵云)...

    Python疯子
  • iOS CGImageCreateWithImageInRect将若干规则小图片组成的大图片剪切

    在开发中,有时设计师会给我们一个大图片(有若干规则小图片组成),让我们做分开处理并使用 至于为什么要给我们大图片: 001、省空间,一张大图片肯定比若干小图...

    Python疯子
  • 微信小程序-登录+支付(后台Java)Demo实战(环境搭建+源码)

    介绍一个可运行的微信小程序登录+支付的demo。接触了小程序简易教程的,想必都知道我们必然有自己的后台应用服务器,来处理我们自己的业务逻辑、请求微信服务完成一定...

    好好学java
  • DC间网络需求复杂,你该怎么办?

    港湾人儿
  • Spring Security技术栈开发企业级认证与授权(六)使用REST方式处理文件服务

    从浏览器访问http://localhost:8080/file/152445566433就可以将之前模拟上传的文件下载下来,其中链接后面的数字是文件的上传后的...

    itlemon
  • 原 HDOJ 1002 A + B Pro

    不高不富不帅的陈政_
  • 2017年ERP系统华山论剑 谁将入围10强榜?

    T客汇官网:tikehui 撰文 | 卿云 Panorama推出了2017年度十大ERP系统排名报告。根据市场份额,实施成本,实施持续时间,效益实现和软件功能制...

    人称T客
  • 三维重建方法

    最近在看三维重建方面的论文,进行一下知识总结。 三维重建技术 三维重建技术就是要在计算机中真实地重建出该物体表面的三维虚拟模型,构建一个物体完整的三维模型,大致...

    武培轩
  • MD5 in JAVA

    using Apache Commons 需要引入org.apache.commons.codec.digest.DigestUtils这个包,pom.xml文...

    千往

扫码关注云+社区

领取腾讯云代金券