写在篇前

​ 哈希加密算法应用非常广泛,包括数字签名,身份验证,操作检测,指纹,校验和(消息完整性检查),哈希表,密码存储等。在密码学中,好的哈希算法应该满足以下两个条件:一是无法从哈希值解密原始消息;二是,更改原始消息的一个字节,哈希消息会发生非常大的变化。
​ 哈希函数以可变长度的字节序列的作为输入,并将其转换为固定长度的序列。这个过程是单向的,即意味着,如果f是哈希函数,则f(x)的计算相当简单快捷,但是如果尝试从f(x)获得x则可能需要数年时间。哈希函数返回的值通常称为secure hash(安全哈希),message digest(消息摘要)或 checksum(校验和)。大多数情况下,哈希函数会为给定的输入产生唯一的输出。但是有的哈希算法有可能会发生哈希碰撞。

基本使用

hashlib标准库提供了两个常量属性algorithms_availablealgorithms_guaranteed,前者表示当前python解释器支持的hash算法名称(包括openssl提供的hash算法);后者表示该标准库稳定支持的hash算法,如下所示:

>>> print(hashlib.algorithms_available)
{'sha224', 'sha512-224', 'md4', 'sha3_224', 'sha512-256', 'whirlpool', 'blake2b', 'sha3_512', 'sha3_384', 'md5-sha1', 'sha1', 'sha384', 'sha3_256', 'sha3-384', 'sha256', 'shake_256', 'shake_128', 'sha3-224', 'sm3', 'blake2s256', 'sha3-256', 'ripemd160', 'shake256', 'shake128', 'sha512', 'blake2s', 'mdc2', 'md5', 'blake2b512', 'sha3-512'}
>>> print(hashlib.algorithms_guaranteed)
{'sha3_512', 'blake2s', 'shake_256', 'sha224', 'sha3_384', 'shake_128', 'sha1', 'sha3_224', 'sha384', 'sha3_256', 'md5', 'sha256', 'sha512', 'blake2b'}

hashlib模块的基本使用非常简单,只需通过hashlib.encryption_algorithm_name(b“ message")即可对原始消息进行哈希操作。另外,可以使用update()函数将字节消息附加到hash值中。最后,通过使用digest()orhexdigest()函数获得hash值。需要注意的是,b被写在消息的左边表示该字符串是字节字符串:

>>> import hashlib
>>> hash_object = hashlib.md5(b'Hello World')
>>> print(hash_object.hexdigest())
b10a8db164e0754105b7a99be72e3fe5  # 32位
>>> hash_object.digest_size
16
>>> hash_object.block_size
64
>>> hash_object.name
'md5'# 快捷方式
>>> hashlib.md5(b'Hello World').hexdigest()
b10a8db164e0754105b7a99be72e3fe5>>> hash_object_b = hash_object.copy()
>>> hash_object_b.update(b' jeffery!').hexdigest()
df52e7ea0abbe37b8b799e7091522dff
>>> hashlib.md5(b'Hello World jeffery!').hexdigest()
df52e7ea0abbe37b8b799e7091522dff

​ 构造hash对象还可以通过通用的new('encryption_algorithm_name')来实现,但是这种构造方法相比hashlib.encryption_algorithm_name()这类方法速度更慢,所以了解即可:

>>> h = hashlib.new('ripemd160')
>>> h.update(b"Nobody inspects the spammish repetition")
>>> h.hexdigest()
'cc4a5ce1b3df48aec5d22d1f16b894a0b894eccc'

应用示例

md5文件校验

​ 上面例子中多次用到MD5算法,MD5,即Message-Digest Algorithm 5,是一种历经MD2、MD3和MD4发展而来的单向散列算法。其特点是,MD5接受任意长度的信息作为输入,输出为128位的数字指纹,且该数据指纹具有唯一性、不可逆性。MD5算法其中一个重要用途就是文件校验,比如大家上传资源到CSDN资源下载平台,发现平台已有的资源会被禁止上传,其中也许也用到了这种类似的算法,下面给出一个例子供参考:

import os
import hashlibdef get_file_md5_value(path, mode='rb', buffer=1024*1024, salt=None, encoding='utf-8'):""":param path: 文件路径:param mode: 文件读取模式:param buffer: buffer大小,单位为B, 默认为1024*1024B,即1M:param salt: 盐,一般文件重复校验不加盐:param encoding: 编码方式:return:"""md5_obj = hashlib.md5()if salt is not None:if isinstance(salt, bytes):md5_obj.update(salt)else:md5_obj.update(str(salt).encode(encoding))file_size = os.path.getsize(path)  # 单位是字节,Bwith open(path, mode) as f:while file_size:if mode == 'rb':content = f.read(buffer)else:content = f.read(buffer).encode(encoding)file_size -= len(content)md5_obj.update(content)return md5_obj.hexdigest()print(get_file_md5_value('result/AE_NET01.h5', salt='gc'))

hmac密码加密

​ 我们知道数据库用户密码肯定不能明码存储,需要加密存储,但是直接加密md5(password)也同样不安全,因为根据彩虹表还是有很大几率可以破解密码,因此我们可以通过加盐的方式,让密码破解的难度更上一层楼。所谓加盐,即每位用户分配一段随机序列,作为salt(盐)和用户一起加密,即md5(password + salt)。python标准库hmac(Keyed-Hashing for Message Authentication)是一个对所有哈希算法都通用的标准算法。在计算哈希值的过程中,把salt混入。

>>> import hmac
>>> message = b'Hello, world!'
>>> key = b'secret'
>>> h = hmac.new(key, message, digestmod='MD5')
>>> h.hexdigest()
'fa4ee7d173f2d97ee79022d1a7355bcf'

​ 在hash标准库中也有一个类似的函数hashlib.pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None),其中参数 name 是 HMAC 要用到的哈希摘要算法如sha256;passwordsalt 为字节串,应该大约 16 或更多个 bytes,可用os.urandom();参数 iterations 应基于算法和计算能力设置,比如 100,000 轮 SHA-256 是推荐的次数;参数 dklen 是导出的密钥的长度。如果 dklenNone 那么就用参数 name 指定的哈希算法的摘要长度,比如SHA-512为64。

