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. MyEclipse激活失败

    最近从MyEclipse2014升级MyEclipse2015,结果按照MyEclipse2014的方式激活2015总是失败,显示错误如下图所示: 反复实验,怎么也不能成功激活,最终找到方法 很多情况 ...

  2. ping主机脚本

    #!/bin/bash #ping net='172.16.1' uphosts=0 downhosts=0 for i in {1..254};do ping -c 1 -w 1 ${net}.${ ...

  3. 配置OpenVpn使用证书和用户名密码双验证

    修改OpenVpn的主配置文件 添加一下内容: [root@check1 openvpn]# tail -3 server.conf auth-user-pass-verify /etc/openvp ...

  4. Linux下MySQL 5.6.24的编译安装与部署

    MySQL 5.6正式版发布了,相对于5.5版本作出了不少改进,其源码安装配置方式也有所变化,本文根据实际操作,不断尝试,精确还原了安装的具体步骤. 在Linux下安装MySQL前,先确认卸载系统自带 ...

  5. BZOJ4487 [Jsoi2015]染色问题

    BZOJ4487 [Jsoi2015]染色问题 题目描述 传送门 题目分析 发现三个限制,大力容斥推出式子是\(\sum_{i=0}^{N}\sum_{j=0}^{M}\sum_{k=0}^{C}(- ...

  6. Elasticsearch 配置优化

    cluster.routing.allocation.same_shard.host:true 这会防止同一个shard的主副本存在同一个物理机上(因为如果存在一个机器上,副本的高可用性就没有了). ...

  7. C#470多例winform 界面特效的源码

    一共470多例winform 界面特效的源码. 窗体与界面设计... 9 实例001  带历史信息的菜单    10 实例002  菜单动态合并    12 实例003  像开始菜单一样漂亮的菜单.. ...

  8. java 多继承的典型应用实例(不同的报文不同的方法去解析)

    关于 java 多继承的典型应用实例 针对不同业务类型的XML文件的解析 在PCS 项目: public class CainiaoXMLMessageResolverServiceImpl impl ...

  9. MVVM架构说明1

    MVVM是Model-View-ViewModel的简写.微软的WPF带来了新的技术体验,如Sliverlight.音频.视频.3D.动画……,这导致了软件UI层更加细节化.可定制化.同时,在技术层面 ...

  10. C# 集合类 Array,Arraylist,List,Hashtable,Dictionary...

    我们用的比较多的非泛型集合类主要有 ArrayList类 和 HashTable类.我们经常用HashTable 来存储将要写入到数据库或者返回的信息,在这之间要不断的进行类型的转化,增加了系统装箱和 ...