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的更多相关文章

  1. hashlib python 加密框架

    python3中digest()和hexdigest()区别 转自:https://www.cnblogs.com/yrxns/p/7727471.html hashlib是涉及安全散列和消息摘要,提 ...

  2. python 加密方式(MD5&sha&hashlib)

    1.MD5加密 import md5 m = md5.new() #或者m = md5.md5() m.update('123456') m.hexdigest() #或者md5.md5('12345 ...

  3. python之模块hashlib(提供了常见的摘要算法,如MD5,SHA1等等)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块hashlib(提供了常见的摘要算法,如MD5,SHA1等等) #http://www.c ...

  4. python 模块之hashlib

    Hashlib模块 Python里面的hashlib模块提供了很多加密的算法,这里介绍一下hashlib的简单使用事例,用hashlib的md5算法加密数据,其他的所有加密算法使用方式上基本类似. h ...

  5. sip鉴权认证算法详解及python加密

    1. 认证和加密    认证(Authorization)的作用在于表明自己是谁,即向别人证明自己是谁.而相关的概念是MD5,用于认证安全.注意MD5仅仅是个hash函数而已,并不是用于加密.因为ha ...

  6. Python加密与解密

    前言 据记载,公元前400年,古希腊人发明了置换密码.1881年世界上的第一个电话 保密专利出现.在第二次世界大战期间,德国军方启用“恩尼格玛”密码机, 密码学在战争中起着非常重要的作用. 随着信息化 ...

  7. Python 加密 shellcode 免杀

    Python 加密 shellcode 免杀 环境准备:   Windows7 32 位系统: Shellcode 使用 kali linux Metasploit 生成 shellcode Wind ...

  8. python模块 加密服务hashlib,hmac

    https://docs.python.org/zh-cn/3/library/hashlib.html hashlib --安全hash和消息摘要digest hmac -- keyed-Hashi ...

  9. python模块之hashlib加密

    40.加密模块:hashlib      1.           >>> import hashlib >>> ret1 = hashlib.md5()     ...

随机推荐

  1. Kali更新源,亲测目前可用的源

    kali更新的时候老是无法定位软件包,网络上大部分中科大.阿里云kali源都不可用,都千篇一律,最后找了这个,网易的,还不错,贴出来大家看看: # 源 deb http://mirrors.163.c ...

  2. Spring AOP(6)-- XML配置

    applicationContext-xml.xml <?xml version="1.0" encoding="UTF-8"?><beans ...

  3. JMeter学习(二)工具简单介绍

    一.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序).它可以用来测试静态和动态资源的性能,例如:静态文件, ...

  4. 汇编指令与Intrinsics指令的对应关系汇总

    汇编指令与Intrinsics指令的对应关系汇总 参考网址:https://software.intel.com/sites/landingpage/IntrinsicsGuide/ 1.赋值指令:m ...

  5. ElasticSearch高可用集群环境搭建和分片原理

    1.ES是如何实现分布式高并发全文检索 2.简单介绍ES分片Shards分片技术 3.为什么ES主分片对应的备分片不在同一台节点存放 4.索引的主分片定义好后为什么不能做修改 5.ES如何实现高可用容 ...

  6. USACO 简易题解(蒟蒻的题解)

    蒟蒻难得可以去比赛,GDOI也快到了,还是认真刷题(不会告诉你之前都在颓废),KPM 神犇既然都推荐刷USACO, 辣就刷刷. 现在蒟蒻还没刷完,太蒟刷得太慢,so 写了的搞个简易题解(没代码,反正N ...

  7. vs2013 浏览器 browserlink 不停访问

  8. Gamma函数相关matlab代码

    1.Gamma函数: Gamma函数matlab代码: x=:0.5:5syms t y=)*exp(-t),,inf) y=double(y) plot(x,y,) 图像如下: 2.lgΓ(x)函数 ...

  9. 通过application.properties配置SpringBoot项目

    application.properties可以自己新建,放在这里:(该文件可以放在4个地方,详情百度) 在文件中添加:file_path=E://Tools//apache-tomcat-9.0.1 ...

  10. docker建立和共享文件(服务器和docker之间的共享)

    建立序列号:sudo docker run -it domimiek/deep-base  /bin/bash   回撤后会出现一个序列号(记住) 开始:sudo docker start 序列号 当 ...