前言

hashlib模块是py3.+用来对字符串进行hash加密的模块,核心算法是md5,明文与密文是一一对应不变的关系;用于注册、登录时用户名、密码等加密使用。

模块分析

hashlib模块有多种加密算法如:'md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512','blake2b', 'blake2s','sha3_224', 'sha3_256', 'sha3_384', 'sha3_512','shake_128', 'shake_256'等;

所有的算法是基于二进制加密的,所以对需要加密的字符串需要先进行编码。

hashlib.algorithms_guaranteed:查看所有平台都支持的hash算法;
hashlib.algorithms_available:查看所有的hash加密算法。

主要函数

hashlib.hexdigest():获取加密的密文,十六进制字符串,无参数。
hashlib.digest():获取加密的密文,二进制,无参数。
hashlib.copy():复制一份当前创建的hash对象,无参数。
update(str1.encode("utf-8")):添加新的加密密文,得到的密文与原来的密文不相同。 # 创建一个加密对象
m = hashlib.new("md5",b"cai") # 选择md5加密函数加密字符串“cai”
m.name:查看当前获得的hash对象的加密算法;
m.digest_size:hash密文占多少个字节;
m.block_size:hash数据块的大小。
  • 创建哈希对象
import hashlib
m = hashlib.new("md5", b"cai") # 使用new的方式创建
m = hashlib.md5("cai".encode()) # 直接指定加密算法
m = hashlib.sha1("cai".encode())
m = hashlib.sha224("cai".encode())
m = hashlib.sha3_256("cai".encode())
m = hashlib.sha3_384("cai".encode())
  • 多次加密

当需要加密的字符串过大的时候,可以使用同一个hash对象分多次加密,update(a)+update(b)=update(a+b).

import hashlib as hb
m = hb.md5()
m1 = m.copy()
string = "adbcefg"
for s in string:
m.update(s.encode("utf-8"))
# 输出密文1
print(m.hexdigest()) # 26db8a4092166f88b63d8bafd34ce4b1
# 输出与密文1完全相同的密文2
m1.update(string.encode("utf-8"))
print(m1.hexdigest()) # 26db8a4092166f88b63d8bafd34ce4b1

hash算法的解密

加密算法得到的密文不可逆,但是密文与明文之间的关系是一一对应的,这就使得解密出现了可能,目前对于简单的、迭代次数少或不加盐处理密文,常用方法是用大数据储存密文与明文的对应关系。如常用的解密网站:http://www.cmd5.com/

通过输入密文查找对应的明文。为了增大破解的难度,一般需要对密码进行多次迭代加密和加盐处理,hashlib模块有一个专门的函数pbkdf2_hmac。

  • pbkdf2_hmac
# 参数
hash_name:签名算法名;
password:需要加密的二进制编码
salt:加盐
iterations:迭代次数 import hashlib as hb
import binascii
import base64
pwd = "fdskhfkshfks"
salt = "hhhhhhhh"
# 获取加密后的二进制数
dk = hb.pbkdf2_hmac('sha256', pwd.encode("utf-8"), salt.encode("utf-8"), 10000) # 密码和杂质都需要是二进制类型
print(dk) # b'\x13O\xd5jj\x92\xfd\xf9\xef\xaa>W[c\x06\xe0\x96D=&\x02R\xd683\xee8\x11\xfbX\xb6\xf6'
# 转换成十六进制对应的字符串
print(binascii.hexlify(dk).decode("utf-8")) # 134fd56a6a92fdf9efaa3e575b6306e096443d260252d63833ee3811fb58b6f6
# 转换成base64为编码的字符串
print(base64.b64encode(dk).decode()) # E0/VamqS/fnvqj5XW2MG4JZEPSYCUtY4M+44EftYtvY=

应用实例

import hashlib as hb
import base64
def hash_fun(str1):
m = hb.md5(str1.encode("utf-8")) # 创建一个hash对象,并对str1加密
# 输出得到的密文
print(m.hexdigest())
# base64编码的密文
print(base64.b64encode(m.digest()).decode())
print(m.block_size) # 获取hash块的大小
print(m.digest_size) # 获取密文的字节数
print(m.name) # 获取加密算法的名字md5 def hash_fun2(str1):
m = hb.md5(str1.encode("utf-8"))
print(m.hexdigest())
a = m.copy() # 拷贝一个hash对象
print(a.hexdigest()) # 得到的密文没改变 hash_fun("sb")

总结

  • 我们一般通过new或pbkdf2_hmac函数加密字符串;

  • 加密的密文涉及到显示使用十六进制对应的字符串或base64编码的字符串