>>> import hashlib, binascii
>>> dk = hashlib.pbkdf2_hmac('sha256', b'password', b'salt', 100000)
>>> binascii.hexlify(dk)  # 返回二进制的十六进制
b'0394a2ede332c9a13eb82e9b24631604c31df978b4e2f0fbd2c549944f9d79a5'

hashlib标准库中还提供了一个类似的加密函数hashlib.scrypt(password, *, salt, n, r, p, maxmem=0, dklen=64,该库中还有很多有趣的hash算法,比如SHAKE 、BLAKE2,请参考官方文档。

python hashlib 哈希算法相关推荐

  1. 用 Python 实现哈希算法检测重复图片

    用 Python 实现哈希算法检测重复图片 - 简书 Python实现哈希算法,并检测图片重复的教程_Steven_ycs的博客-CSDN博客_python实现哈希

  2. python hashlib库 sha256算法 md5

    python内建函数hash()针对不可变对象提供计算哈希值,但我觉得没啥用,可能这个函数的唯一作用就是python字典用了这个函数实现哈希. python内建库hashlib库提供了很多哈希算法. ...

  3. python检测图片相同部分_用 Python 实现哈希算法检测重复图片

    在 Python 中导入 hashlib 模块,调用函数就可以生成某一个字符串或者文件的哈希值.这个算法对于未被篡改的上传文件非常有效,如果输入数据有细微变化,加密哈希算法都会导致雪崩效应,从而造成新 ...

  4. Python哈希算法模块hashlib

    文章目录 初步 封装算法简介 new函数 初步 hashlib模块实现了多种哈希算法,包括MD5以及SHA家族的算法,通过algorithms_guaranteed可以查看hashlib中封装的所有算 ...

  5. 哈希运算python实现_一致性哈希算法 python实现

    # -*- coding: utf-8 -*- """ 一致性哈希算法 python实现 参考 http://weblogs.java.net/blog/2007/11/ ...

  6. Python之网络爬虫(selenium爬取动态网页、爬虫案例分析、哈希算法与RSA加密)

    文章目录 一.selenium爬取动态网页 二.爬虫案例分析 三.哈希hash算法与RSA加密 一.selenium爬取动态网页 1.动态网页认知 爬虫其实就是在模仿浏览器的行为 应对要多次数据的交互 ...

  7. python查重算法_用Python实现通过哈希算法检测图片重复的教程

    Iconfinder 是一个图标搜索引擎,为设计师.开发者和其他创意工作者提供精美图标,目前托管超过 34 万枚图标,是全球最大的付费图标库.用户也可以在 Iconfinder 的交易板块上传出售原创 ...

  8. python图像检测_用Python实现通过哈希算法检测图片重复的教程

    Iconfinder 是一个图标搜索引擎,为设计师.开发者和其他创意工作者提供精美图标,目前托管超过 34 万枚图标,是全球最大的付费图标库.用户也可以在 Iconfinder 的交易板块上传出售原创 ...

  9. 相似图片检测:感知哈希算法之aHash,dHash,pHash的Python实现

    相似图片检测:感知哈希算法之aHash,dHash,pHash的Python实现 原文:http://blog.sina.com.cn/s/blog_56fd58ab0102xpqf.html 感知哈 ...

最新文章

  1. Ubuntu Linux 安装后,建立嵌入式开发环境
  2. 14个最常见的Kafka面试题及答案【转】
  3. 芯片焊接和PCB设计引脚的长度及位置对于焊接质量的教训
  4. 【转】ABAP的坑3
  5. python敏感字替换_教学案例_Python处理敏感词汇方法
  6. 谷歌guava_使用Google Guava进行馆藏创建和不变性
  7. 【牛客 - 301哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级)】小乐乐下象棋(记忆化搜索dp,dfs)
  8. 前端xss攻击的原理
  9. markdownpad 2 的使用
  10. cmd静默运行_exe、msi、dos、bat等静默运行,后台运行,不弹窗的解决办法
  11. 关于如何处理MyEclipse中struts2与Hiber 3中antlr-2.7.2.jar与antlr-2.7.6包冲突的问题
  12. 98岁国学大师自曝只喜欢18岁的年轻美女
  13. 干货干货~C语言版学生成绩管理系统【数据结构课程设计,百行代码实现功能强化版(内附源码)】
  14. 阿里云IoT平台APP配网入口
  15. EM78系列单片机的开发工具及编程器
  16. 蓝桥杯EDA赛前总结
  17. 史元春和孙正兴:人机交互
  18. 三相发电与输电系统的发展
  19. 焱融 YRCloudFile 连获两项重量级认证,展现强劲存储实力
  20. 浮动的运用(图片的横向排列以及鼠标选中之后的效果)

热门文章

  1. JUC锁-Condition(三)
  2. iphone模拟器快捷键使用
  3. Go 语言学习笔记(二):函数
  4. 1032 挖掘机技术哪家强 (20分)——15行代码AC
  5. Web应用_Tomcat部署及优化
  6. python爬虫之美女图片爬取
  7. Windows下安装苹果iPhone开发环境xcode图文教程
  8. Android 判断应用 第一次启动
  9. Linux软件包组的选择
  10. vb6 combo根据index显示选项内容_按指定次数重复显示,两种方法随意选