hashlib模块

    Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。

什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。

举个例子,你写了一篇文章,内容是一个字符串'how to use python hashlib - by Michael',并附上这篇文章的摘要是'2d73d4f15c0db7f5ecb321b6a65e5d6d'。如果有人篡改了你的文章,并发表为'how to use python hashlib - by Bob',你可以一下子指出Bob篡改了你的文章,因为根据'how to use python hashlib - by Bob'计算出的摘要不同于原始文章的摘要。

可见,摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。

摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。

下面就是一个加密算法的形式:

import hashlib

m = hashlib.md5()
m.update(b"Hello")
m.update(b"It's me")
print(m.digest())
m.update(b"It's been a long time since last time we ...") print(m.digest()) #2进制格式hash
print(len(m.hexdigest())) #16进制格式hash

运行结果如下:

5ddeb47b2f925ad0bf249c52e342728a
  fef3d1cb846deb62c96ab4a65a80bc6d
  5ddeb47b2f925ad0bf249c52e342728a
  b'[\xa1C\x11\xa1\xb24\x03M\xa0\xe0P=\xdf\x94\xb9'
  32

m.update(b"Hello")和m.update(b"It's me")是把两个字符串拼接之后进行加密,等价于对m.update(b"HelloIt's me"),就是对内容进行加密的情况,是不能反解。

    1. md5加密

import hashlib
hash = hashlib.md5()
hash.update("admin".encode("utf-8"))
print(hash.hexdigest())
运行结果如下:
21232f297a57a5a743894a0e4a801fc3

    2.sha1加密

import hashlib

hash = hashlib.sha1()
hash.update("admin".encode("utf-8"))
print(hash.hexdigest())
运行结果如下:
d033e22ae348aeb5660fc2140aec35850c4da997

    3.sha256加密

import hashlib

hash = hashlib.sha256()
hash.update("admin".encode("utf-8"))
print(hash.hexdigest())
运行如下:
8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918

    4.sha384加密

import hashlib

hash = hashlib.sha384()
hash.update("admin".encode("utf-8"))
print(hash.hexdigest())
运行结果如下:
9ca694a90285c034432c9550421b7b9dbd5c0f4b6673f05f6dbce58052ba20e4248041956ee8c9a2ec9f10290cdc0782

    5.sha512加密

import hashlib

hash = hashlib.sha512()
hash.update("admin".encode("utf-8"))
print(hash.hexdigest())
运行结果如下:
9ca694a90285c034432c9550421b7b9dbd5c0f4b6673f05f6dbce58052ba20e4248041956ee8c9a2ec9f10290cdc0782

    6. ‘加盐’加密

以上加密算法虽然很厉害,但仍然存在缺陷,通过撞库可以反解。所以必要对加密算法中添加自定义key再来做加密。

import hashlib

  m = hashlib.md5()
  m.update("admin".encode("utf-8"))
  print(m.hexdigest())

  hash = hashlib.md5("python".encode("utf-8"))
  hash.update("admin".encode("utf-8"))
  print(hash.hexdigest())

运行结果如下:

21232f297a57a5a743894a0e4a801fc3
  75b431c498b55557591f834af7856b9f

从上面可以看出,要想增加撞库的难度,可以增加密码的难度。

7. hmac加密

import hmac

  m = hmac.new("python".encode('utf-8'))
  m.update("admin".encode('utf-8'))
  print(m.hexdigest())

运行结果如下:

540f0bf357bfda39ceee96c8e97b2e9e

比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法越慢,而且摘要长度更长。

有没有可能两个不同的数据通过某个摘要算法得到了相同的摘要?完全有可能,因为任何摘要算法都是把无限多的数据集合映射到一个有限的集合中。这种情况称为碰撞,比如Bob试图根据你的摘要反推出一篇文章'how to learn hashlib in python - by Bob',并且这篇文章的摘要恰好和你的文章完全一致,这种情况也并非不可能出现,但是非常非常困难。

摘要算法应用

