大家好,又见面了,我是你们的朋友全栈君。
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())
1 Hash objects have these methods:2 – update(arg): Update the hash object with the bytes inarg. Repeated calls3 are equivalent to a single call with the concatenation of all4 the arguments.5 -digest(): Return the digest of the bytes passed to the update() method6 so far.7 – hexdigest(): Like digest() except the digest isreturned as a unicode8 object of double length, containing only hexadecimal digits.9 -copy(): Return a copy (clone) of the hash object. This can be used to10 efficiently compute the digests of strings that share a common11 initial substring.
官方说明
5、添加添加自定义key再来做加密
importhashlib######### md5 ########
hash= hashlib.md5(bytes(‘898oaFs09f’,encoding=”utf-8″))
hash.update(bytes(‘admin’,encoding=”utf-8″))print(hash.hexdigest())
6、直接使用hmac
importhmac
h= hmac.new(bytes(‘898oaFs09f’,encoding=”utf-8″))
h.update(bytes(‘admin’,encoding=”utf-8″))print(h.hexdigest())
7、自定义密码加密模块
1 #!/usr/bin/env python
2 #-*- coding: utf8 -*-
3 #__Author: “Skiler Hao”
4 #date: 2017/4/9 15:26
5 importhashlib6 from hashlib importsha2567 importrandom8 importhmac9
10
11 def_create_salt():12 salt = sha256(str(random.random()).encode(‘utf-8’)).hexdigest()[-8:]13 returnsalt14
15
16 def set_password(password,salt =None):17 if notsalt:18 salt =_create_salt()19 hashed_pwd = hmac.new(bytes(salt, encoding=(“utf-8”)))20 hashed_pwd.update(bytes(password, encoding=(“utf-8”)))21 return hashed_pwd.hexdigest() ’$’ salt22
23
24 defcheck_pwd(pwd, hashed_pwd_salt):25 hashed_pwd,salt = hashed_pwd_salt.split(‘$’)26 new_hash_pwd_salt =set_password(pwd,salt)27 if new_hash_pwd_salt ==hashed_pwd_salt:28 returnTrue29 else:30 return False
mypassword
8、对Web的api添加认证,增加安全性:
客户端:基于SECRET_KEY和时间,进行md5加密,生成动态的auth_key
1 #用于API认证的KEY,直接在settings配置,注意安全,不要随意泄露给它人
2 KEY = ‘299095cc-1330-11e5-b06a-a45e60bec08b’
settings
1 defauth_key(self):2 “””
3 用于生成auth_key,对key进行封装4 :return: 将加密后的动态key以字典形式返回5 “””
6 key = hashlib.md5(self.key.encode(‘utf-8’)) #将key作为盐先放进去,增加复杂度
7 auth_time = time.time() #获取当前时间,混入其中
8 key.update(bytes(“%s|%f” % (key, auth_time), encoding=’utf-8′))9 encryption_key =key.hexdigest()10 result = “%s|%f” %(encryption_key, auth_time)11 #可以将key放入request的headers部分,由于键不能为下划线,建议使用-
12 return {‘auth-key’: result}
客户端的加密过程
服务器端:
验证步骤:
1、验证时间是否过期,设置为5s,或者在settings里面配置
1 ASSET_AUTH_KEY = ‘299095cc-1330-11e5-b06a-a45e60bec08b’
2 ASSET_AUTH_HEADER_NAME = ‘HTTP_AUTH_KEY’
3 ASSET_AUTH_TIME = 2 #默认时间为秒
settings
2、收到的auth_key进行解密验证
3、3s内访问过的加入list禁止再次访问
defapi_auth_validation(request):#从请求的header部分拿到encryption_key
encryption_key_timestamp = request.META.get(‘HTTP_AUTH_KEY’)#拿不到则直接报错
if notencryption_key_timestamp:returnFalse
sp= encryption_key_timestamp.split(‘|’)#检查加密后的key,和时间是否用|隔开样式是否正确
if len(sp) != 2:returnFalse#拿到加密后的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
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:returnFalse
exist=False
del_keys=[]#拿到ENCRYPT_LIST,判断是否访问过
for k,v inenumerate(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 =Truefor k indel_keys:delENCRYPT_LIST[k]ifexist:returnFalse#验证完全通过加入到ENCRYPT_LIST
ENCRYPT_LIST.append({‘encrypt’:encryption_key,’time’:request_time})#最后再返回True
return True
具体方法
如有转载,请标明出处,如有任何建议,请留言
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/131122.html原文链接:https://javaforall.cn