用于加密相关的操作,Python 3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法。

加密复杂程度: SHA1   <   SHA224    <   SHA256    <  SHA384   <   SHA512 <  MD5

加密越复杂,意味着消息的时间就越多。

哈希算法:把一个不定长的内容,加密变成一个定长的内容,而且与被加密内容是唯一对应的。

很常见的,我们在网银,淘宝,京东能都有账户密码,用户输入的时候都是明文,密码在传输的过程中,必须是密文,而不能是明文,同时数据库存的时候,必须存为可与明文唯一对应的加密后的值。

三个知识点:

1. 一个字符串可以转换成一段密文,并且不能被反解;

2. 既然不能反解,那只能正解,比如在登录的时候就让他们都变成密文,然后用两个密文进行比较

3. 原生写的MD5,全世界人都知道,所以可以进行加言,该加言只有开发者自己知道。对于需要加密的都是基于这个加言后的MD5进行的,别人也就无法反解了。

import hashlib

obj = hashlib.md5()

obj.update("hello".encode("utf-8"))
print(obj.hexdigest()) # 5d41402abc4b2a76b9719d911017c592

以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。

import hashlib

obj = hashlib.md5("jiayan".encode("utf"))

obj.update("hello".encode("utf-8"))
print(obj.hexdigest()) # 686a12bb5577133d6698131cbf0b4b4a

需要注意的:

先对"A"进行加密,接着在对"B"进行加密,"B"的加密是基于"A"的加密的。相当于"B"的加密对象是"AB"

import hashlib

obj = hashlib.md5("jiayan".encode("utf"))

obj.update("hello".encode("utf-8"))
print(obj.hexdigest()) # 686a12bb5577133d6698131cbf0b4b4a obj.update('world'.encode('utf8'))
print(obj.hexdigest()) # c805eca8aad002e5d44a39d3aec78f8e #上面对于"world"的加密,是基于Hello加密后,对"world"再进行加密的。 验证:
import hashlib obj = hashlib.md5("jiayan".encode("utf")) obj.update('world'.encode('utf8'))
print(obj.hexdigest())
# b278e99dfd536f7844785bbd39288e1a (没有"hello"时)
# c805eca8aad002e5d44a39d3aec78f8e (有"hello"时)
与没有注释"hello"的结果不一致,证明是基于hello加密后再进行加密的。 还可以通过下面的方法验证
import hashlib obj = hashlib.md5("jiayan".encode("utf")) obj.update('helloworld'.encode('utf8'))
print(obj.hexdigest())
# c805eca8aad002e5d44a39d3aec78f8e ("helloworld"连在一起时)
# c805eca8aad002e5d44a39d3aec78f8e (有"hello"时)

hashlib下还有SHA256等:

SHA256等其他加密算法的用法与MD5完全一样,只需要把MD5换成256等即可。

import hashlib

obj = hashlib.sha256("jiayan".encode("utf-8"))
obj.update("hello".encode("utf-8"))
print(obj.hexdigest())
# 24ac0688c0d320346adc8cafd1ba543cf4332ed1e5fdd610edd5f7365b4a862f