摘要算法能应用到什么地方?举个常用例子:

  任何允许用户登录的网站都会存储用户登录的用户名和口令。如何存储用户名和口令呢?方法是存到数据库表中:

  name  | password
  --------+----------
  michael | 123456
  bob   | abc999
  alice  | alice2008

如果以明文保存用户口令,如果数据库泄露,所有用户的口令就落入黑客的手里。此外,网站运维人员是可以访问数据库的,也就是能获取到所有用户的口令。

正确的保存口令的方式是不存储用户的明文口令,而是存储用户口令的摘要,比如MD5:

  username | password
  ---------+---------------------------------
  michael | e10adc3949ba59abbe56e057f20f883e
  bob   | 878ef96e86145580c38c87f0410ad153
  alice  | 99b1c2188db85afee403b1536010c2c9

当用户登录时,首先计算用户输入的明文口令的MD5,然后和数据库存储的MD5对比,如果一致,说明口令输入正确,如果不一致,口令肯定错误。

    小结:

摘要算法在很多地方都有广泛的应用。要注意摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改,但是它的单向计算特性决定了可以在不存储明文口令的情况下验证用户口令。

下面下了一个简单的加密登录程序:

import json,hashlib

def register():
'''用户注册模块,注册之后存储到文件数据库中'''
name = input("Please input you register's name: ")
pwd = input("Please input you password:")
hash = hashlib.md5()
hash.update(pwd.encode("utf-8"))
pwd = hash.hexdigest()
sex = input("Please input your sex:")
age = input("Please input your age:")
mail = input("Please input your mail:")
address = input("请输入你的地址:")
message = {"name":name,"sex":sex,"age":age,"mail":mail,"address":address,"pwd":pwd}
with open("user_db.json",'w') as f:
json.dump(message,f) def login():
'''用户登录验证模块,从上面存储的用户数据库中找数据,也使用加密验证是否正确'''
while True:
m = hashlib.md5()
name = input("请输入你的用户名:")
m.update(input("请输入你的密码:").encode('utf-8'))
password = m.hexdigest()
with open("user_db.json",'r') as f1:
user_dic = json.load(f1) if name == user_dic["name"] and password == user_dic["pwd"]:
print("欢迎光临,登录成功!")
return
else:
print("您输入的用户名或密码不对,请核对后输入!") login()

运行结果如下:

请输入你的用户名:geng
  请输入你的密码:admin
  您输入的用户名或密码不对,请核对后输入!
  请输入你的用户名:耿长学
  请输入你的密码:admin
  欢迎光临,登录成功!

其实hashlib存在的意义就是加密,加密是为了防止以明文的方式让别人获取用户信息,所以要通过加密进行保证,即便黑客获取了用户信息,但是由于密码或者关键部分使用加密算法,黑客看到的只是加密之后的信息。由于Md5是不能反解的,只能通过撞库碰运气,因此密码要相对负责一些。

