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. MySQL-5.7 Update语句详解

    1.语法 (1)单表 UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET assignment_list [WHERE where_condition ...

  2. MyEclipse激活失败

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

  3. 如何编写自己的虚拟DOM

    要构建自己的虚拟DOM,需要知道两件事.你甚至不需要深入 React 的源代码或者深入任何其他虚拟DOM实现的源代码,因为它们是如此庞大和复杂--但实际上,虚拟DOM的主要部分只需不到50行代码. 有 ...

  4. jQuery幻灯片播放器插件

    在线演示 本地下载

  5. session的活化与钝化 (转)

    session的活化与钝化就是当用户访问时网站异常,不能丢掉session,所有也必须采用文件存储:和之前那个统计网站访问量一样的原理. class Person implements必须实现这两个接 ...

  6. 第九节课-CNN架构

    2017-08-21 这次的课程比较偏向实际的运用,介绍了当前几种比较主流的CNN网络: 主要是AlexNet,GoogleNet, VGG, ResNet 需要把课后习题做了才能更好的理解.

  7. maven编译时GBK错误

    一.问题描述 今天在MyEclipse中使用Maven编译项目源代码时,结果如下了如下的错误 百思不得其解啊,Java源代码在MyEclipse中显示是没有任何错误的,可是执行"maven ...

  8. SQL命令查询Oracle存储过程信息(代码内容等)

    SELECT * FROM ALL_SOURCE  where TYPE='PROCEDURE'  AND TEXT LIKE '%0997500%'; --查询ALL_SOURCE中,(脚本代码)内 ...

  9. NLP(二)_汉语言分词技术-最大匹配法

    前述 词是自然语言中最小的有意义的构成单位.汉语文本是基于单字的文本,汉语的书面表达方式以汉字作为最小单元,词与词之间没有明显的界限标志,因此,分词是汉语文本分析处理中首先要解决的问题之一. 分词可能 ...

  10. Windows Desktop Optimization.bat

    界面: github: https://github.com/m2nlight/WindowsDesktopOptimization Config Service [Disabled] Windows ...