day5模块学习--hashlib模块

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是不能反解的,只能通过撞库碰运气,因此密码要相对负责一些。

时间: 2024-10-04 21:24:13

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

处理xml模块、configparser模块、hashlib模块、subprocess模块

xml模块 新建a.xml内容为: <data> <country name="Liechtenstein"> <rank updated="yes">2</rank> <year updated="yes" version="1.0">2009</year> <gdppc>141100</gdppc> <neighbor d

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

包.logging模块.hashlib模块.openpyxl模块.深浅拷贝 一.包 1.模块与包 模块的三种来源: 1.内置的 2.第三方的 3.自定义的 模块的四种表现形式: 1.py文件 2.共享库 3.文件夹(一系列模块的结合体),即包 4.C++编译的连接到Python内置的 2.模块的导入过程 先产生一个执行文件的名称空间 1.创建模块文件的名称空间 2.执行模块文件中的代码,将产生的名字放入模块的名称空间中 3.在执行文件中拿到一个指向模块名称空间的名字 3.什么是包 它是一系列模块

day5模块学习 -- os模块学习

python基础之模块之os模块 os模块 os模块的作用: os,语义为操作系统,所以肯定就是操作系统相关的功能了,可以处理文件和目录这些我们日常手动需要做的操作,就比如说:显示当前目录下所有文件/删除某个文件/获取文件大小-- 另外,os模块不受平台限制,也就是说:当我们要在linux中显示当前命令时就要用到pwd命令,而Windows中cmd命令行下就要用到这个,额...我擦,我还真不知道,(甭管怎么着,肯定不是pwd),这时候我们使用python中os模块的os.path.abspath

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

os 模块: # _author: lily # _date: 2019/1/13 import os print(os.getcwd()) # 得到当前的工作目录 # print(os.chdir(r'D:\Program Files')) #改变当前的工作目录 # 这里 r 的意思是所有字符都是原生字符,避免转义 print(os.curdir) # . print(os.pardir) # .. # os.mkdir('abc') # 只能生成一个目录,不能生成嵌套的形式 # os.mkd

包,logging模块,hashlib模块,openpyxl模块,深拷贝,浅拷贝

1 包 研究模块与包 还可以站另外两个角度分析不同的问题1.模块的开发者2.模块的使用者 什么是包? 它是一系列模块文件的结合体,表示形式就是一个文件夹 该文件夹内部通常会有一个__init__.py文件 包的本质还是一个模块 首次导入包: 先产生一个执行文件的名称空间 1.创建包下面的__init__.py文件的名称空间 2.执行包下面的__init__.py文件中的代码 将产生的名字放入包下面的__init__.py文件名称空间中 3.在执行文件中拿到一个指向包下面的__init__.py文

loggin模块,hashlib模块

一.loggin模 1.日志级别 CRITICAL = 50 #FATAL = CRITICAL ERROR = 40 WARNING = 30 #WARN = WARNING INFO = 20 DEBUG = 10 NOTSET = 0 #不设置 2. 默认级别为warning,默认打印到终端 import logging logging.debug('调试debug') logging.info('消息info') logging.warning('警告warn') logging.err

模块讲解---time模块,datetime模块,random模块,hashlib模块和hmac模块,typing模块,requests模块,re模块

目录 1. 包 2. time模块 ??1. 优先掌握 2. 了解 3. datetime模块 ??1. 优先掌握 4. random模块 ??1. 优先掌握 ??2. 了解 5. hashlib模块和hmac模块 6. typing模块 7. requests模块 8. re模块 ??1. re模块的正则表达式的元字符和语法 ??2. 贪婪模式和非贪婪模式 ??3. 匹配邮箱实例 ??4. re模块中的常用功能函数 ??5. 修饰符 re.S ??6. 补充 目录 \1. 包 1. 优先掌握

python模块学习 hashlib

一.hashlib概述 涉及加密服务:14. Cryptographic Services 其中 hashlib是涉及安全散列和消息摘要,提供多个不同的加密算法借口,如SHA1.SHA224.SHA256.SHA384.SHA512.MD5等. import hashlib m = hashlib.md5() #创建hash对象,md5:(message-Digest Algorithm 5)消息摘要算法,得出一个128位的密文 print m #<md5 HASH object @ 00000

day5模块学习--random模块

Python中的random模块用于生成随机数 下面具体介绍random模块的功能:   1.random.random() #用于生成一个0到1的浮点数   随机浮点数:0<= n < 1.0 >>> import random >>> random.random() 0.10014889182317255 >>> random.random() 0.9318386759483899 >>> random.random(