python之hashlib模块

hashlib模块

算法介绍

Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。

什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。

摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过,摘要的过程是不可逆的。

摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。

我们以常见的摘要算法MD5为例,计算出一个字符串的MD5值:

import hashlib
m = hashlib.md5()
m.update('alex3714'.encode('utf-8'))
print(m.hexdigest())
例子

如果数据量很大,可以分块多次调用update(),最后计算的结果是一样的:

import hashlib
m = hashlib.md5()
m.update('alex3714'.encode('utf-8'))
m.update('dazhizi sha'.encode('utf-8'))
m.update('123456'.encode('utf-8'))
print(m.hexdigest())
分块调用

MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。另一种常见的摘要算法是SHA1,调用SHA1和调用MD5完全类似:

import hashlib
 
sha1 = hashlib.sha1()
sha1.update('how to use sha1 in ')
sha1.update('python hashlib?')
print sha1.hexdigest()
sha1

现在简单的密码可以通过暴力破解进行破解,而且有时也存在撞库,这时,我们可以选择加盐的方式,就是在原有的基础上再加入特定的字符进行加密
加盐
import hashlib
m = hashlib.md5('wahaha'.encode('utf-8'))
m.update('123456'.encode('utf-8'))
print(m.hexdigest())                             # d1c59b7f2928f9b1d63898133294ad2c

也可以进行动态加盐,一般动态加盐可以使用在对用户密码的加密

import hashlib
username = 'alex'
m = hashlib.md5(username[:2:2].encode('utf-8'))
m.update('123456'.encode('utf-8'))
print(m.hexdigest())                             # d1c59b7f2928f9b1d63898133294ad2c
动态加盐

利用hashlib的文件校验

import hashlib
def check(filename):
    md5obj = hashlib.md5()
    with open(filename, 'rb') as f:
        content = f.read()
        md5obj.update(content)
    return md5obj.hexdigest()
ret1 = check('happy')
print(ret1)
读取一行
#一段字符串直接进行摘要和分成几段摘要的结果是相同的。
import hashlib
md5obj = hashlib.md5()
md5obj.update(b'alex ')
md5obj.update(b'sb')
print(md5obj.hexdigest())
分开进行摘要算法

由于hashlib可以分开,那么当我们要读取文件内容较多的时候,也可以分开读取,不会烦边文件的内容

import hashlib
def check(filename):
    md5obj = hashlib.md5()
    with open(filename, 'rb') as f:
        while True:
            content = f.read(1024)
            if content:
                md5obj.update(content)
            else:
                break
    return md5obj.hexdigest()
ret1 = check('happy')
print(ret1)
分开读取文件

 

hashlib的运用场景

(1)文件的一致性校验
(2)密文验证的时候加密
(3)密文验证的时候加密
(4)md5算法 通用的算法
(5)sha算法 安全系数更高,sha算法有很多种,后面的数字越大安全系数越高,
得到的数字结果越长,计算的时间越长

 

posted @ 2018-09-28 14:52  LuckFariy  阅读(52)  评论(0)    收藏  举报