Python中hash加密
简介
概念
散列算法(Hash Algorithm),又称哈希算法,杂凑算法,是一种从任意文件中创造小的数字「指纹」的方法。与指纹一样,散列算法就是一种以较短的信息来保证文件唯一性的标志,这种标志与文件的每一个字节都相关,而且难以找到逆向规律。因此,当原有文件发生改变时,其标志值也会发生改变,从而告诉文件使用者当前的文件已经不是你所需求的文件
Hash简单点讲就是把任意一段数据经过某种算法生成一段唯一的固定长度的数据
也可以把哈希值当做是文件指纹,因为它是文件唯一性的标志,与每一个字节都有关,当文件发生改变是,指纹值也会改变
如果把hash算法比喻为一座工厂
那传给hash算法的内容就是原材料
生成的hash值就是生产出的产品
特点
- 正向快速:给定明文和 Hash 算法,在有限时间和有限资源内能计算得到 Hash 值
- 只要传入的内容一样,得到的hash值必然一样
- 逆向困难:给定 Hash 值,在有限时间内很难逆推出明文
- 输入敏感:原始输入信息发生任何变化,新的 Hash 值都应该出现很大变化
- 冲突避免:很难找到两段内容不同的明文,使得它们的 Hash 值一致
- 长度固定:只要我们使用是hash算法固定,无论传入的内容有多大,得到的hash值的长度是固定
- 信息摘要:hash只是信息的摘要,信息指纹,是用来做数据识别的
hash有哪些
常见 Hash 算法有 MD5 和 SHA 系列,目前 MD5 和 SHA1 已经被破解,一般推荐至少使用 SHA2-256 算法
| 哈希算法 | 输出长度(bit) | 输出长度(字节) |
|---|---|---|
| MD5 | 128 bit | 16 bytes |
| RipeMD160 | 160 bits | 20 bytes |
| SHA-1 | 160 bits | 20 bytes |
| SHA-256 | 256 bits | 32 bytes |
| SHA-512 | 512 bits | 64 bytes |
算法碰撞
稍微想一下就可以发现,既然输入数据长度不固定,而输出的哈希值却是固定长度的,这意味着哈希值是一个有限集合,而输入数据则可以是无穷多个,那么建立一对一关系明显是不现实的。所以“碰撞”是必然会发生的,所以一个成熟的哈希算法会有较好的抗冲突性,同时在实现哈希表的结构时也要考虑到哈希冲突的问题
比如“666”经过 Hash 后是“fae0b27c451c728867a567e8c1bb4e53”,相同 Hash 算法得到的值是一样的。比如 WiFi 密码如果是 8 位纯数字的话,顶多就是 99999999 种可能性,破解这个密码需要做的就是提前生成好 0 到 1 亿数字的 Hash 值,然后做 1 亿次布尔运算(就是 Bool 值判断,0 或者 1),而现在普通 I5 四核 CPU 每秒能到达 200 亿次浮点数计算,做 1 亿次布尔运算也就是秒级别的时间就破解了
8位大小写字母、数字、特殊符号组成的密码,若按照MD5加密,则hash值大概10000千亿,i9算力每秒1千亿。也需要至少24h。这只是极端情况下,如果加上加密算法不确定(比如3),请求时间(比如3),查询时间(比如3),这就已经需要半年左右,倘若再加上错误等待时间(比如输入5次错误等待24小时),那就已经需要50年。。。
当然,如果有三万台电脑同时破解,也还是一天 -_-|||。
不过道高一尺,魔高一丈。谁又会傻乎乎的一个站着打一个等着挨。都是相对的
所以密码尽量不要用纯数字,因为根本没有任何安全性
加盐防碰撞
对数字内容进行 Hash 运算,获取唯一的摘要值来指代原始完整的数字内容,利用 Hash 函数的抗碰撞性来确保内容未被篡改
常用于用户名和密码来确保用户信息安全,为了防止攻击会采用加盐的方法,就是原来的明文加上一个随机数之后的 Hash 值,Hash 值和盐会保存在两个地方,只要不是同时泄漏就很难被破解
加密
如果在Python中需要对用户输入的密码或者其他内容进行加密,首选的方法是生成hash值
在Python中可以利用二个模块来进行:
- crypt
- hashlib
hashlib
主要方法
使用:hashlib.md5()
| 名称 | 描述 |
|---|---|
| md5(…) | 利用md5算法加密 |
| sha1(…) | 利用sha1算法加密 |
| sha224(…) | 利用sha224算法加密 |
| sha256(…) | 利用sha256算法加密 |
| sha384(…) | 利用sha384算法加密 |
| sha512(…) | 利用sha512算法加密 |
特有方法
如果你利用hashlib生成了一个Hash对象,那么这个Hash对象会包含如下方法
| 名称 | 描述 |
|---|---|
| update(arg) | 可以重复利用指定了特殊加密算法的Hash对象,对arg进行加密 |
| digest(…) | 以字符形式返回加密内容 |
| hexdigest(…) | 以16进制形式返回加密内容 |
| copy(…) | 为了达到重复利用Hash对象的目的,而克隆Hash对象 |
使用方法
直接使用hashlib方法
import hashlib hashlib.sha224("Nobody inspects the spammish repetition".encode("utf-8")) # 加密
hashlib.sha224("Nobody inspects the spammish repetition".encode("utf-8")).hexdigest() # 返回加密内容
直接使用Hash对象中的方法
import hashlib # 造出工厂
m = hashlib.md5()
# 放入原料
m.update("Nobody inspects".encode('utf-8'))
# 产出hash值
m.digest() m.update("the spammish repetition".encode("utf-8"))
m.digest()
m.hexdigest()
加盐
import hashlib
# 造出工厂
m = hashlib.md5("this is salt".encode("utf-8"))
# 放入原料
m.update("Nobody inspects".encode('utf-8'))
# 产出hash值
m.digest()
m.update("the spammish repetition".encode("utf-8"))
m.digest()
m.hexdigest()
crypt
主要方法
| 名称 | 类型 | 描述 |
|---|---|---|
| crypt(…) | 方法 | 对指定内容进行hash加密 |
| mksalt(…) | 方法 | 根据加密算法生成salt |
| methods | list | 返回可用加密算法的列表 |
| MOTHOD_CRYPT | 常量 | 加密算法 |
| METHOD_MD5 | 常量 | md5加密算法 |
| METHOD_SHA256 | 常量 | sha256加密算法 |
| METHOD_SHA512 | 常量 | sha512加密算法 |
使用说明
使用crypt.crypt(…)进行hash加密的时候,需要提供二个参数:
- 加密内容
- salt
import crypt
salt = crypt.mksalt(crypt.METHOD_SHA512)
hash = crypt.crypt("helloworld",salt)
应用
密码加密
m=hashlib.md5()
m.update('key'.encode('utf-8')) #添加个其他元素,提升密码复杂度,不是加盐
m.update(password.encode('utf-8'))
print(m.hexdigest())
应用一致性校验
m = hashlib.md5()
with open(r'E:\01.mp4','rb') as f:
for line in f:
m.update(line)
print(m.hexdigest)
Python中hash加密的更多相关文章
- 五、python中MD5加密
import hashlib '''用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法'''##### ...
- Python 中的哈希表
Python 中的哈希表:对字典的理解 有没有想过,Python中的字典为什么这么高效稳定.原因是他是建立在hash表上.了解Python中的hash表有助于更好的理解Python,因为Pytho ...
- 潭州课堂25班:Ph201805201 爬虫基础 第七课 Python与常见加密方式 (课堂笔记)
打开图形界面 18版 Python与常见加密方式 前言 我们所说的加密方式,都是对二进制编码的格式进行加密的,对应到Python中,则是我们的Bytes. 所以当我们在Python中进行加密操作的时 ...
- python常见的加密方式
1.前言 我们所说的加密方式都是对二进制编码的格式进行加密,对应到python中,则是我妈们的bytes. 所以当我们在Python中进行加密操作的时候,要确保我们的操作是bytes,否则就会报错. ...
- Python与常见加密方式
前言 我们所说的加密方式,都是对二进制编码的格式进行加密的,对应到Python中,则是我们的Bytes. 所以当我们在Python中进行加密操作的时候,要确保我们操作的是Bytes,否则就会报错. 将 ...
- python 中md5 和 sha1 加密, md5 + os.urandom 生成全局唯一ID
首先先来介绍一下md5 和 sha1 的概念 MD5 MD5的全称是Message-Digest Algorithm 5(信息-摘要算法).128位长度.目前MD5是一种不可逆算法. 具有很高的安全性 ...
- 使用RSA加密在Python中逆向shell
i春秋翻译小组-Neo(李皓伟) 使用RSA加密在Python中逆向shell 这是一个关于使用RSA加密编程逆向shell的python教程. 我想提一下,这篇文章更多的是关于理解shell中涉及的 ...
- python提供了一个进行hash加密的模块:hashlib
python提供了一个进行hash加密的模块:hashlib下面主要记录下其中的md5加密方式 import hashlib data1 = 'sada' #####字母和数字 m = hashlib ...
- Python中的Base64编码的加密与解密
Base64 可以干些啥? Base64编码的作用: 由于某些系统中只能使用ASCII字符.Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法. 图片(and种子)base64 ...
随机推荐
- SpringBoot使用Aspect切面拦截打印请求参数
引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp ...
- js(JQuery)引入select2
官方项目地址:https://select2.org/ 引入css和js <link href="https://cdnjs.cloudflare.com/ajax/libs/sele ...
- NULL在oracle和mysql索引上的区别
一.问题 oracle的btree索引不存储NULL值,所以用is null或is not null都不会用到索引范围扫描,但是在mysql中也是这样吗? 二.实验 先看看NULL在oracle(11 ...
- c++设计模式概述之装饰器
类写的不够规范,目的是为了缩短篇幅,实际中请不要这样做. 1.概述 想象一下修房子.当施工队把房子框架结构做好了,墙刷上了水泥, 这时,工队暂时没有钱,装修只能暂停了. 过了一段时间,工队筹集了资金 ...
- 自己常用的CMake用法总结
欢迎指正 CMake : A.download : https://cmake.org/download/ B.tutorial: https://cmake.org/cmake-tutorial/ ...
- Amazing!!CSS 也能实现烟雾效果?
最近利用 CSS 实现了一些看似超出 CSS 能力的效果: 巧用渐变实现高级感拉满的背景光动画 Amazing!!CSS 也能实现极光? 本文继续此系列,本文主要想探讨一下,使用 CSS 能否比较好的 ...
- Azure Data Lake(一) 在NET Core 控制台中操作 Data Lake Storage
一,引言 Azure Data Lake Storage Gen2 是一组专用于大数据分析的功能,基于 Azure Blob Storage 构建的.Data Lake Storage Gen2 包含 ...
- Proximal Algorithms 2 Properties
目录 可分和 基本的运算 不动点 fixed points Moreau decomposition 可分和 如果\(f\)可分为俩个变量:\(f(x, y)=\varphi(x) + \psi(y) ...
- Deep Residual Learning for Image Recognition (ResNet)
目录 主要内容 代码 He K, Zhang X, Ren S, et al. Deep Residual Learning for Image Recognition[C]. computer vi ...
- [炼丹术]UNet图像分割模型相关总结
UNet图像分割模型相关总结 1.制作图像分割数据集 1.1使用labelme进行标注 (注:labelme与labelImg类似,都属于对图像数据集进行标注的软件.但不同的是,labelme更关心对 ...