Python3 hashlib密码散列算法原理详解

作者:爱编程的小灰灰 时间:2021-07-06 12:59:55 

1.hashlib密码散列

hashlib模块定义了一个API来访问不同的密码散列算法。要使用一个特定的散列算法,可以用适当的构造器函数或new()来创建一个散列对象。不论使用哪个具体的算法,这些对象都使用相同的API。

1.1 散列算法

由于hashlib有OpenSSL提供“底层支持”,所以OpenSSL库提供的所有算法都可用,包括:

  • md5

  • sha1

  • sha224

  • sha256

  • sha384

  • sha512

有些算法在所有平台上都可用,而有些则依赖于底层库。这两种算法分别由algorithms_guaranteed和algorithms_available提供。


import hashlib
print('Guaranteed:\n{}\n'.format(
 ', '.join(sorted(hashlib.algorithms_guaranteed))))
print('Available:\n{}'.format(
 ', '.join(sorted(hashlib.algorithms_available))))

Guaranteed:
blake2b, blake2s, md5, sha1, sha224, sha256, sha384, sha3_224, sha3_256, sha3_384, sha3_512, sha512, shake_128, shake_256
Available:
DSA, DSA-SHA, MD4, MD5, RIPEMD160, SHA, SHA1, SHA224, SHA256, SHA384, SHA512, blake2b, blake2s, dsaEncryption, dsaWithSHA, ecdsa-with-SHA1, md4, md5, ripemd160, sha, sha1, sha224, sha256, sha384, sha3_224, sha3_256, sha3_384, sha3_512, sha512, shake_128, shake_256, whirlpool

1.2 MD5示例

要为一个数据块(在这里就是转换为一个字节串的Unicode串)计算MD5散列或摘要,首先要创建散列对象,然后增加数据,最后调用digest()或hexdigest()。


import hashlib
lorem = '''Lorem ipsum dolor sit amet, consectetur adipisicing
elit, sed do eiusmod tempor incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam, quis nostrud exercitation
ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis
aute irure dolor in reprehenderit in voluptate velit esse cillum
dolore eu fugiat nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui officia deserunt
mollit anim id est laborum.'''
h = hashlib.md5()
h.update(lorem.encode('utf-8'))
print(h.hexdigest())

这个例子使用了hexdigest()方法而不是digest(),因为要格式化输出以便清楚的打印。如果可以接受二进制摘要值,那么可以使用digest()。

Python3 hashlib密码散列算法原理详解

1.3 SHA1示例

SHA1摘要也用同样的方式计算。


import hashlib
lorem = '''Lorem ipsum dolor sit amet, consectetur adipisicing
elit, sed do eiusmod tempor incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam, quis nostrud exercitation
ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis
aute irure dolor in reprehenderit in voluptate velit esse cillum
dolore eu fugiat nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui officia deserunt
mollit anim id est laborum.'''
h = hashlib.sha1()
h.update(lorem.encode('utf-8'))
print(h.hexdigest())

这个例子中的摘要值有所不同,因为MD5和SHA1算法不同。

Python3 hashlib密码散列算法原理详解

1.4 增量更新

散列计算器的update()方法可以反复调用。每次调用时,都会根据提供的附加文本更新摘要。增量更新比将整个文件读入内存更高效,而且能生成相同的结果。


import hashlib
lorem = '''Lorem ipsum dolor sit amet, consectetur adipisicing
elit, sed do eiusmod tempor incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam, quis nostrud exercitation
ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis
aute irure dolor in reprehenderit in voluptate velit esse cillum
dolore eu fugiat nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui officia deserunt
mollit anim id est laborum.'''
h = hashlib.md5()
h.update(lorem.encode('utf-8'))
all_at_once = h.hexdigest()
def chunkize(size, text):
 "Return parts of the text in size-based increments."
 start = 0
 while start < len(text):
   chunk = text[start:start + size]
   yield chunk
   start += size
 return
h = hashlib.md5()
for chunk in chunkize(64, lorem.encode('utf-8')):
 h.update(chunk)
line_by_line = h.hexdigest()
print('All at once :', all_at_once)
print('Line by line:', line_by_line)
print('Same    :', (all_at_once == line_by_line))

这个例子展示了读取或生成数据时如何以增量方式更新一个摘要。

Python3 hashlib密码散列算法原理详解

来源:https://www.cnblogs.com/liuhui0308/p/12588244.html

标签:Python,hashlib,密码,散列,算法
0
投稿

猜你喜欢

  • PHPStudy下如何为Apache安装SSL证书的方法步骤

    2023-11-14 18:57:09
  • Python实战之设计一个多功能办公小工具

    2023-05-26 02:54:11
  • 详解SQL Server数据库架构和对象、定义数据完整性

    2024-01-23 06:48:16
  • 手把手教你使用Python创建微信机器人

    2022-02-11 14:12:29
  • 利用arcgis的python读取要素的X,Y方法

    2023-03-13 11:27:05
  • 一个效果写的HashTable代码

    2024-04-10 13:57:49
  • Python实现将一个正整数分解质因数的方法分析

    2021-01-09 10:39:29
  • Golang标准库syscall详解(什么是系统调用)

    2024-05-28 15:23:35
  • python nohup 实现远程运行不宕机操作

    2023-10-21 02:21:44
  • ThinkPHP3.0略缩图不能保存到子目录的解决方法

    2024-04-30 08:47:06
  • git本地分支和stash内容报错消失的问题

    2023-10-19 01:48:47
  • django实现日志按日期分割

    2023-07-20 04:25:21
  • 如何利用Python批量处理行、列和单元格详解

    2023-02-05 05:07:35
  • JavaScript开发的七个实用小技巧(很有用)

    2024-04-22 13:22:26
  • 抛砖:如何进行互联网项目开发

    2010-01-25 12:25:00
  • pycharm远程开发项目的实现步骤

    2023-07-17 06:01:54
  • DB2和 Oracle的并发控制(锁)的比较

    2009-02-28 10:29:00
  • MySQL特定表全量、增量数据同步到消息队列-解决方案

    2024-01-24 04:36:47
  • python中elasticsearch_dsl模块的使用方法

    2022-03-23 07:57:31
  • pytorch的batch normalize使用详解

    2023-12-23 04:24:26
  • asp之家 网络编程 m.aspxhome.com