第二十五篇 hashlib模块(* *)的更多相关文章

  1. Python之路(第十九篇)hashlib模块

    一.hashlib模块 HASH Hash,一般翻译做“散列”,也有直接音译为”哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值 ...

  2. Python之路【第二十五篇】:数据库之pymysql模块

    数据库进阶 一.pymysql模块 pymysql是Python中操作Mysql的模块,其使用的方法和py2的MySQLdb几乎相同. 二.pymysql模块安装 pip install pymysq ...

  3. Python 学习 第十五篇:模块搜索路径和包导入

    在导入自定义的模块时,除了指定模块名之外,也需要指定目录,由于Python把目录称作包,因此,这类导入被称为包导入.包导入把计算机上的目录变成Python的命名空间,而目录中所包含的子目录和模块文件则 ...

  4. 第二十五篇:在SOUI中做事件分发处理

    不同的SOUI控件可以产生不同的事件.SOUI系统中提供了两种事件处理方式:事件订阅 + 事件处理映射表(参见第八篇:SOUI中控件事件的响应) 事件订阅由于直接将事件及事件处理函数连接,不存在事件分 ...

  5. Python之路(第二十五篇) 面向对象初级:反射、内置方法

    [TOC] 一.反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它 ...

  6. Python之路(第十五篇)sys模块、json模块、pickle模块、shelve模块

    一.sys模块 1.sys.argv 命令行参数List,第一个元素是程序本身路径 2.sys.exit(n) 退出程序,正常退出时exit(0) 3.sys.version . sys.maxint ...

  7. 第二十五篇 -- C++宝典中的图书管理系统

    此篇文章是基于C++宝典写的图书管理系统,本人对其中的部分做了相应修改,并且以现有格式替代原有格式,使程序更加清晰明了.此程序运行在VS2017上. 系统设计 图书管理系统分为四个模块:图书管理模块. ...

  8. flask第二十五篇——控制语句

    有兴趣的请加船长公众号:自动化测试实战 先和大家强调一个发邮件的问题 # coding: utf-8 import smtplib from email.mime.text import MIMETe ...

  9. 第二十五篇:使用 sigaction 函数实现可靠信号

    前言 在前文中,讲述了一个可靠信号的示例.它分成几个步骤组成( 请参考前文 ).在 Linux 系统编程中,有个方法可以将这些步骤给集成起来,让我们使用起来更加的方便. 那就是调用 sigaction ...

随机推荐

  1. css实现单行的靠左靠右和居中效果

    1.父元素    text-align:center 2.子元素 .left{ float:left; } .right{ float:right; } .center{ display:inline ...

  2. 【洛谷P1582】倒水

    倒水 题目链接 显然,2^x个杯子里的水可以倒在一个杯子里 所以我们可以贪心地每次将N中最大的2^x减掉 减k次(若中途已经为0,直接输出0) 若大于0,用最小的比N大的2^x减剩下的N,即为答案 # ...

  3. 理解Storm可靠性消息

    看过一些别人写的, 感觉有些东西没太说清楚,个人主要以源代码跟踪,参考个人理解讲述,有错误请指正. 1基本名词 1.1 Tuple: 消息传递的基本单位.很多文章中介绍都是这么说的, 个人觉得应该更详 ...

  4. ffmpeg 学习

    1.ffmpeg使用语法 命令格式:    ffmpeg -i [输入文件名] [参数选项] -f [格式] [输出文件]    ffmpeg [[options][`-i' input_file]] ...

  5. sudoers文件解析 转自:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1971013

    今天在用户组中新加了一个普通用户,开始这个用户没有sudo权限,于是通过sudo visudo修改了sudo的配置文件,赋予了普通用户的root权限.后来想着能不能将/etc/sudoers文件的访问 ...

  6. Python 学习笔记(八)Python列表(一)

    列表基本操作 列表(list)定义  列表是Python中的一种对象类型,也是一种序列 对象类型:list 表示方法:[ ] python 列表中的元素可以是任何类型的对象 >>> ...

  7. ATK系列库介绍

    1.一个完整支持分布式服务框架: 2.代码生成工具,可快速生成基于服务框架的应用: 3.其他支持库 4.完整代码见https://github.com/azthinker 目标:使应用开发,低代码.高 ...

  8. RPAD()和LPAD()函数进行字符串的填充

    RPAD()函数从右边对字符串使用指定的字符进行填充. 格式:RPAD(string,padded_length,[pad_string]) string 表示:被填充的字符串. padded_len ...

  9. iOS Block界面反向传值小demo

    1.在第二个视图控制器的.h文件中定义声明Block属性: // 定义block @property (nonatomic, copy) void (^NextViewControllerBlock) ...

  10. 关于alert后,才能继续执行后续代码问题

    如果在正常情况下,代码要在alert之后才执行,解决办法:将要执行的代码用setTimeout延迟执行即可(原因:页面未加载完毕) 首先,先说明问题情况: 如下JS代码,不能正常执行,只有在最前面加上 ...