博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python hashlib and hmac
阅读量:4325 次
发布时间:2019-06-06

本文共 2505 字,大约阅读时间需要 8 分钟。

hashlib

hashlib提供了常用的摘要算法:MD5, SHA1等等

摘要算法:也成哈希算法,散列算法。通过一个函数把任意长度的数据转换成一个长度固定的数据串。主要用在存储一些不能被修改和查看的数据。

如用户名和密码存储在数据库中,但是不能明文存储,通过摘要算法转换成一串数据,安全性比明文存储要好。

算法MD5:hashlib.md5(Bytes)

常用的摘要算法MD5, 输入的参数是Bytes类型,生成结果是固定的128bit, 通常用一个32位的16进制字符串表示

计算一个字符串的MD5值,传入string类型的参数

import hashlib

和直接传入Bytes参数效果一样

如果数据量很大,可以多次调用md5.update(), 效果一样

 

但是一定要注意,多次调用的时候,字符串分隔后中间的符号一定要保留,否则结果将会不一样,

如下面的例子中, ‘a’后面少了一个空格,结果相当于‘this is apassword’ 而不是‘this is a password’:

算法SHA1:hashlib.sha1(bytes),用法和MD5相同,生成160bit字节,通常用40位的16进制字符串表示

Hmac

Hmac算法:Keyed-Hashing for Message Authentication。通过一个标准算法,在计算哈希的过程中,把key混入计算过程中

hmac.new(key, message, digestmod='MD5')

key 和message都必须是Bytes类型

 

下面是分别用hashlib 和 hmac实现的密码验证:

用hashlib实现:

# _*_ coding:utf-8_*_ import hashlib, random def get_md5(s):     return hashlib.md5(s.encode('utf-8')).hexdigest() class User(object):     def __init__(self, username, password):         self.username = username         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) # user.password 里传入的参数是db里的password # ==后面的get_md5里的password是用的login这里传入的password # 测试: 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')

 

用hmac实现

# _*_ coding:utf-8 _*_ import hmac, random def get_md5(key, s):     return hmac.new(key.encode('utf-8'), s.encode('utf-8'), 'MD5').hexdigest() class User(object):     def __init__(self, username, password):         self.username = username         self.key = ''.join([chr(random.randint(48, 122)) for i in range(20)])         self.password = get_md5(self.key, password) 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(user.key, password) # 测试: 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')

 

 

 

转载于:https://www.cnblogs.com/xiaohai2003ly/p/8709860.html

你可能感兴趣的文章
阶段3 2.Spring_07.银行转账案例_10 使用动态代理实现事务控制
查看>>
阶段3 2.Spring_08.面向切面编程 AOP_8 spring中的环绕通知
查看>>
阶段3 2.Spring_08.面向切面编程 AOP_10 总结和作业安排
查看>>
阶段3 2.Spring_09.JdbcTemplate的基本使用_2 JdbcTemplate的概述和入门
查看>>
阶段3 2.Spring_08.面向切面编程 AOP_7 通用化切入点表达式
查看>>
阶段3 2.Spring_09.JdbcTemplate的基本使用_6 JdbcDaoSupport的使用以及Dao的两种编写方式...
查看>>
阶段3 2.Spring_08.面向切面编程 AOP_9 spring基于注解的AOP配置
查看>>
阶段3 2.Spring_10.Spring中事务控制_1 基于XML的AOP实现事务控制
查看>>
阶段3 2.Spring_09.JdbcTemplate的基本使用_1 今日课程内容介绍
查看>>
阶段3 2.Spring_09.JdbcTemplate的基本使用_3 JdbcTemplate在Dao中的使用
查看>>
阶段3 2.Spring_09.JdbcTemplate的基本使用_5 JdbcTemplate在spring的ioc中使用
查看>>
阶段3 2.Spring_10.Spring中事务控制_2 作业-基于注解的AOP实现事务控制及问题分析_上...
查看>>
阶段3 2.Spring_10.Spring中事务控制_5 spring事务控制的代码准备
查看>>
阶段3 2.Spring_10.Spring中事务控制_4 spring中事务控制的一组API
查看>>
阶段3 2.Spring_10.Spring中事务控制_7 spring基于注解的声明式事务控制
查看>>
阶段3 2.Spring_10.Spring中事务控制_6 spring基于XML的声明式事务控制-配置步骤
查看>>
阶段3 2.Spring_10.Spring中事务控制_9 spring编程式事务控制1-了解
查看>>
阶段3 2.Spring_10.Spring中事务控制_8 spring基于纯注解的声明式事务控制
查看>>
阶段3 3.SpringMVC·_01.SpringMVC概述及入门案例_07.入门案例中使用的组件介绍
查看>>
阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_1 请求参数绑定入门
查看>>