python hashlib_python加密之hashlib[通俗易懂]

python hashlib_python加密之hashlib[通俗易懂]1、强大的hashlib,提供了用于加密相关的操作,代替了md5模块和sha模块,主要提供SHA1,SHA224,SHA256,SHA384,SHA512,MD5算法2、hmac模块实现了hmac算法,需要一个key来进行加密,提供更为强大的加密,不过需要提供key,也就是通常说的盐3、使用hashlib.algorithms_available,可以查看hashlib提供的加密算法…

大家好,又见面了,我是你们的朋友全栈君。

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())

ContractedBlock.gif

ExpandedBlockStart.gif

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、自定义密码加密模块

ContractedBlock.gif

ExpandedBlockStart.gif

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

ContractedBlock.gif

ExpandedBlockStart.gif

1 #用于API认证的KEY,直接在settings配置,注意安全,不要随意泄露给它人

2 KEY = ‘299095cc-1330-11e5-b06a-a45e60bec08b’

settings

ContractedBlock.gif

ExpandedBlockStart.gif

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里面配置

ContractedBlock.gif

ExpandedBlockStart.gif

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禁止再次访问

ContractedBlock.gif

ExpandedBlockStart.gif

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.net/131122.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SQL语句多表连接查询语法

    SQL语句多表连接查询语法总结:内连接就是两个表的交集,左外连接就是左边表加两表交集,右外连接就是右边表加两表交集一、外连接1.左连接leftjoin或leftouterjoinSQL语句:select*fromstudentleftjoinscoreonstudent.Num=score.Stu_id;2.右连接rightjoin或r…

    2022年5月3日
    751
  • bigdecimal类型比较大小「建议收藏」

    bigdecimal类型比较大小「建议收藏」比较方法:BigDecimal类提供compareTo()方法来比较两个数的大小,例如:a=b返回0,a<b返回-1,a>b返回1,通过这三种比较返回的结果,我们还可“以比较a!=b、a>=b和a<=b这三种情况。importjava.math.BigDecimal;publicclassApplication{publicstaticvoidmain(String[]args){BigDecimala

    2022年7月14日
    17
  • 补码定点加减法运算判断溢出有哪些方法_补码加减法中

    补码定点加减法运算判断溢出有哪些方法_补码加减法中在带符号数的表示方法中,原码是最易于理解的编码,但是采用原码进行加减运算时,数值位和符号位需分开处理,操作比较麻烦,所以计算机中广泛采用补码进行加减运算。此外,在运算中还会涉及溢出判断、移位及舍人处理等相关操作。补码定点加减运算方法补码加减运算规则如下:参加运算的操作数及最后的运算结果均用补码表示; 操作数的符号位与数值位同时进行运算,即符号位作为数的一部分参加…

    2022年9月22日
    0
  • [安全攻防进阶篇] 二.如何学好逆向分析、逆向路线推荐及吕布传游戏逆向案例

    [安全攻防进阶篇] 二.如何学好逆向分析、逆向路线推荐及吕布传游戏逆向案例前文作者带领大家学习了什么是逆向分析、逆向分析的典型应用,接着通过OllyDbg工具逆向分析经典的游戏扫雷。这篇文章将继续普及逆向分析知识,告诉大家如何学好逆向分析,并结合作者经验给出逆向分析的路线推荐,最后给出吕布传游戏逆向案例。话不多说,让我们开始新的征程吧!您的点赞、评论、收藏将是对我最大的支持,感恩安全路上一路前行。基础性文章,希望对您有所帮助~

    2022年6月19日
    28
  • make menuconfig执行流程分析[通俗易懂]

    make menuconfig执行流程分析[通俗易懂]在编译内核前,一般是根据已有的配置文件(一般在内核根目录下的arch/arm/configs/文件夹下,把该目录下的xxx_defconfig文件拷贝到内核根目录下,并重命名为.config)来进行编译;或者需要先配置裁剪内核。假设我们要基于一块ARM芯片的开发板配置裁剪内核时,在内核的根目录下运行:makeARCH=armmenuconfig命令后,会弹出如下配置界面:…

    2022年6月12日
    24
  • 对象数组(C++学习笔记 20)[通俗易懂]

    对象数组(C++学习笔记 20)[通俗易懂]一、对象数组的定义所谓对象数组,指每一个数组元素都是对象的数组,即若一个类有若干个对象,我们把这一系列的对象用一个数组来存放。对象数组的元素是对象,不仅具有数据成员,而且还有函数成员。定义一个一维数组的格式如下:类名数组名[下标表达式]与基本数据类型的数组一样,在使用对象数组时也只能访问单个数组元素,其一般形式为:数组名[下标].成员名在建立数组时,同样要调用构造函数。有几个数组元…

    2022年7月12日
    19

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号