hashlib模块

该模块为许多不同的安全散列和消息摘要算法实现了一个公共接口。包括FIPS安全哈希算法SHA1、SHA224、SHA256、SHA384和SHA512(在FIPS 180-2中定义)以及RSA的MD5算法(在Internet RFC 1321中定义)。术语“安全散列”和“消息摘要”是可以互换的。较老的算法称为消息摘要。现代术语是安全散列。python中的hashlib模块用来进行hash或者md5加密,而且这种加密是不可逆的,所以这种算法又被称为摘要算法。其支持Openssl库提供的所有算法,包括md5、sha1、sha224、sha256、sha512等。

官网:https://docs.python.org/3.6/library/hashlib.html

常用属性和方法:

algorithms:列出所有加密算法('md5','sha1','sha224','sha256','sha384','sha512')

digesti_size:产生的散列的字节大小

md5()/sha1():创建一个md5或者sha1加密模式的hash对象

update(arg):用字符串参数来更新hash对象,如果同一个has对象重复调用该方法,如下:m.update(a); m.update(b),则等于m.update(a+b)

digest():返回摘要,作为二进制数据字符串值

hexdigest():返回摘要,作为十六进制数据字符串值

copy():复制

# 1、什么叫hash:hash是一种算法(3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法),该算法接受传入的内容,经过运算得到一串hash值
# 2、hash值的特点是:
#2.1 只要传入的内容一样,得到的hash值必然一样=====>要用明文传输密码文件完整性校验
#2.2 不能由hash值返解成内容=======》把密码做成hash值,不应该在网络传输明文密码
#2.3 只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度是固定的

 hash算法就像一座工厂,工厂接收你送来的原材料(可以用m.update()为工厂运送原材料),经过加工返回的产品就是hash值

import hashlib

hash = hashlib.md5()  # md5对象,md5不能反解,但是加密是固定的,就是关系是一一对应,所以有缺陷,可以被对撞出来
hash.update(bytes('admin', encoding='utf-8'))  # 要对哪个字符串进行加密,就放这里
print(hash.hexdigest())  # 拿到加密字符串
# hash2=hashlib.sha384()#不同算法,hashlib很多加密算法
# hash2.update(bytes('admin',encoding='utf-8'))
# print(hash.hexdigest())

以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。

import hashlib
passwds=[
    'alex3714',
    'alex1313',
    'alex94139413',
    'alex123456',
    '123456alex',
    'a123lex',
    ]
def make_passwd_dic(passwds):
    dic={}
    for passwd in passwds:
        m=hashlib.md5()
        m.update(passwd.encode('utf-8'))
        dic[passwd]=m.hexdigest()
    return dic

def break_code(cryptograph,passwd_dic):
    for k,v in passwd_dic.items():
        if v == cryptograph:
            print('密码是===>\033[46m%s\033[0m' %k)

cryptograph='aee949757a2e698417463d47acac93df'
break_code(cryptograph,make_passwd_dic(passwds))
模拟撞库破解密码
import hashlib
hash3 = hashlib.md5(bytes('abd',encoding='utf-8'))
''' 如果没有参数,所以md5遵守一个规则,生成同一个对应关系,如果加了参数,
就是在原先加密的基础上再加密一层,这样的话参数只有自己知道,防止被撞库,
因为别人永远拿不到这个参数
'''
hash3.update(bytes('admin',encoding='utf-8'))
print(hash3.hexdigest())

python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 进行进一步的处理然后再加密:

 import hmac
 h = hmac.new('alvin'.encode('utf8'))
 h.update('hello'.encode('utf8'))
 print (h.hexdigest())#320df9832eab4c038b6c1d7ed73a5940
#要想保证hmac最终结果一致,必须保证:
#1:hmac.new括号内指定的初始key一样
#2:无论update多少次,校验的内容累加到一起是一样的内容

import hmac

h1=hmac.new(b'egon')
h1.update(b'hello')
h1.update(b'world')
print(h1.hexdigest())

h2=hmac.new(b'egon')
h2.update(b'helloworld')
print(h2.hexdigest())

h3=hmac.new(b'egonhelloworld')
print(h3.hexdigest())

hashlib的应用场景

摘要算法通常应用于网站存储用户的帐号密码相关信息。默认情况下,我们插入到数据库的帐号密码都是以明文保存。这样的话,一旦数据库泄露,所有用户的口令都会直接泄露,而且明文保存,网站管理员也可以直接查看到用户口令,这样及不安全。所以我们可以在获取到用户输入的密码以后,直接对其进行加密处理。然后将加密的字符串存入数据库。这样当下次用户登录时,再对用户输入的密码进行加密处理,然后与数据库中存储的加密字串进行比对,如果匹配,则说明密码正确。

这里写一个利用md5进行用户登陆网站进行注册之后密码加密的基本事例,加深理解。

import hashlib
# hashlib简单使用
def md5(arg):  # 这是加密函数,将传进来的函数加密
    md5_pwd = hashlib.md5(bytes('abd', encoding='utf-8'))
    md5_pwd.update(bytes(arg, encoding='utf-8'))
    return md5_pwd.hexdigest()  # 返回加密的数据


def log(user, pwd):  # 登陆时候时候的函数,由于md5不能反解,因此登陆的时候用正解
    with open('db', 'r', encoding='utf-8') as f:
        for line in f:
            u, p = line.strip().split('|')
            if u == user and p == md5(pwd):  # 登陆的时候验证用户名以及加密的密码跟之前保存的是否一样
                return True


def register(user, pwd):  # 注册的时候把用户名和加密的密码写进文件,保存起来
    with open('db', 'a', encoding='utf-8') as f:
        temp = user + '|' + md5(pwd)
        f.write(temp)


i = input('1表示登陆,2表示注册:')
if i == '2':
    user = input('用户名:')
    pwd = input('密码:')
    register(user, pwd)
elif i == '1':
    user =  input('用户名:')
    pwd = input('密码:')
    r = log(user, pwd)  # 验证用户名和密码
    if r == True:
        print('登陆成功')
    else:
        print('登陆失败')
else:
    print('账号不存在')

python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 进行进一步的处理然后再加密:

import hmac
h = hmac.new('alvin'.encode('utf8'))
h.update('hello'.encode('utf8'))
print (h.hexdigest())#320df9832eab4c038b6c1d7ed73a5940
#要想保证hmac最终结果一致,必须保证:
#1:hmac.new括号内指定的初始key一样
#2:无论update多少次,校验的内容累加到一起是一样的内容

import hmac

h1=hmac.new(b'egon')
h1.update(b'hello')
h1.update(b'world')
print(h1.hexdigest())

h2=hmac.new(b'egon')
h2.update(b'helloworld')
print(h2.hexdigest())

h3=hmac.new(b'egonhelloworld')
print(h3.hexdigest())

'''
f1bf38d054691688f89dcd34ac3c27f2
f1bf38d054691688f89dcd34ac3c27f2
bcca84edd9eeb86f30539922b28f3981
'''

 

posted @ 2019-06-05 00:27  码迷-wjz  阅读(159)  评论(0)    收藏  举报