hashlib 模块

1.干嘛用的: 对字符进行加密,其实就是一个自定义的字符编码表,我们原来接触的是计算机语言0和1然后转化成字符,而hashlib就是把字符转成另一种字符,在生活中具有实际的应用,特别是在军事上

打个比方 我们 输入一些字符,经过加密后得到一些其他字符

123 ----->sin

234 ----->cos

sin ------>tan

hashlib 模块算法有很多,但是hashlib.md5() 算法用的多,因为该方法比较难解,当然也可以解,后面会告诉大家可以解码,称为撞库解码

import hashlib
m = hashlib.md5() #相比较难破解
pwd = b'123' #将123转换为二进制
# pwd = 'helloworld'.encode('utf8') # 二进制,也可以用这种形式
# pwd = '123456'.encode('utf8')
m.update(pwd)
print(m.hexdigest())

'123' 202cb962ac59075b964b07152d234b70

'helloworld' fc5e038d38a57032085441e7fe7010b0

'123456' e10adc3949ba59abbe56e057f20f883e

import hashlib
m = hashlib.md5()
m.update(b'123456')
m.update(b'123')
print(m.hexdigest()) # update会更新累加,从上一个后面加上
m = hashlib.md5()
m.update(b'123456123')
print(m.hexdigest()) 579d9ec9d0c3d687aaa91289ac2854e4
579d9ec9d0c3d687aaa91289ac2854e4

通过观察发现运用

1.hash加密后长度一样

2.hash加密的东西则哈希结果一样

3.如果使用同一个哈希字符编码表,不断地哈希结果后累加

破解密码

hash加密算法虽然看起来很厉害,但是存在一定的缺陷,可以通过撞库进行反解,如下代码演示

#它的密码一定是其中一个
import hashlib pwd_list = [
'hash3714',
'hash1313',
'hash94139413',
'hash123456',
'123456hash',
'h123ash',
] def break_pwd(hash_pwd):
for pwd in pwd_list:
m = hashlib.md5()
m.update(pwd.encode('utf8'))
if m.hexdigest() == hash_pwd:
return pwd if __name__ == '__main__': # 密码hash后的值
hash_pwd = 'f5487bd407f327d7be8f2131e136e413'
pwd = break_pwd(hash_pwd)
print('这个傻逼用户的密码是', pwd) # 加,相当于空格 #这个傻逼用户的密码是 hash94139413

hmac 模块

为了防止密码被撞库,我们可以使用python中的hmac模块,它内部对我们创建的key和内容做过某种处理后再加密,这样别人只能拿到update中的数据,却不知道初始设置的值,还可以根据时间来生成不重复的new中的key值

import hmac
h1 = hmac.new(b'gll') # 被称为盐处理,new里面的值可以随便设
h1.update(b'hello')
h1.update(b'world')
print(h1.hexdigest()) h2 = hmac.new(b'gll')
h2.update(b'helloworld')
print(h2.hexdigest()) h3 = hmac.new(b'gllhelloworld')
print(h3.hexdigest()) #49dd920a469ab74045e5946618c18941
#49dd920a469ab74045e5946618c18941
#9bafa0b9ad7ee28a1ccbd86bcce9d3d8

从以上例子可以看出,如果想要保证hmac模块最终结果一致,必须保证:

1.hmac.new括号内指定的初始key一样

2.无论update多少次,检验的内容,累加到一起是一样的内容

可以用python中的uuid模块,产生用于加密的字符

import uuid

for i in range(5): #控制循环多少次
print(uuid.uuid4()) # 永不重复,因为它是按照时间来生成的
# print(i, uuid.uuid4()) #9d3ce635-28ce-4ecf-8ee7-1706643db0a7
#0951146d-c99f-4c80-9729-6d4d9e12d52f
#4768cba9-aafd-4d74-956c-bc267094f0db
#792bccf5-8809-4b71-87e1-25e630ddb393
#05982e73-ff6f-4781-b98d-dd87d09a7870

最新文章

  1. Windows Phone App的dump文件实例分析-Stack Overflow
  2. 安卓actionbar源码
  3. Linq_Lambda GroupBy使用笔记
  4. ArcGIS API for Silverlight 绘制降雨路径动画
  5. url重写后发布出错问题
  6. dede 单表模型动态浏览设置 arclistsg arc.sglistview.class.php
  7. Codeforces Round #243 (Div. 2) A~C
  8. matlab color_rain colorbar
  9. 2014年下半年计划—写博客,旅游,带女朋友拍写真
  10. insert into table1 (column1,column2) select column1,column2 from table2 where 条件
  11. 解决虚拟机下安装CentOS无法上网
  12. shell版的nginx安装
  13. Mysql必知必会 第一章 了解SQL
  14. LeetCode 595. Big Countries
  15. 小程序json字符串转为对象
  16. 编程使用缓冲流读取试题文件,test6_5.txt 内容如下所示。 每次显示试题文件中的一道题目,读取到字符“*”时暂停读取, 等待用户从键盘输入答案。用户做完全部题目后,程序给出用户的得分。
  17. elasticsearch系列二:索引详解(快速入门、索引管理、映射详解、索引别名)
  18. Memoization-329. Longest Increasing Path in a Matrix
  19. 为何说 JavaScript 开发很疯狂
  20. Scala-构造函数

热门文章

  1. ES6:string.raw浅析
  2. SSRS-lookupSet-DataSet-分组查询
  3. CDH5.7.2离线部署笔记
  4. Windows1
  5. Linq 根据list属性去重复
  6. html5 新增表单控件和表单属性
  7. 《Ionic 2 实例开发》发布
  8. PostgreSQL缓存
  9. 洛谷 P1588 丢失的牛
  10. python基础教程总结13——网络编程,