学习:廖雪峰python3教程
概念:通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
类似一种加密的方法
例如:
>>> import hashlib
>>> str1='I\'m zaq'
>>> str1
"I'm zaq"
>>> md5 = hashlib.md5()
>>> md5.update(str1.encode('utf-8'))
>>> print(md5.hexdigest())
fce2fe09df600bfa295d3779a3912e1d
md5
是一种最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。sha1
摘要算法1
是数字1,是160 bit字节,通常用一个40位的16进制字符串表示
>>> sha1 = hashlib.sha1()
>>> sha1.update(str1.encode('utf-8'))
>>> print(sha1.hexdigest())
37163c8a5543bc32b49d42abe2e3f319fe0c26b9
例子:
# -*- coding: utf-8 -*-
"""
#Author:simple1_6
#@Blog:
#需求:验证用户登录的函数,判断用户输入的口令是否正确
"""
import hashlib
db = {
'michael': 'e10adc3949ba59abbe56e057f20f883e',
'bob': '878ef96e86145580c38c87f0410ad153',
'alice': '99b1c2188db85afee403b1536010c2c9'
}
def calc_ms5(password):
"""
#功能:根据用户输入的口令,计算出存储在数据库中的MD5口令
:param password:用户输入
:return:MD5口令
"""
md5=hashlib.md5() #md5摘要算法
return md5.update(password.encode('utf-8'))
def login(user, password):
"""
#功能:验证用户登录的函数,根据用户输入的口令是否正确,返回True或False
:param user:用户输入的用户名
:param password:用户输入的密码
:return:用户名和密码与数据库的对比,对:TRUE,错:False
"""
return lambda n:True if calc_ms5(password) is db[user] else False
assert login('michael', '123456')
assert login('bob', 'abc999')
assert login('alice', 'alice2008')
assert not login('bob', '123456')
assert not login('alice', 'Alice2008')
print('ok')
注册和登录的例子:
"""
#需求:根据用户输入的登录名和口令模拟用户注册,计算更安全的MD5,实现用户登录的验证
#用到的类和函数:
类: User(object):用户注册类
函数:get_md5(s):返回md5后的字符串
login(username, password):用户登录检测函数
"""
# -*- coding: utf-8 -*-
import hashlib, random
def get_md5(s):
"""
#md5加密密码
:param s:密码
:return: 返回md5后的字符串
"""
return hashlib.md5(s.encode('utf-8')).hexdigest()
class UserRegistered(object):
"""
#用户注册类:获取用户注册信息给密码加上登录名和“盐”
#随机生成“盐”,并且将其保存在db_salt
#给用户注册输入的密码加盐,并保存在db中
#函数:
__init__(self, username, password):获取注册信息,调用函数:userReg()
userReg():检查注册用户名是否以存在,存在返回:'Username has already been registered!',
不存在返回:'Reg ok',调用userSalt()
userSalt():随机生成“盐”,并且将用户名和密码加盐保存
"""
def __init__(self, username, password):
self.username = username
self.password = password
def userReg(self):
"""
#检查注册用户名是否以存在
:return: 用户名不存在数据库。输出ok,存在输出:Username has already been registered!
"""
if self.username not in db:
self.userSalt()
return 'Reg ok'
else:
return 'Username has already been registered!'
def userSalt(self):
"""
#随机生成“盐”,并且将用户名和密码加盐保存
:return: 无
"""
salt=''.join(chr(random.randint(48,122)) for i in range(20))
db_salt[self.username]=salt
db[self.username]=self.username+self.password+db_salt[self.username]
class UserLogin(object):
"""
#用户登录类,检查用户登录,返回登录成功或失败以及失败的原因
#函数:__init__(self,username,password):拿取用户登录信息,调用userLogin()
userLogin():检查注册用户名是否以存在,若存在则检查输入密码是否和数据库中对应。
用户名不存在数据库。输出'Please register first!',存在且匹配输出:'Success!'
"""
def __init__(self,username,password):
self.username=username
self.password=password
def userLogin(self):
"""
#检查注册用户名是否以存在,若存在则检查输入密码是否和数据库中对应。
:return: 用户名不存在数据库。输出'Please register first!',
存在且匹配输出:'Success!'
"""
if self.username not in db:
return 'Please register first!'
else:
if get_md5(self.username+self.password+db_salt[self.username])==get_md5(db[self.username]):
return 'Success!'
else:
return 'Please cheack again!'
#----------------------------------------------------------------------------
#----------------------------------------------------------------------------
#数据库
db = {} #保存注册信息
db_salt={}#保存用户名对应的随机加密值
附带单元测试用例:
# -*- coding: utf-8 -*-
"""
测试md5加密的用户注册和登录功能
"""
import unittest
from unittest.test import suite
from md5_code import UserRegistered,UserLogin
class TestUserRegistered(unittest.TestCase):
def test_1_reg(self):
#检查未注册数据返回
for username,password in db_test_right.items():
# print(username,':\t',password)
self.assertEqual(UserRegistered(username,password).userReg(),'Reg ok')
#检查已注册数据返回
for username,password in db_test_false.items():
# print(username,':\t',password)
self.assertEqual(UserRegistered(username,password).userReg(), 'Username has already been registered!')
def test_2_log(self):
for username,password in db_test_right.items():
# print(username,':\t',password)
self.assertEqual(UserLogin(username,password).userLogin(),'Success!')
#检查已注册数据返回
for username,password in db_test_false.items():
# print(username,':\t',password)
self.assertEqual(UserLogin(username,password).userLogin(), 'Please cheack again!')
#-------------------------------------------------------
#-------------------------------------------------------
db_test_right = {'michael': '123456','bob': 'abc999','alice':'alice2008'}
db_test_false={'michael': '1234567','bob':'12 3456','alice':'Alice2008'}
if __name__ == '__main__':
unittest.main()