Python 常用模块 - 摘要算法(hashlib)
作者: 尹正杰
一. MD5 算法参数详解
1. 十六进制 md5 算法摘要
- #!/usr/bin/env python
- #_*_coding:utf-8_*_
- #@author :yinzhengjie
- #blog:http://www.cnblogs.com/yinzhengjie/tag/python自动化运维之路/
- #EMAIL:y1053419035@qq.com
- import hashlib
- m = hashlib.md5()
- m.update(b"hello") #字节格式输入
- print(m.hexdigest()) #用十六进制输出一段 md5 值, 注意, 只要输入的值不变, 这个值就不会变的!
- m.update(b"my name is yinzhengjie")
- print(m.hexdigest())
- m2 = hashlib.md5()
- m2.update(b"hello my name is yinzhengjie") #注意, 将上面两个字段拼接起来, 其中的 MD5 值也是会发生变化的
- print(m2.hexdigest())
扩展:
MD5 值是无法被反解的, 网上有人说能破解是骗人的, 之所以能破解, 是因为他们已经将算好的 md5 值存入到数据库中, 然后跟你你输入的 MD5 值给你返回一个明文的字符串
- #以上代码执行结果如下:
- 5d41402abc4b2a76b9719d911017c592
- 1c7bdaafeb36ea7e3236d01afeee39cf
- 1d19d8f2d5037b0f3e9a2d020930ba91
2. 二进制 md5 算法摘要
- #!/usr/bin/env python
- #_*_coding:utf-8_*_
- #@author :yinzhengjie
- #blog:http://www.cnblogs.com/yinzhengjie/tag/python自动化运维之路/
- #EMAIL:y1053419035@qq.com
- import hashlib
- m = hashlib.md5()
- m.update(b"hello") #字节格式输入
- print(m.digest()) #返回摘要, 作为二进制数据字符串值
- m.update(b"my name is yinzhengjie")
- print(m.digest())
- #注意, 将上面两个字段拼接起来, 其中的 MD5 值也是会发生变化的
- m2 = hashlib.md5()
- m2.update(b"hello my name is yinzhengjie")
- print(m2.digest())
扩展:
MD5 值是无法被反解的, 网上有人说能破解是骗人的, 之所以能破解, 是因为他们已经将算好的 md5 值存入到数据库中, 然后跟你你输入的 MD5 值给你返回一个明文的字符串
- #以上代码执行结果如下:
- b]A@*\xbcK*v\xb9q\x9d\x91\x10\x17\xc5\x92
- b\x1c{\xda\xaf\xeb6\xea~26\xd0\x1a\xfe\xee9\xcf
- b\x1d\x19\xd8\xf2\xd5\x03{\x0f>\x9a-\x02\t0\xba\x91
二. sha1 算法参数详解
Google 已经将改算法破解了, 只是还没有公布, 目前很少人用这种算法了!
1. 二进制 sha1 算法摘要
- #!/usr/bin/env python
- #_*_coding:utf-8_*_
- #@author :yinzhengjie
- #blog:http://www.cnblogs.com/yinzhengjie/tag/python自动化运维之路/
- #EMAIL:y1053419035@qq.com
- import hashlib
- m = hashlib.sha1()
- m.update(b"hello") #字节格式输入
- print(m.digest()) #返回摘要, 作为二进制数据字符串值
- m.update(b"my name is yinzhengjie")
- print(m.digest())
- #注意, 将上面两个字段拼接起来, 其中的 MD5 值也是会发生变化的
- m2 = hashlib.md5()
- m2.update(b"hello my name is yinzhengjie")
- print(m2.digest())
扩展:
MD5 值是无法被反解的, 网上有人说能破解是骗人的, 之所以能破解, 是因为他们已经将算好的 md5 值存入到数据库中, 然后跟你你输入的 MD5 值给你返回一个明文的字符串
- #以上代码执行结果如下:
- b\xaa\xf4\xc6\x1d\xdc\xc5\xe8\xa2\xda\xbe\xde\x0f;H,\xd9\xae\xa9CM
- bp\xff\xe5<\x08\xb9D?\xabJ\xcdC2f\x84\xa07\xd6\xc2c
- b\x1d\x19\xd8\xf2\xd5\x03{\x0f>\x9a-\x02\t0\xba\x91
2. 十六进制 sha1 算法摘要
- #!/usr/bin/env python
- #_*_coding:utf-8_*_
- #@author :yinzhengjie
- #blog:http://www.cnblogs.com/yinzhengjie/tag/python自动化运维之路/
- #EMAIL:y1053419035@qq.com
- import hashlib
- m = hashlib.sha1()
- m.update(b"hello") #字节格式输入
- print(m.hexdigest()) #用十六进制输出一段 md5 值, 注意, 只要输入的值不变, 这个值就不会变的!
- m.update(b"my name is yinzhengjie")
- print(m.hexdigest())
- #注意, 将上面两个字段拼接起来, 其中的 MD5 值也是会发生变化的
- m2 = hashlib.sha1()
- m2.update(b"hello my name is yinzhengjie")
- print(m2.hexdigest())
扩展:
MD5 值是无法被反解的, 网上有人说能破解是骗人的, 之所以能破解, 是因为他们已经将算好的 md5 值存入到数据库中, 然后跟你你输入的 MD5 值给你返回一个明文的字符串
- #以上代码执行结果如下:
- aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
- 70ffe53c08b9443fab4acd43326684a037d6c263
- ad068b91291c2099822a36445eb24441125f33a6
三. sha256 算法参数详解
这个是没有被破解的, 连谷歌破解的仅仅是 sha1, 而 256 加密后的明显字节变长了呀, 有木有
1. 二进制 sha512 算法摘要
- #!/usr/bin/env python
- #_*_coding:utf-8_*_
- #@author :yinzhengjie
- #blog:http://www.cnblogs.com/yinzhengjie/tag/python自动化运维之路/
- #EMAIL:y1053419035@qq.com
- import hashlib
- m = hashlib.sha256()
- m.update(b"hello") #字节格式输入
- print(m.digest()) #返回摘要, 作为二进制数据字符串值
- m.update(b"my name is yinzhengjie")
- print(m.digest())
- #注意, 将上面两个字段拼接起来, 其中的 MD5 值也是会发生变化的
- m2 = hashlib.md5()
- m2.update(b"hello my name is yinzhengjie")
- print(m2.digest())
扩展:
MD5 值是无法被反解的, 网上有人说能破解是骗人的, 之所以能破解, 是因为他们已经将算好的 md5 值存入到数据库中, 然后跟你你输入的 MD5 值给你返回一个明文的字符串
- #以上代码执行结果如下:
- b,\xf2M\xba_\xb0\xa3\x0e&\xe8;*\xc5\xb9\xe2\x9e\x1b\x16\x1e\\\x1f\xa7B^s\x043b\x93\x8b\x98$
- b\xec\xf6\x8e\x01\x17\xac!:\xb9<\xe4\xab\xee\x13\x03\xcc\xe4r\xb0\xdc\xfb\xcbm\xd4\xec\xa2\xc9P\x02\xfdi\xb7
- b\x1d\x19\xd8\xf2\xd5\x03{\x0f>\x9a-\x02\t0\xba\x91
2. 十六进制 sha512 算法摘要
- #!/usr/bin/env python
- #_*_coding:utf-8_*_
- #@author :yinzhengjie
- #blog:http://www.cnblogs.com/yinzhengjie/tag/python自动化运维之路/
- #EMAIL:y1053419035@qq.com
- import hashlib
- m = hashlib.sha256()
- m.update(b"hello") #字节格式输入
- print(m.hexdigest()) #用十六进制输出一段 md5 值, 注意, 只要输入的值不变, 这个值就不会变的!
- m.update(b"my name is yinzhengjie")
- print(m.hexdigest())
- #注意, 将上面两个字段拼接起来, 其中的 MD5 值也是会发生变化的
- m2 = hashlib.sha256()
- m2.update(b"hello my name is yinzhengjie")
- print(m2.hexdigest())
- #以上代码执行结果如下:
- 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
- ecf68e0117ac213ab93ce4abee1303cce472b0dcfbcb6dd4eca2c95002fd69b7
- f49de76fe30141f238d0c16234a0bf0188bf9a34b4e8ddb65c508c26d5b1af06
四. sha512 算法参数详解
这个也没有被破解, 明显的效果就是加密后的值变的比 256 还要长呢!
1. 二进制 sha512 算法摘要
- #!/usr/bin/env python
- #_*_coding:utf-8_*_
- #@author :yinzhengjie
- #blog:http://www.cnblogs.com/yinzhengjie/tag/python自动化运维之路/
- #EMAIL:y1053419035@qq.com
- import hashlib
- m = hashlib.sha512()
- m.update(b"hello") #字节格式输入
- print(m.digest()) #返回摘要, 作为二进制数据字符串值
- m.update(b"my name is yinzhengjie")
- print(m.digest())
- #注意, 将上面两个字段拼接起来, 其中的 MD5 值也是会发生变化的
- m2 = hashlib.md5()
- m2.update(b"hello my name is yinzhengjie")
- print(m2.digest())
扩展:
MD5 值是无法被反解的, 网上有人说能破解是骗人的, 之所以能破解, 是因为他们已经将算好的 md5 值存入到数据库中, 然后跟你你输入的 MD5 值给你返回一个明文的字符串
- #以上代码执行结果如下:
- b\x9bq\xd2$\xbdb\xf3x]\x96\xd4j\xd3\xea=s1\x9b\xfb\xc2\x89\x0c\xaa\xda\xe2\xdf\xf7%\x19g<\xa7##\xc3\xd9\x9b\xa5\xc1\x1d|z\xccn\x14\xb8\xc5\xda\x0cFcG\\.\\:\xde\xf4os\xbc\xde\xc0C
- b"7\x8fb\xe6\x11\xcc\xa8I\x9b\x89=\xcf\xac\x06\xdc\xbc\xb7GyG\x96\xd9=\xfc\xa7r\xc6\xba\x9ep\x96\xd7X\x05\x82\xbd\x87\xae\x94\x90UD\xdd\xdf\x94-\xa5\xcd\xf9o\x89\xdc\xcf\x85pr\x9ekvE\x12\xcc\x0f"
- b\x1d\x19\xd8\xf2\xd5\x03{\x0f>\x9a-\x02\t0\xba\x91
2. 十六进制 sha512 算法摘要
- #!/usr/bin/env python
- #_*_coding:utf-8_*_
- #@author :yinzhengjie
- #blog:http://www.cnblogs.com/yinzhengjie/tag/python自动化运维之路/
- #EMAIL:y1053419035@qq.com
- import hashlib
- m = hashlib.sha512()
- m.update(b"hello") #字节格式输入
- print(m.hexdigest()) #用十六进制输出一段 md5 值, 注意, 只要输入的值不变, 这个值就不会变的!
- m.update(b"my name is yinzhengjie")
- print(m.hexdigest())
- #注意, 将上面两个字段拼接起来, 其中的 MD5 值也是会发生变化的
- m2 = hashlib.sha512()
- m2.update(b"hello my name is yinzhengjie")
- print(m2.hexdigest())
- #以上代码执行结果如下:
- 9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043
- 378f62e62711cca8499b893dcfac06dcbcb747794796d93dfca772c6ba9e7096d7580582bd87ae94905544dddf942da5cdf96f89dccf8570729e6b764512cc0f
- ea1bdace33723e839894d77f70ad7d8477b36fd2f45a4d42b6b9637c745da5f75d2ab276f130a82619ebc7e53b9d30926f9ba89176c503d4825ab33bea5b0168
五. hmac 模块
如果你觉得以上的加密方法还是不够安全~ 厉害了, 你的安全感可真低啊, 看来是伤的不轻, 一定是一个有故事的人, 不过针对你这种人呢~ 还有一种算法为你特别定制 hmac, 等你成为了一个开发大神, 你可以自己写一个算法, 因为你毕竟只相信你自己嘛, 哈哈~
散列消息鉴别码, 简称 HMAC, 是一种基于消息鉴别码 MAC(Message Authentication Code)的鉴别机制使用 HMAC 时, 消息通讯的双方, 通过验证消息中加入的鉴别密钥 K 来鉴别消息的真伪; 一般用于网络通信中消息加密, 前提是双方先要约定好 key, 就像接头暗号一样, 然后消息发送把用 key 把消息加密, 接收方用 key + 消息明文再加密, 拿加密后的值 跟 发送者的相对比是否相等, 这样就能验证消息的真实性以及发送者的合法性了(它内部对我们创建 key 和 内容 再进行处理然后再加密)
- #!/usr/bin/env python
- #_*_coding:utf-8_*_
- #@author :yinzhengjie
- #blog:http://www.cnblogs.com/yinzhengjie/tag/python自动化运维之路/
- #EMAIL:y1053419035@qq.com
- import hmac
- h = hmac.new("我本有心向明月".encode("utf-8"), "奈何明月照沟渠".encode("utf-8"),) #"我本有心向明月" 这就好比双方 (A,B) 已经约定好了的 key,(类似于我们第一次登录 linux 服务器, 使用 ssh 登陆方式都会提示你, 让你输入 "yes" 后才能输入密码), 接受者 (A) 接收到了 "奈何明月照沟渠" 这个明文消息和加密后的字符 489f9932949514ab24894559150088c0, 然后用定义好的 key 和去加密 "奈何明月照沟渠" 这个明文字符, 如果加密后生成的字符是 489f9932949514ab24894559150088c0 就证明这个消息是发送者 (B) 发送过来的数据, 它只能验证消息的合法来源如果中间人截获了明文消息加以修改的, 就会被发现!
- print(h.hexdigest())
- #以上代码执行结果如下:
- 489f9932949514ab24894559150088c0
来源: http://www.bubuko.com/infodetail-2516958.html