通过哈希算法,我们可以验证一段数据是否有效,方法就是对比该数据的哈希值,例如,判断用户口令是否正确,我们用保存在数据库中的password_md5对比计算md5(password)的结果,如果一致,用户输入的口令就是正确的。

为了防止黑客通过彩虹表根据哈希值反推原始口令,在计算哈希的时候,不能仅针对原始输入计算,需要增加一个salt来使得相同的输入也能得到不同的哈希,这样,大大增加了黑客破解的难度。

如果salt是我们自己随机生成的,通常我们计算MD5时采用md5(message + salt)。但实际上,把salt看做一个“口令”,加salt的哈希就是:计算一段message的哈希时,根据不通口令计算出不同的哈希。要验证哈希值,必须同时提供正确的口令。

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

和我们自定义的加salt算法不同,Hmac算法针对所有哈希算法都通用,无论是MD5还是SHA-1。采用Hmac替代我们自己的salt算法,可以使程序算法更标准化,也更安全。

Python自带的hmac模块实现了标准的Hmac算法。我们来看看如何使用hmac实现带key的哈希。

我们首先需要准备待计算的原始消息message,随机key,哈希算法,这里采用MD5,使用hmac的代码如下:

>>> import hmac
>>> message = b'Hello, world!'
>>> key = b'secret'
>>> h = hmac.new(key, message, digestmod='MD5')
>>> # 如果消息很长,可以多次调用h.update(msg)
>>> h.hexdigest()
'fa4ee7d173f2d97ee79022d1a7355bcf'

可见使用hmac和普通hash算法非常类似。hmac输出的长度和原始哈希算法的长度一致。需要注意传入的key和message都是bytes类型,str类型需要首先编码为bytes

练习

将上一节的salt改为标准的hmac算法,验证用户口令:

# -*- coding: utf-8 -*-
import hmac, randomdef hmac_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 = usernameself.key = ''.join([chr(random.randint(48, 122)) for i in range(20)])self.password = hmac_md5(self.key, password)db = {'michael': User('michael', '123456'),'bob': User('bob', 'abc999'),'alice': User('alice', 'alice2008')
}

# 测试:

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')

小结

Python内置的hmac模块实现了标准的Hmac算法,它利用一个key对message计算“杂凑”后的hash,使用hmac算法比标准hash算法更安全,因为针对相同的message,不同的key会产生不同的hash。

python3 hmac算法简介相关推荐

  1. HMAC算法及计算流程介绍

    HMAC算法及计算流程介绍 1.HMAC算法的应用: 目前HMAC算法主要应用在服务器对访问者进行鉴权认证流程中. 2.HMAC算法简介: HMAC是密钥相关的哈希运算消息认证码(Hash-based ...

  2. LoRaWAN ADR (自适应速率) 算法简介及最新研究方向

    LoRaWAN ADR 自适应速率 算法简介及最新研究方向 1. 背景: 1.1 ADR简介 1.2 LoRaWan NS 1.3 ADR目标 1.4 ADR应用场景 2. ADR实现方式.原理: 3 ...

  3. 数据结构与算法:算法简介

    数据结构与算法:算法简介 雪柯 大工生物信息 提笔为写给奋进之人 已关注 你说呢 . shenwei356 等 70 人赞同了该文章 引用自算法图解,作者[美] Aditya Bhargava 译袁国 ...

  4. hash算法_一致性hash算法简介

    一致性hash算法有什么用?我们为什么需要一致性hash算法?这两个问题的答案可以看这篇文章 分布式系统路由算法简介. 了解了一致性hash算法出现的背景,我们来看看什么是一致性hash算法.一致性h ...

  5. Minimax 和 Alpha-beta 剪枝算法简介,及以此实现的井字棋游戏(Tic-tac-toe)

    前段时间用 React 写了个2048 游戏来练练手,准备用来回顾下 React 相关的各种技术,以及试验一下新技术.在写这个2048的过程中,我考虑是否可以在其中加入一个 AI 算法来自动进行游戏, ...

  6. 推荐系统算法_机器学习和推荐系统(二)推荐算法简介

    推荐算法简介 一. 基于人口统计学的推荐算法 二.基于内容的推荐算法 三. 基于协同过滤的推荐算法 协同过滤(Collaborative Filtering , CF) 基于近邻的系统过滤 基于用户( ...

  7. 图像迁移风格保存模型_CV之NS:图像风格迁移(Neural Style 图像风格变换)算法简介、关键步骤配图、案例应用...

    CV之NS:图像风格迁移(Neural Style 图像风格变换)算法简介.过程思路.关键步骤配图.案例应用之详细攻略 目录 图像风格迁移算法简介 图像风格迁移算法过程思路 1.VGG对比NS 图像风 ...

  8. 魔棒工具--RegionGrow算法简介

    from: 魔棒工具--RegionGrow算法简介 ps里面的魔棒工具非常好用,是图像处理中非常常用的一个工具,它现在已经是我的c++工具箱中很重要的一员了,我会在以后的时间里把我的工具箱逐渐介绍给 ...

  9. 【数据挖掘】基于划分的聚类方法 ( K-Means 算法简介 | K-Means 算法步骤 | K-Means 图示 )

    文章目录 一. 基于划分的聚类方法 二. K-Means 算法 简介 三. K-Means 算法 步骤 四. K-Means 方法的评分函数 五. K-Means 算法 图示 一. 基于划分的聚类方法 ...

最新文章

  1. 分布式概念-分布式系统是什么?
  2. servlet工作原理_Servlet 生命周期、工作原理
  3. sublime-text-2相关快捷键
  4. 腾讯人均每月薪酬成本超8万元,员工总数首次超10万
  5. [转载] 手把手教你整合最优雅SSM框架:SpringMVC + Spring + MyBatis
  6. linux做完sftp端口分离后ftp,Linux 中实现文件传输服务(FTP、SFTP)
  7. c语言程序设计第一课作业,C语言程序设计第一课答案.doc
  8. 确认!字节跳动 AI Lab 负责人马维英离职,将赴清华加入张亚勤团队
  9. C++ Primer 第9章 习题9.32
  10. 随机过程第2讲——马尔可夫过程的应用
  11. Mysql的一揽子方案用法
  12. wex5链接mysql_【WeX5学习】 后端服务之访问数据库表
  13. python并发与网络编程
  14. 【Android】app应用内版本更新升级(DownloadManager下载,适配Android6.0以上所有版本)
  15. 《西游降魔录》模块学习笔记
  16. 感知复合型人才的重要性!
  17. NET CORE读取Excel.xlsx单元格内的图片,并关联当前业务ID推送图片到指定服务器...
  18. RabbitMQ 学习笔记
  19. 计算机的ipv6地址,windows7旗舰版系统下查看电脑iPv6地址的方法【图文详解】
  20. 【知识】太阳能板行业生产加工步骤(超详细)

热门文章

  1. OpenStack 实现技术分解 (6) 通用库 — oslo_log
  2. bootcmd 和 bootargs 环境变量
  3. PMSM的FOC 矢量控制算法调试流程,新手上手流程
  4. 共识算法的比较:Casper vs Tendermint
  5. lvm 2(逻辑卷管理)基础详解
  6. Javascript:字符串分割split()妙用
  7. 打靶归来——记参加射击比赛感想
  8. AlertDialog 点击空白处、返回按钮 行为
  9. Java计算两个时间差
  10. [bat] 使用bat文件保证指定程序运行