hashlib模块 md5 sha1

Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等
它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)

对于同一个字符串,不管这个字符串有多长,只要是相同的,
无论在任何环境下,多少次执行,在任何语言中
使用相同的算法\相同的手段得到的结果永远是相同的
只要不是相同的字符串,得到的结果一定不同

md5算法,32位的字符串,每个字符都是一个十六进制
md5算法 效率快 算法相对简单   需要进行加盐操作

 

用法  :

1.先创建一个对象

2.对象.update('字符串'.encode=('utf-8'))

3.print(对象.hexdigest())

 

 

s1 = 'ben'  # 7fe4771c008a22eb763df47d19e2c6aa
s2 = 'abc123'  # c203eb9f0cdbe64ec22e214b759b7ba3

md5_obj = hashlib.md5()  # 1.先创建一个对象
md5_obj.update(s1.encode('utf-8'))  # 2. update(对象.编码格式)
res = md5_obj.hexdigest()  # 3. 给一个变量接收 对象.hexdigest()
print(res, len(res), type(res))  # 得到md5值

md5_obj.update(s2.encode('utf-8'))
res2 = md5_obj.hexdigest()
print(res2, len(res2), type(res2))

 

 

小小的输入生成md5的程序

def md5(name):
    name_obj = hashlib.md5()
    name_obj.update(name.encode('utf-8'))
    ret = name_obj.hexdigest()

    return ret


name = input('请输入你的名字>>>')
my_md5 = md5(name)
print(my_md5)

 

加盐

可能会撞库,所以必须进行加盐

def md5(name):
    name_obj = hashlib.md5()
    name_obj.update((name + name).encode('utf-8'))  # 可以给想加密的东西再加上别的字符
    ret = name_obj.hexdigest()

    return ret


name = input('请输入你的名字>>>')
my_md5 = md5(name)
print(my_md5)

 动态加盐

 

username = input('username : ')
passwd = input('password : ')
md5obj = hashlib.md5(username.encode('utf-8'))
md5obj.update(passwd.encode('utf-8'))
print(md5obj.hexdigest())

 

 

文件的一致性校验 利用md5值是否相同来判断

 

md5_obj = hashlib.md5()
with open('5.序列化模块_shelve.py', 'rb') as f:
    md5_obj.update(f.read())
    ret1 = md5_obj.hexdigest()

md5_obj = hashlib.md5()
with open('5.序列化模块_shelve.py.bak', 'rb') as f:
    md5_obj.update(f.read())
    ret2 = md5_obj.hexdigest()
print(ret1, ret2)

 

 

弱文件太大, 内存读不下, 可以:
按行读: 文本, 视频, 音乐, 图片, bytes
按字节读: 10240 = 1M

 

md5 = hashlib.md5()
md5.update('hello,world,wow'.encode('utf-8'))
ret = md5.hexdigest()
print(ret)  # f733a03f0f1caac0b7ac905f25bf4fd2

md5 = hashlib.md5()
md5.update('hello,'.encode('utf-8'))
md5.update('world,'.encode('utf-8'))
md5.update('wow'.encode('utf-8'))
ret = md5.hexdigest()
print(ret)

 

 

大文件的已执行校验 

循环的读取文件内容

循环的来update

md5_obj = hashlib.md5()

with open('file', 'rb') as f:
    md5_obj.update(f.read())
    # 循环的读取文件内容
    # 循环的来update
print(md5_obj.hexdigest())

 

sha1也是一个算法, 40位的字符串, 每个字符都是一个十六进制 算法相对复杂 计算速度也慢 用的人少,所以会比md5更安全一点 和md5用法一样

sha_obj = hashlib.sha1()
sha_obj.update(s1.encode('utf-8'))
res = sha_obj.hexdigest()
print(res, len(res), type(res))

 

 

 

小练习

# 写成一个函数
# 参数 : 文件1的路径,文件2的路径,默认参数 = 1024000
# 计算这两个文件的md5值
# 返回它们的一致性结果 T/F

 

posted @ 2018-08-09 22:44  Niuli'blog  阅读(962)  评论(0编辑  收藏  举报