python 摘要算法 hashlib

学习:廖雪峰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()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值