python模块hashlib(加密服务)知识点讲解

作者:Mr-chen 时间:2022-11-30 20:38:20 

官方文案:https://docs.python.org/zh-cn/3/library/hashlib.html

hashlib --- 安全哈希与消息摘要

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

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

hash算法

每种类型的hash都有一个构建器方法,返回一个hash对象和相同的简单接口。

例如:

使用sha256()创建一个SHA-256hash object。可以使用update()喂给它bytes-like object。然后可以用digest()或hexdigest()来获得数据的摘要。

hashlib模型有许多算法如:sha1(), sha224(), sha256(), sha384(), sha512(), blake2b(), and blake2s()。还有很多其他算法要看Python使用的OpenSSL libary。具体见文档。

使用algorithms_guaranteed常量,查看模块在所有平台都支持的算法:


>>> hashlib.algorithms_guaranteed
{'blake2s', 'sha256', 'sha3_512', 'sha1', 'shake_128', 'sha3_256', 'sha3_384', 'blake2b', 'sha3_224', 'sha512', 'md5', 'shake_256', 'sha224', 'sha384'}

使用algorithms_available常量,在编译器运行时可以的hash算法


>>> hashlib.algorithms_available
{'sha3_256', 'blake2b', 'md5', 'sha512_224', 'sha384', 'md4', 'sha256', 'sha512', 'whirlpool', 'sha224', 'sha512_256', 'shake_128', 'sha3_384', 'ripemd160', 'blake2s', 'sha3_512', 'sha1', 'sm3', 'shake_256', 'sha3_224', 'md5-sha1'}

例子:


>>> import hashlib
>>> m = hashlib.sha256()
>>> m.update(b" the spammish repetition")  #重复调用相当于,把bytes字节串相加。
>>> m.name  #hash算法的名字
'sha256'
>>> m.digest() #返回传入update()的数据的摘要
b'U<\x9bP\xb1\xa8\x9a\x9aE\x0f;h\xdb\x04\x11\xc1\x08\xfaH\xa7\t\xbfF\x91\x01\x13\xa1\x87\xb6\xd9`\x96'
>>> m.digest_size  #摘要的大小
>>> m.block_size  #hash算法内的块的大小
>>> m.hexdigest()  #返回一个字符串对象,一般用在安全的email或其他非binary环境
'553c9b50b1a89a9a450f3b68db0411c108fa48a709bf46910113a187b6d96096'
>>>

不同的算法安全不一样,sha256就比sha1安全,但越安全的算法不仅越慢,摘要长度更长。

摘要算法应用

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

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

例子:

存储MD5的好处是即使运维人员能访问数据库,也无法获知用户的明文口令。

设计一个验证用户登录的函数,根据用户输入的口令是否正确,返回True或False:


# -*- coding: utf-8 -*-
db = {
 'michael': 'e10adc3949ba59abbe56e057f20f883e',
 'bob': '878ef96e86145580c38c87f0410ad153',
 'alice': '99b1c2188db85afee403b1536010c2c9'
}

import hashlib

def calc_md5(password):
 m = hashlib.md5()
 m.update(password.encode('utf-8'))
 return m.hexdigest()

def login(user, password):
 return db[user] == calc_md5(password)

# 测试:
assert login('michael', '123456')
assert login('bob', 'abc999')
assert login('alice', 'alice2008')
assert not login('michael', '1234567')
assert not login('bob', '123456')
assert not login('alice', 'Alice2008')
print('ok')

希望脚本之家整理的相关知识点能够帮助到大家,感谢你们的支持。

来源:https://www.cnblogs.com/chentianwei/p/11926871.html

标签:python,hashlib
0
投稿

猜你喜欢

  • ORACLE常见错误代码的分析与解决(二)

    2010-08-02 13:31:00
  • pyinstaller封装exe的操作

    2021-02-12 03:21:16
  • 巧制可全屏拖动的图片

    2008-05-09 19:34:00
  • python构造函数init实例方法解析

    2022-09-30 15:09:19
  • Go事务中止时是否真的结束事务解析

    2023-07-07 11:35:35
  • SpringBoot项目application.yml文件数据库配置密码加密的方法

    2024-01-18 02:12:40
  • Node.js对MySQL数据库的增删改查实战记录

    2024-01-14 18:25:12
  • Python实现读取并保存文件的类

    2022-01-12 06:45:35
  • Ubuntu查看修改mysql的登录名和密码、安装phpmyadmin

    2023-11-21 23:36:59
  • 高效的MySQL分页

    2011-01-04 20:01:00
  • Python爬取微信小程序通用方法代码实例详解

    2021-04-08 15:30:09
  • Django实现微信小程序的登录验证功能并维护登录态

    2022-03-14 22:56:48
  • Python标准库os常用函数和属性详解

    2022-05-17 21:40:03
  • js和jquery判断数据类型的4种方法总结

    2023-08-25 08:49:18
  • vue-cli 引入jQuery,Bootstrap,popper的方法

    2024-05-21 10:17:21
  • 浅谈Django2.0 加xadmin踩的坑

    2022-03-03 11:00:24
  • Python发送手机动态验证码代码实例

    2021-10-18 23:42:32
  • Python常用小技巧总结

    2023-02-27 17:50:16
  • SqlServer 按时间段查询问题

    2024-01-19 02:15:35
  • Python 反转字符串(reverse)的方法小结

    2023-05-28 11:04:22
  • asp之家 网络编程 m.aspxhome.com