day5模块学习--hashlib模块的更多相关文章

  1. hmac模块和hashlib模块

    hmac模块和hashlib模块 一.hash是什么 ​ hash是一种算法(Python3.版本里使用hashlib模块代替了md5模块和sha模块,主要提供 SHA1.SHA224.SHA256. ...

  2. 包、logging模块、hashlib模块、openpyxl模块、深浅拷贝

    包.logging模块.hashlib模块.openpyxl模块.深浅拷贝 一.包 1.模块与包 模块的三种来源: 1.内置的 2.第三方的 3.自定义的 模块的四种表现形式: 1.py文件 2.共享 ...

  3. [xml模块、hashlib模块、subprocess模块、os与sys模块、configparser模块]

    [xml模块.hashlib模块.subprocess模块.os与sys模块.configparser模块] xml模块 XML:全称 可扩展标记语言,为了能够在不同的平台间继续数据的交换,使交换的数 ...

  4. day5模块学习 -- os模块学习

    python基础之模块之os模块 os模块 os模块的作用: os,语义为操作系统,所以肯定就是操作系统相关的功能了,可以处理文件和目录这些我们日常手动需要做的操作,就比如说:显示当前目录下所有文件/ ...

  5. python-Day5-深入正则表达式--冒泡排序-时间复杂度 --常用模块学习:自定义模块--random模块:随机验证码--time & datetime模块

    正则表达式   语法:             mport re #导入模块名 p = re.compile("^[0-9]") #生成要匹配的正则对象 , ^代表从开头匹配,[0 ...

  6. Python模块之hashlib模块、logging模块

    一.hashlib模块 hashlib模块介绍:hashlib这个模块提供了摘要算法,例如 MD5.hsa1 摘要算法又称为哈希算法,它是通过一个函数,把任意长度的数据转换为一个长度固定的数据串,这个 ...

  7. 19 python初学(os 模块,sys 模块,hashlib 模块)

    os 模块: # _author: lily # _date: 2019/1/13 import os print(os.getcwd()) # 得到当前的工作目录 # print(os.chdir( ...

  8. re模块、hashlib模块

    一.re模块 1.什么是正则? 正则就是用一系列具有特殊含义的字符组成一套规则,该规则用来描述具有某一特征的字符串,正则就是用来去一个大的字符串中匹配出符合规则的子字符串 2.为何要用正则? 用户注册 ...

  9. 模块讲解----hashlib模块(加密)

    作用 用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 语法 import hashlib #md5 ...

随机推荐

  1. 二维数组和指针(C语言)

    二维数组和指针 二维数组和指针1.二维数组和数组元素的地址若有以下定义:int *p, a[3][4]; 1)二维数组a由若干个一维数组组成在C语言中定义的二维数组实际上是一个一维数组,这个一维数组的 ...

  2. CF&&CC百套计划1 Codeforces Round #449 B. Ithea Plays With Chtholly

    http://codeforces.com/contest/896/problem/B 题意: 交互题 n张卡片填m个1到c之间的数,1<=n*ceil(c/2)<=m 最后填出一个单调非 ...

  3. 机器学习算法整理(一)线性回归与梯度下降 python实现

    回归算法 以下均为自己看视频做的笔记,自用,侵删! 一.线性回归 θ是bias(偏置项) 线性回归算法代码实现 # coding: utf-8 ​ get_ipython().run_line_mag ...

  4. Git之简介及安装

    简介 Git是一个分布式版本控制系统,GitHub相当于一个远程仓库,注册账号可免费获得Git远程仓库. GitHub使用参考:https://guides.github.com/activities ...

  5. 关于File 文件操作

    1.通过Context.getExternalFilesDir()方法可以获取到 SDCard/Android/data/你的应用的包名/files/ 目录,一般放一些长时间保存的数据2.通过Cont ...

  6. eclipse 无法解析导入 javax.servlet 的解决方法

    出现上述问题的原因是你的Eclipse项目没有导入JSP运行所需要的Tomcat类库,主要是servlet-api.jar文件(或者servlet.jar),tomcat容器里面有这文件,在以下位置: ...

  7. ssh 批量执行命令

    # python3.5 + paramiko # pip 是python的包管理工具,在shell里执行如下命令安装paramoko模块 # pip install paramiko # import ...

  8. 打包python脚本为exe的坎坷经历, by pyinstaller方法

    打包python脚本为exe的坎坷经历, by pyinstaller方法 又应验了那句歌词. 不经历风雨, 怎么见得了彩虹. 安装过程略去不提, 仅提示: pip install pyinstall ...

  9. 15个超级实用的jQuery插件

    jQuery是一个可订制的.轻量级的前端开发框架,它会让你的前端开发拥有无限的可能性.它会在敏捷Web开发中帮你做很多事情,比如简化HTML文档的解析.事件处理.动画效果和Ajax交互.实践上jQue ...

  10. 20155322 2016-2017-2 《Java程序设计》第5周学习总结

    20155322 2016-2017-2 <Java程序设计>第5周学习总结 教材学习内容总结 本周的学习任务是课本第八第九章: 第八章主要是讲异常处理.这里要理解Java的错误以对象的方 ...