# -*- coding: utf-8 -*-
"""
学习hashlib库
哈希是指通过一个函数,把任意长度的数据转换为一个长度固定的数据串
(通常用16进制的字符串表示)
Python的hashlib提供了常见的哈希算法(摘要算法)
其中所包括的算法有 md5, sha1, sha224, sha256, sha384, sha512.等等。
每种算法的工作流程类似:
1. 构造一个对应算法的对象,例如h = hashlib.md5()
另外,模块中所定义的 new(name, string=”) 方法也可通过
指定系统所支持的hash算法来构造相应的hash对象.
2. 将要hash的内容传入h.update中,注意要传入的必须是bytes而非str
但是仅仅进行md5(或其他算法的加密)仍然不够安全
假如一个黑客已经拿到了存储MD5口令的数据库,他还是可以通过MD5反推用户的明文口令
可以考虑这么个情况,很多用户喜欢用123456,888888,password这些简单的口令
于是,黑客可以事先计算出这些常用口令的MD5值,得到一个反推表。
这样,无需破解,只需要对比数据库的MD5,黑客就获得了使用常用口令的用户账号。
由于常用口令的MD5值很容易被计算出来,所以要确保存储的用户口令不是那些已经被计算出来的常用口令的MD5
这一方法通过对原始口令加一个复杂字符串来实现,俗称“加盐”:
saltMd5 = mdt(s + [某个复杂字符串key])
"""
import hashlib
def md5(s):
# 下面两种方式等价
# md5Hash = hashlib.new('md5')
md5Hash = hashlib.md5()
# 使用update来进行加密,参数必须是byte,所以要先encode一下
md5Hash.update(s.encode('utf-8'))
# 注意,如果同一个hash对象重复调用该方法
# 即m.update(a); m.update(b) == m.update(a+b)
h1, h2 = hashlib.md5(), hashlib.new('md5')
h1.update(b'aa')
h1.update(b'bb')
h2.update(b'aabb')
print(h1.digest() == h2.digest())
# 获取哈希值,区别在于一个用16进制的str表示,一个用byte表示
hexDigest = md5Hash.hexdigest()
digest = md5Hash.digest()
# 生成的哈希的大小(以字节为单位)
print(md5Hash.digest_size)
# 散列算法的内部块大小(以字节为单位)
print(md5Hash.block_size)
print(type(hexDigest), hexDigest)
print(type(digest), digest)
# 使用copy可以拷贝对象
h = md5Hash.copy()
print(h.hexdigest())
def salt(s, key):
h = hashlib.md5(key.encode('utf-8'))
h.update(s.encode('utf-8'))
print(h.hexdigest())
def main():
query = '霜用英文说是frost'
# 基本用法,以md5算法为例
md5(query)
salt(query, 'key')
if __name__ == '__main__':
main()
输出:
True
16
64
<class 'str'> 7091b836391b4e3e1ebf5a829839c2f9
<class 'bytes'> b'p\x91\xb869\x1bN>\x1e\xbfZ\x82\x989\xc2\xf9'
7091b836391b4e3e1ebf5a829839c2f9
ed228a5ad6343bd3dbf609cd1fb21f53