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. winform webbrowser禁用网页target=blank

    /// <summary> /// 屏蔽target=_blank 的弹出窗口 /// </summary> /// <param name="sender&q ...

  2. Linux内核模块编写详解

    内核编程常常看起来像是黑魔法,而在亚瑟 C 克拉克的眼中,它八成就是了.Linux内核和它的用户空间是大不相同的:抛开漫不经心,你必须小心翼翼,因为你编程中的一个bug就会影响到整个系统,本文给大家介 ...

  3. Python 面向对象的综合应用

    # 面向对象的综合应用 # 计算器:实现一些基本的计算操作,已经打印结果 # --------------- 代码1 ---------------------- def add(x, y): ret ...

  4. Java JDBC概要总结一(基本操作和SQL注入问题)

    JDBC定义: JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API.JDBC是Java访问数据库的标准规范,可以为不同的关系 ...

  5. android studio 连接 华为手机真机

    1.手机开启开发者模式(Honor V10) 设置->关于手机->连续点击版本号5次就能出现开发者模式->返回上一级出现开发者选项->打开选项(开发者选项,USB调试) 2.a ...

  6. CentOS上使用sendmail发送邮件

    设置方法 set from=fromUser@domain.com smtp=smtp.domain.com set smtp-auth-user=username smtp-auth-passwor ...

  7. RQN 273 马棚问题 dp

    PID273 / 马棚问题  2016-07-29 18:21:55 运行耗时:1624 ms 运行内存:16248 KB 题目描述 每天,小明和他的马外出,然后他们一边跑一边玩耍.当他们结束的时候, ...

  8. LeetCode第[17]题(Java):Letter Combinations of a Phone Number

    题目:最长公共前缀 难度:EASY 题目内容: Given a string containing digits from 2-9 inclusive, return all possible let ...

  9. ng2 学习笔记(三)依赖注入与服务

    前两篇文章简单介绍了ng2的一些基础用法,基本和ng1的使用风格差不多,只是写法和开发方式变化比较大. 这一篇,来总结一下ng的依赖注入与服务.官方的教程上是把他分开来讲的,个人感觉放在一起比较容易理 ...

  10. 【译】:python中的colorlog库

    本文翻译自colorlog官方文档 一. 描述 colorlog.ColoredFormatter是一个Python logging模块的格式化,用于在终端输出日志的颜色 二. 安装 pip inst ...