Python学习笔记__12.5章 hashlib

# 这是学习廖雪峰老师python教程的学习笔记

1、概览

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

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

    1)MD5的应用

import hashlib

 

md5 = hashlib.md5() # hashlib模块的md5()函数,创建了一个md5

md5.update('how to use md5 in python hashlib?'.encode('utf-8')) #调用update()方法编码

print(md5.hexdigest()) #打印3216进制的字符串

如果数据量很大,可以分块多次调用update()方法

MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。

    2)SHA1的应用

import hashlib

 

sha1 = hashlib.sha1()

sha1.update('how to use sha1 in '.encode('utf-8'))

sha1.update('python hashlib?'.encode('utf-8'))

print(sha1.hexdigest())

SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示。

    3)加盐

对原始口令加一个复杂字符串来实现加密,俗称“加盐”

def calc_md5(password):

    return get_md5(password + 'the-Salt')

 

2、例题

1、设计一个验证用户登录的函数,根据用户输入的口令是否正确,返回True或False:

# -*- coding: utf-8 -*-

db = {

    'michael': 'e10adc3949ba59abbe56e057f20f883e',

    'bob': '878ef96e86145580c38c87f0410ad153',

    'alice': '99b1c2188db85afee403b1536010c2c9'

}

import hashlib

def login(user, password):

    md5=hashlib.md5()

    md5.update(password.encode('utf-8'))

    if md5.hexdigest()==db[user]:

        return True

    else:

        return False

# 测试:

assert login('michael', '123456')

assert login('bob', 'abc999')

assert login('alice', 'alice2008')

assert not login('michael', '1234567')

assert not login('bob', '123456')

assert not login('alice', 'Alice2008')

print('ok')

 

2、根据用户输入的登录名和口令模拟用户注册,计算更安全的MD5

db = {}

 

def register(username, password):

    db[username] = get_md5(password + username + 'the-Salt')    # 设置keyvalue

 

# -*- coding: utf-8 -*-

import hashlib, random

 

def get_md5(s):

    return hashlib.md5(s.encode('utf-8')).hexdigest()  #生成MD5

 

class User(object):

    def __init__(self, username, password):

        self.username = username

# 生成盐。randint()生成范围内的随机整数。chr(),生成整数对应的ASCII码字符。for 循环20

        self.salt = ''.join([chr(random.randint(48, 122)) for i in range(20)]) 

        self.password = get_md5(password + self.salt)

db = {

    'michael': User('michael', '123456'),

    'bob': User('bob', 'abc999'),

    'alice': User('alice', 'alice2008')

}

 

def login(username, password):

    user = db[username]

    return user.password == get_md5(password+user.salt)

 

# 测试:

assert login('michael', '123456')

assert login('bob', 'abc999')

assert login('alice', 'alice2008')

assert not login('michael', '1234567')

assert not login('bob', '123456')

assert not login('alice', 'Alice2008')

print('ok')



猜你喜欢

转载自blog.51cto.com/12758568/2117091
今日推荐