python加密之hashlib
1、强大的hashlib,提供了用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
2、hmac模块实现了hmac算法,需要一个key来进行加密,提供更为强大的加密,不过需要提供key,也就是通常说的盐
3、使用hashlib.algorithms_available,可以查看hashlib提供的加密算法
4、加密的算法的一般使用,但时候存在缺陷,即:通过撞库可以反解
# ######## md5 ########
hash = hashlib.md5() #创建md5()加密实例
hash.update(bytes('admin', encoding='utf-8')) #对admin字符进行加密
print(hash.hexdigest()) #返回产生的十六进制的bytes
print(hash.digest()) ######## sha1 ######## hash = hashlib.sha1()
hash.update(bytes('admin', encoding='utf-8'))
print(hash.hexdigest()) # ######## sha256 ######## hash = hashlib.sha256()
hash.update(bytes('admin', encoding='utf-8'))
print(hash.hexdigest()) # ######## sha384 ######## hash = hashlib.sha384()
hash.update(bytes('admin', encoding='utf-8'))
print(hash.hexdigest()) # ######## sha512 ######## hash = hashlib.sha512()
hash.update(bytes('admin', encoding='utf-8'))
print(hash.hexdigest())
Hash objects have these methods:
- update(arg): Update the hash object with the bytes in arg. Repeated calls
are equivalent to a single call with the concatenation of all
the arguments.
- digest(): Return the digest of the bytes passed to the update() method
so far.
- hexdigest(): Like digest() except the digest is returned as a unicode
object of double length, containing only hexadecimal digits.
- copy(): Return a copy (clone) of the hash object. This can be used to
efficiently compute the digests of strings that share a common
initial substring.
官方说明
5、添加添加自定义key再来做加密
import hashlib
# ######## md5 ########
hash = hashlib.md5(bytes('898oaFs09f',encoding="utf-8"))
hash.update(bytes('admin',encoding="utf-8"))
print(hash.hexdigest())
6、直接使用hmac
import hmac
h = hmac.new(bytes('898oaFs09f',encoding="utf-8"))
h.update(bytes('admin',encoding="utf-8"))
print(h.hexdigest())
7、自定义密码加密模块
#!/usr/bin/env python
# -*- coding: utf8 -*-
# __Author: "Skiler Hao"
# date: 2017/4/9 15:26
import hashlib
from hashlib import sha256
import random
import hmac def _create_salt():
salt = sha256(str(random.random()).encode('utf-8')).hexdigest()[-8:]
return salt def set_password(password,salt = None):
if not salt:
salt = _create_salt()
hashed_pwd = hmac.new(bytes(salt, encoding=("utf-8")))
hashed_pwd.update(bytes(password, encoding=("utf-8")))
return hashed_pwd.hexdigest()+'$'+salt def check_pwd(pwd, hashed_pwd_salt):
hashed_pwd,salt = hashed_pwd_salt.split('$')
new_hash_pwd_salt = set_password(pwd,salt)
if new_hash_pwd_salt == hashed_pwd_salt:
return True
else:
return False
mypassword
8、对Web的api添加认证,增加安全性:
客户端:基于SECRET_KEY和时间,进行md5加密,生成动态的auth_key
# 用于API认证的KEY,直接在settings配置,注意安全,不要随意泄露给它人
KEY = '299095cc-1330-11e5-b06a-a45e60bec08b'
settings
def auth_key(self):
"""
用于生成auth_key,对key进行封装
:return: 将加密后的动态key以字典形式返回
"""
key = hashlib.md5(self.key.encode('utf-8')) # 将key作为盐先放进去,增加复杂度
auth_time = time.time() # 获取当前时间,混入其中
key.update(bytes("%s|%f" % (key, auth_time), encoding='utf-8'))
encryption_key = key.hexdigest()
result = "%s|%f" % (encryption_key, auth_time)
# 可以将key放入request的headers部分,由于键不能为下划线,建议使用-
return {'auth-key': result}
客户端的加密过程
服务器端:
验证步骤:
1、验证时间是否过期,设置为5s,或者在settings里面配置
ASSET_AUTH_KEY = '299095cc-1330-11e5-b06a-a45e60bec08b'
ASSET_AUTH_HEADER_NAME = 'HTTP_AUTH_KEY'
ASSET_AUTH_TIME = 2 # 默认时间为秒
settings
2、收到的auth_key进行解密验证
3、3s内访问过的加入list禁止再次访问
def api_auth_validation(request):
# 从请求的header部分拿到encryption_key
encryption_key_timestamp = request.META.get('HTTP_AUTH_KEY')
# 拿不到则直接报错
if not encryption_key_timestamp:
return False
sp = encryption_key_timestamp.split('|')
# 检查加密后的key,和时间是否用|隔开样式是否正确
if len(sp) != 2:
return False
# 拿到加密后的key和request时间
encryption_key,request_time = sp
request_time = float(request_time)
current_server_time = time.time()
# 时间失效,或者请求的时间戳是未来的,都报错
if current_server_time - ASSET_AUTH_EXPIRE_TIME > request_time | current_server_time < request_time:
return False
# 拿到服务器存储的key进行加密验证
ha = hashlib.md5(ASSET_AUTH_KEY.encode('utf-8'))
ha.update(bytes("%s|%f")%(ASSET_AUTH_KEY,request_time))
result = ha.hexdigest()
# 如果不等的话直接返回False
if result != encryption_key:
return False
exist = False
del_keys = []
# 拿到ENCRYPT_LIST,判断是否访问过
for k,v in enumerate(ENCRYPT_LIST):
print(k,v)
m = v['time']
n = v['encrypt']
if m < current_server_time - ASSET_AUTH_EXPIRE_TIME:
# 如果超时加入要删除的列表,做好删除准备
del_keys.append(k)
continue
if n == encryption_key:
# 是否有存在的内容
exist = True
for k in del_keys:
del ENCRYPT_LIST[k]
if exist:
return False
# 验证完全通过加入到ENCRYPT_LIST
ENCRYPT_LIST.append({'encrypt':encryption_key,'time':request_time})
# 最后再返回True
return True
具体方法
如有转载,请标明出处,如有任何建议,请留言
python加密之hashlib的更多相关文章
- hashlib python 加密框架
python3中digest()和hexdigest()区别 转自:https://www.cnblogs.com/yrxns/p/7727471.html hashlib是涉及安全散列和消息摘要,提 ...
- python 加密方式(MD5&sha&hashlib)
1.MD5加密 import md5 m = md5.new() #或者m = md5.md5() m.update('123456') m.hexdigest() #或者md5.md5('12345 ...
- python之模块hashlib(提供了常见的摘要算法,如MD5,SHA1等等)
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块hashlib(提供了常见的摘要算法,如MD5,SHA1等等) #http://www.c ...
- python 模块之hashlib
Hashlib模块 Python里面的hashlib模块提供了很多加密的算法,这里介绍一下hashlib的简单使用事例,用hashlib的md5算法加密数据,其他的所有加密算法使用方式上基本类似. h ...
- sip鉴权认证算法详解及python加密
1. 认证和加密 认证(Authorization)的作用在于表明自己是谁,即向别人证明自己是谁.而相关的概念是MD5,用于认证安全.注意MD5仅仅是个hash函数而已,并不是用于加密.因为ha ...
- Python加密与解密
前言 据记载,公元前400年,古希腊人发明了置换密码.1881年世界上的第一个电话 保密专利出现.在第二次世界大战期间,德国军方启用“恩尼格玛”密码机, 密码学在战争中起着非常重要的作用. 随着信息化 ...
- Python 加密 shellcode 免杀
Python 加密 shellcode 免杀 环境准备: Windows7 32 位系统: Shellcode 使用 kali linux Metasploit 生成 shellcode Wind ...
- python模块 加密服务hashlib,hmac
https://docs.python.org/zh-cn/3/library/hashlib.html hashlib --安全hash和消息摘要digest hmac -- keyed-Hashi ...
- python模块之hashlib加密
40.加密模块:hashlib 1. >>> import hashlib >>> ret1 = hashlib.md5() ...
随机推荐
- Kali更新源,亲测目前可用的源
kali更新的时候老是无法定位软件包,网络上大部分中科大.阿里云kali源都不可用,都千篇一律,最后找了这个,网易的,还不错,贴出来大家看看: # 源 deb http://mirrors.163.c ...
- Spring AOP(6)-- XML配置
applicationContext-xml.xml <?xml version="1.0" encoding="UTF-8"?><beans ...
- JMeter学习(二)工具简单介绍
一.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序).它可以用来测试静态和动态资源的性能,例如:静态文件, ...
- 汇编指令与Intrinsics指令的对应关系汇总
汇编指令与Intrinsics指令的对应关系汇总 参考网址:https://software.intel.com/sites/landingpage/IntrinsicsGuide/ 1.赋值指令:m ...
- ElasticSearch高可用集群环境搭建和分片原理
1.ES是如何实现分布式高并发全文检索 2.简单介绍ES分片Shards分片技术 3.为什么ES主分片对应的备分片不在同一台节点存放 4.索引的主分片定义好后为什么不能做修改 5.ES如何实现高可用容 ...
- USACO 简易题解(蒟蒻的题解)
蒟蒻难得可以去比赛,GDOI也快到了,还是认真刷题(不会告诉你之前都在颓废),KPM 神犇既然都推荐刷USACO, 辣就刷刷. 现在蒟蒻还没刷完,太蒟刷得太慢,so 写了的搞个简易题解(没代码,反正N ...
- vs2013 浏览器 browserlink 不停访问
- Gamma函数相关matlab代码
1.Gamma函数: Gamma函数matlab代码: x=:0.5:5syms t y=)*exp(-t),,inf) y=double(y) plot(x,y,) 图像如下: 2.lgΓ(x)函数 ...
- 通过application.properties配置SpringBoot项目
application.properties可以自己新建,放在这里:(该文件可以放在4个地方,详情百度) 在文件中添加:file_path=E://Tools//apache-tomcat-9.0.1 ...
- docker建立和共享文件(服务器和docker之间的共享)
建立序列号:sudo docker run -it domimiek/deep-base /bin/bash 回撤后会出现一个序列号(记住) 开始:sudo docker start 序列号 当 ...