参考

python模块分析之hashlib加密(二)的更多相关文章

  1. 【转】python模块分析之hashlib加密(二)

    [转]python模块分析之hashlib加密(二) hashlib模块是用来对字符串进行hash加密的模块,明文与密文是一一对应不变的关系:用于注册.登录时用户名.密码等加密使用.一.函数分析:1. ...

  2. 【转】python模块分析之collections(六)

    [转]python模块分析之collections(六) collections是Python内建的一个集合模块,提供了许多有用的集合类. 系列文章 python模块分析之random(一) pyth ...

  3. 【转】python模块分析之unittest测试(五)

    [转]python模块分析之unittest测试(五) 系列文章 python模块分析之random(一) python模块分析之hashlib加密(二) python模块分析之typing(三) p ...

  4. 【转】python模块分析之typing(三)

    [转]python模块分析之typing(三) 前言:很多人在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数,返回什么类型的结果,就不得不去阅读代码的具体内容,降低了阅读的速度 ...

  5. 【转】python模块分析之logging日志(四)

    [转]python模块分析之logging日志(四) python的logging模块是用来写日志的,是python的标准模块. 系列文章 python模块分析之random(一) python模块分 ...

  6. python模块分析之typing(三)

    前言:很多人在写完代码一段时间后回过头看代码,很可能忘记了自己写的函数需要传什么参数,返回什么类型的结果,就不得不去阅读代码的具体内容,降低了阅读的速度,加上Python本身就是一门弱类型的语言,这种 ...

  7. python模块分析之logging日志(四)

    前言 python的logging模块是用来设置日志的,是python的标准模块. 系列文章 python模块分析之random(一) python模块分析之hashlib加密(二) python模块 ...

  8. python模块详解 hashlib

    hashlib模块 用于加密相关的操作,在python3中替代了md5和sha模块,主要提供SHA和MD5算法. MD5 import hashlib m = hashlib.md5() #调用md5 ...

  9. python模块学习之hashlib模块学习

    # 加密模块 import hashlib # md5 加密 md5 # 1.初始化md5模块 生成md5对象 # 2.引入要加密的数据 update # 3.获取加密值 hexdigest m = ...

随机推荐

  1. 《Linux内核分析》 第四节 扒开系统调用的三层皮(上)

    <Linux内核分析> 第四节 扒开系统调用的三层皮(上) 张嘉琪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com ...

  2. C语言版本:循环单链表的实现

    SClist.h #ifndef __SCLIST_H__ #define __SCLIST_H__ #include<cstdio> #include<malloc.h> # ...

  3. Linux命令常用

    数据库:查看日志 vim /var/log/mysqld.log

  4. 蜗牛慢慢爬 LeetCode 25. Reverse Nodes in k-Group [Difficulty: Hard]

    题目 Given a linked list, reverse the nodes of a linked list k at a time and return its modified list. ...

  5. 第十一周PSP&进度条

    PSP 一.表格: D日期     C类型 C内容 S开始时间 E结束时间 I时间间隔 T净时间(mins) 预计花费时间(mins) 11月24号 站立会议 分配任务&设计final方案 1 ...

  6. Linux搭建好apache后,只有本地能访问,局域或外网不能访问

    由于防火墙的访问控制导致本地端口不能被访问. 解决方法: 1,直接关闭防火墙  systemctl stop firewalld.service #停止防火墙服务 systemctl disable ...

  7. Linux命令(十二) 分割文件 split 合并文件 join

    一.分割文件 split 命令介绍 当处理文件时,有时需要将文件做分割处理,split 命令用于分割文件,可以分割文本文件,按指定的行数分割,每个分割后的文件都包含相同的行数.split 可以分割非文 ...

  8. final 发布 领跑衫获奖感想

    时间 :2016年5月20日 13:30--14:00 final发布中,我们团队严一格演示了最终版本的四则运算项目, 修正了beta版本发布时弹幕部分无法消除的bug,总体效果达到预期. 遗憾的是没 ...

  9. Python的数据结构

    目录 Python内置的数据结构 序列Sequence 映射Mapping 集合Sets Python内置的数据结构 Python语言简洁明了,可以用较少的代码实现同样的功能.这其中Python内置的 ...

  10. 移动的调试工具vConsole

    在PC端写代码调试的时候,直接console.log()即可,但是在手机端怎么调试??最近发现一个很有用的插件vConsole 首先引入插件: 然后再文件中使用即可: 这样再手机中就会出现下面的标识, ...