python标准库介绍——28 md5 模块详解
==md5 模块== ``md5`` (Message-Digest Algorithm 5)模块用于计算信息密文(信息摘要). ``md5`` 算法计算一个强壮的128位密文. 这意味着如果两个字符串是不同的,
那么有极高可能它们的 ``md5`` 也不同. 也就是说, 给定一个 ``md5`` 密文,
那么几乎没有可能再找到另个字符串的密文与此相同. [Example 2-35 #eg-2-35]
展示了如何使用 ``md5`` 模块. ====Example 2-35. 使用 md5 模块====[eg-2-35] ```
File: md5-example-1.py import md5 hash = md5.new()
hash.update("spam, spam, and eggs") print repr(hash.digest()) *B* 'L\005J\243\266\355\243u`\305r\203\267\020F\303'*b*
``` 注意这里的校验和是一个二进制字符串. [Example 2-36 #eg-2-36] 展示了如何获得一个十六进制或
base64 编码的字符串. ====Example 2-36. 使用 md5 模块获得十六进制或 base64 编码的 md5 值====[eg-2-36] ```
File: md5-example-2.py import md5
import string
import base64 hash = md5.new()
hash.update("spam, spam, and eggs") value = hash.digest()
print hash.hexdigest()
# before 2.0, the above can be written as
# 在 2.0 前, 以上应该写做:
# print string.join(map(lambda v: "%02x" % ord(v), value), "") print base64.encodestring(value) *B*4c054aa3b6eda37560c57283b71046c3
TAVKo7bto3VgxXKDtxBGww==*b*
``` [Example 2-37 #eg-2-37] 展示了如何使用 ``md5``
校验和来处理口令的发送与应答的验证(不过我们将稍候讨论这里使用随机数字所带来的问题). ====Example 2-37. 使用 md5 模块来处理口令的发送与应答的验证====[eg-2-37] ```
File: md5-example-3.py import md5
import string, random def getchallenge():
# generate a 16-byte long random string. (note that the built-
# in pseudo-random generator uses a 24-bit seed, so this is not
# as good as it may seem...)
# 生成一个 16 字节长的随机字符串. 注意内建的伪随机生成器
# 使用的是 24 位的种子(seed), 所以这里这样用并不好..
challenge = map(lambda i: chr(random.randint(0, 255)), range(16))
return string.join(challenge, "") def getresponse(password, challenge):
# calculate combined digest for password and challenge
# 计算密码和质询(challenge)的联合密文
m = md5.new()
m.update(password)
m.update(challenge)
return m.digest() #
# server/client communication
# 服务器/客户端通讯 # 1. client connects. server issues challenge.
# 1. 客户端连接, 服务器发布质询(challenge) print "client:", "connect" challenge = getchallenge() print "server:", repr(challenge) # 2. client combines password and challenge, and calculates
# the response.
# 2. 客户端计算密码和质询(challenge)的组合后的密文 client_response = getresponse("trustno1", challenge) print "client:", repr(client_response) # 3. server does the same, and compares the result with the
# client response. the result is a safe login in which the
# password is never sent across the communication channel.
# 3. 服务器做同样的事, 然后比较结果与客户端的返回,
# 判断是否允许用户登陆. 这样做密码没有在通讯中明文传输. server_response = getresponse("trustno1", challenge) if server_response == client_response:
print "server:", "login ok" *B*client: connect
server: '\334\352\227Z#\272\273\212KG\330\265\032>\311o'
client: "l'\305\240-x\245\237\035\225A\254\233\337\225\001"
server: login ok*b*
``` [Example 2-38 #eg-2-38] 提供了 ``md5``
的一个变种, 你可以通过标记信息来判断它是否在网络传输过程中被修改(丢失). ====Example 2-38. 使用 md5 模块检查数据完整性====[eg-2-38] ```
File: md5-example-4.py import md5
import array class HMAC_MD5:
# keyed md5 message authentication def _ _init_ _(self, key):
if len(key) > 64:
key = md5.new(key).digest()
ipad = array.array("B", [0x36] * 64)
opad = array.array("B", [0x5C] * 64)
for i in range(len(key)):
ipad[i] = ipad[i] ^ ord(key[i])
opad[i] = opad[i] ^ ord(key[i])
self.ipad = md5.md5(ipad.tostring())
self.opad = md5.md5(opad.tostring()) def digest(self, data):
ipad = self.ipad.copy()
opad = self.opad.copy()
ipad.update(data)
opad.update(ipad.digest())
return opad.digest() #
# simulate server end
# 模拟服务器端 key = "this should be a well-kept secret"
message = open("samples/sample.txt").read() signature = HMAC_MD5(key).digest(message) # (send message and signature across a public network)
# (经过由网络发送信息和签名) #
# simulate client end
#模拟客户端 key = "this should be a well-kept secret" client_signature = HMAC_MD5(key).digest(message) if client_signature == signature:
print "this is the original message:"
print message
else:
print "someone has modified the message!!!"
``` ``copy`` 方法会对这个内部对象状态做一个快照( snapshot ).
这允许你预先计算部分密文摘要(例如 [Example 2-38 #eg-2-38] 中的 padded key). 该算法的细节请参阅
//HMAC-MD5:Keyed-MD5 for Message Authentication//
( http://www.research.ibm.com/security/draft-ietf-ipsec-hmac-md5-00.txt ) by Krawczyk, 或其他. *Note*千万别忘记内建的伪随机生成器对于加密操作而言并不合适. 千万小心. *note*
python标准库介绍——28 md5 模块详解的更多相关文章
- python标准库介绍——28 sha 模块详解
==sha 模块== ``sha`` 模块提供了计算信息摘要(密文)的另种方法, 如 [Example 2-39 #eg-2-39] 所示. 它与 ``md5`` 模块类似, 但生成的是 160 位签 ...
- python标准库介绍——27 random 模块详解
==random 模块== "Anyone who considers arithmetical methods of producing random digits is, of cour ...
- python标准库介绍——12 time 模块详解
==time 模块== ``time`` 模块提供了一些处理日期和一天内时间的函数. 它是建立在 C 运行时库的简单封装. 给定的日期和时间可以被表示为浮点型(从参考时间, 通常是 1970.1.1 ...
- python标准库介绍——10 sys 模块详解
==sys 模块== ``sys`` 模块提供了许多函数和变量来处理 Python 运行时环境的不同部分. === 处理命令行参数=== 在解释器启动后, ``argv`` 列表包含了传递给脚本的所有 ...
- python标准库介绍——30 code 模块详解
==code 模块== ``code`` 模块提供了一些用于模拟标准交互解释器行为的函数. ``compile_command`` 与内建 ``compile`` 函数行为相似, 但它会通过测试来保证 ...
- python标准库介绍——18 StringIO 模块详解
==StringIO 模块== [Example 2-8 #eg-2-8] 展示了 ``StringIO`` 模块的使用. 它实现了一个工作在内存的文件对象 (内存文件). 在大多需要标准文件对象的地 ...
- python标准库介绍——8 operator 模块详解
==operator 模块== ``operator`` 模块为 Python 提供了一个 "功能性" 的标准操作符接口. 当使用 ``map`` 以及 ``filter`` 一类 ...
- python标准库介绍——36 popen2 模块详解
==popen2 模块== ``popen2`` 模块允许你执行外部命令, 并通过流来分别访问它的 ``stdin`` 和 ``stdout`` ( 可能还有 ``stderr`` ). 在 pyth ...
- python标准库介绍——23 UserString 模块详解
==UserString 模块== (2.0 新增) ``UserString`` 模块包含两个类, //UserString// 和 //MutableString// . 前者是对标准字符串类型的 ...
随机推荐
- eclipse全屏模式
- Cognos两种建模工具对于复杂日期维度的处理比较(上)
众所周知,在数据仓库中,日期维度是相当重要的.对数据分析的过程中可以从不同的角度去分析,比如按照下面的日期层次去分析数据. 年-季度-月-日 年-月-日 年-周-日 本示例将利用简单的商品销售分析的d ...
- MySQL 动态sql语句运行 用时间做表名
1. 描写叙述 在使用数据的时候,我时候我们须要非常多数据库,并且想用时间来做表名以区分.可是MySQL在存储过程中不支持使用变量名来做表名或者列名. 比方,有一个表我们想以"2015-07 ...
- Angular路由与Nodejs路由的区别
转自:http://www.imooc.com/qadetail/114683?t=148182 觉得angualr.js的路由是针对于单页面的路由,每次路由发生变化,只是页面的状态发生变化,页面本身 ...
- 配置Tomcat和JDK
第一步:下载jdk和tomcat 第二步:安装和配置你的j2sdk和tomcat:执行j2sdk和tomcat的安装程序,然后按默认设置进行安装即可. 1.安装j2sdk以后,需要配置一下环境变量,在 ...
- 优化iOS程序性能的25个方法
1. 用ARC管理内存 ARC(Automatic ReferenceCounting, 自己主动引用计数)和iOS5一起公布.它避免了最常见的也就是常常是因为我们忘记释放内存所造成的内存泄露.它自己 ...
- JAVA虚拟机内存架构
Java在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途.创建和销毁的时间,有一些是随虚拟机的启动而创建,随虚拟机的退出而销毁,有些则是与线程一一对应,随 ...
- HTTP所承载的货物(图像、文本、软件等)要满足的条件
HTTP所承载的货物(图像.文本.软件等)要满足的条件: •可以被正确识别 通过Content-Type 首部说明媒体格式,Content-Language 说明语言,以便浏览器和其他客户端能正确处理 ...
- API密钥
什么是API密钥? 答:在api调用时,用来按照指定规则对您的请求参数进行签名,服务器收到你的请求时会进行签名验证,即可以界定你的身份也可以防止其他人通过某种手段恶意篡改你的请求数据. 密钥的使用? ...
- 获取List对象的泛型类(原创)
群里一个伙计的需求,最后我提出了这种解决方案,不过他觉得多写俩括号增加了调用方的难度.还是先记下来吧,有时间看看还能不能再改造. 1.直接获取时获取不到的,类型被虚拟机擦除了2.利用子类实现父类的 ...