非常教程

Python参考手册

加密 | Cryptography

hashlib

2.5版本中的新功能。

源代码: Lib / hashlib.py

该模块实现了许多不同安全散列和消息摘要算法的通用接口。包括FIPS安全哈希算法SHA1,SHA224,SHA256,SHA384和SHA512(在FIPS 180-2中定义)以及RSA的MD5算法(在Internet RFC 1321中定义)。术语安全哈希和消息摘要是可以互换的。较早的算法被称为消息摘要。现代术语是安全散列。

注意

如果您需要adler32或crc32哈希函数,则它们在zlib模块中可用。

警告

一些算法已知散列冲突弱点,请参阅最后的“另请参见”部分。

有一种为每种类型的散列命名的构造函数方法。所有返回一个具有相同简单接口的哈希对象。例如:用于sha1()创建一个SHA1哈希对象。您现在可以使用该update()方法为任何字符串提供此对象。在任何时候,您都可以使用or 方法向它提供输入到它的字符串的摘要摘要digest()hexdigest()

散列算法,总是存在该模块中的构造是md5()sha1()sha224()sha256()sha384(),和sha512()。根据Python在您的平台上使用的OpenSSL库,还可以使用其他算法。

例如,要获取字符串的摘要'Nobody inspects the spammish repetition'

>>> import hashlib
>>> m = hashlib.md5()
>>> m.update("Nobody inspects")
>>> m.update(" the spammish repetition")
>>> m.digest()
'\xbbd\x9c\x83\xdd\x1e\xa5\xc9\xd9\xde\xc9\xa1\x8d\xf0\xff\xe9'
>>> m.digest_size
16
>>> m.block_size
64

更浓缩:

>>> hashlib.sha224("Nobody inspects the spammish repetition").hexdigest()
'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2'

new()将所需算法的字符串名称作为其第一个参数的泛型构造函数也存在以允许访问上面列出的散列以及OpenSSL库可能提供的任何其他算法。命名的构造函数比它更快new()并且应该是首选。

使用new()OpenSSL提供的算法:

>>> h = hashlib.new('ripemd160')
>>> h.update("Nobody inspects the spammish repetition")
>>> h.hexdigest()
'cc4a5ce1b3df48aec5d22d1f16b894a0b894eccc'

该模块提供了以下常量属性:

hashlib.algorithms

一个元组提供了保证这个模块支持的哈希算法的名字。

2.7版本的新功能。

hashlib.algorithms_guaranteed

包含散列算法名称的集合保证在所有平台上由该模块支持。

2.7.9版本的新功能。

hashlib.algorithms_available

包含正在运行的Python解释器中可用的哈希算法名称的集合。传递给这些名称将被识别new()algorithms_guaranteed将永远是一个子集。相同的算法可能会在不同的名称下出现多次(感谢OpenSSL)。

2.7.9版本的新功能。

以下值作为构造函数返回的哈希对象的常量属性提供:

hash.digest_size

结果散列的大小(以字节为单位)。

hash.block_size

散列算法的内部块大小(以字节为单位)。

哈希对象具有以下方法:

hash.update(arg)

用字符串arg更新散列对象。重复的调用相当于所有参数串联的单个调用:m.update(a); m.update(b)相当于m.update(a+b)

在2.7版本中进行了更改:释放Python GIL以允许其他线程运行,同时使用由OpenSSL提供的散列算法对大于2048字节的数据进行散列更新。

hash.digest()

返回传递给该update()方法的字符串的摘要。这是一串digest_size可能包含非ASCII字符的字节,包括空字节。

hash.hexdigest()

就像digest()除了摘要以双倍长度的字符串形式返回,只包含十六进制数字。这可以用于在电子邮件或其他非二进制环境中安全地交换该值。

hash.copy()

返回散列对象的副本(“克隆”)。这可用于有效计算共享初始子字符串的字符串摘要。

1.重点推导

密钥派生和密钥扩展算法是为安全密码散列而设计的。天真的算法sha1(password)不能抵抗强力攻击。一个好的密码哈希函数必须是可调的,速度慢,并且包含一个salt。

hashlib.pbkdf2_hmac(name, password, salt, rounds, dklen=None)

该函数提供了PKCS#5基于密码的密钥导出函数2.它使用HMAC作为伪随机函数。

字符串名称是HMAC散列摘要算法的所需名称,例如'sha1'或'sha256'。密码salt被解释为字节的缓冲区。应用程序和库应该将密码限制为合理的值(例如1024)。应该来自合适来源的大约16或更多字节,例如os.urandom()

应根据散列算法和计算能力来选择次数。截至2013年,建议至少有100,000轮SHA-256。

dklen是派生键的长度。如果dklenNone散列算法名称的摘要大小,例如SHA-512为64。

>>> import hashlib, binascii
>>> dk = hashlib.pbkdf2_hmac('sha256', b'password', b'salt', 100000)
>>> binascii.hexlify(dk)
b'0394a2ede332c9a13eb82e9b24631604c31df978b4e2f0fbd2c549944f9d79a5'

2.7.8版本的新功能。

注意

OpenSSL提供了pbkdf2_hmac的快速实现。Python实现使用一个内联版本hmac。它大约慢了三倍,并且不释放GIL。

加密 | Cryptography相关

Python

Python 是一种面向对象的解释型计算机程序设计语言,由荷兰人 Guido van Rossum 于1989年发明,第一个公开发行版发行于1991年。 Python 是纯粹的自由软件, 源代码和解释器 CPython 遵循 GPL 协议。Python 语法简洁清晰,特色之一是强制用空白符( white space )作为语句缩进。

主页 https://www.python.org/
源码 https://github.com/python/cpython
版本 2.7
发布版本 2.7.13

Python目录

1.内置常量 | Built-in Constants
2.内置例外 | Built-in Exceptions
3.内置函数 | Built-in Functions
4.内置类型 | Built-in Types
5.编译器 | Compiler
6.加密 | Cryptography
7.数据压缩 | Data Compression
8.数据持久性 | Data Persistence
9.数据类型 | Data Types
10.调试和分析 | Debugging & Profiling
11.开发工具 | Development Tools
12.文件和目录访问 | File & Directory Access
13.文件格式 | File Formats
14.构架 | Frameworks
15.输入 | Importing
16.输入/输出 | Input/ouput
17.国际化 | Internationalization
18.网络 | Internet
19.网络数据 | Internet Data
20.翻译 | Interpreters
21.语言 | Language
22.记录 | Logging
23.Mac OS
24.MS Windows
25.多媒体 | Multimedia
26.联网 | Networking
27.数字与数学 | Numeric & Mathematical
28.操作系统 | Operating System
29.可选操作系统 | Optional Operating System
30.限制执行 | Restricted Execution
31.运行 | Runtime
32.SGI IRIX
33.软件包装与分销 | Software Packaging & Distribution
34.字符串 | String
35.结构化标记 | Structured Markup
36.Tk
37.Unix
38.Python 简介
39.Python pass 语句
40.Python 循环嵌套
41.Python 运算符
42.Python log10() 函数
43.Python log() 函数
44.Python floor() 函数
45.Python fabs() 函数
46.Python exp() 函数
47.Python cmp() 函数
48.Python ceil() 函数
49.Python abs() 函数
50.Python Number(数字)
51.Python pow() 函数
52.Python modf() 函数
53.Python min() 函数
54.Python max() 函数
55.Python asin() 函数
56.Python acos() 函数
57.Python uniform() 函数
58.Python shuffle() 函数
59.Python seed() 函数
60.Python random() 函数
61.Python randrange() 函数
62.Python choice() 函数
63.Python sqrt() 函数
64.Python round() 函数
65.Python radians() 函数
66.Python degrees() 函数
67.Python tan() 函数
68.Python sin() 函数
69.Python hypot() 函数
70.Python cos() 函数
71.Python atan2() 函数
72.Python atan() 函数
73.Python 元组
74.Python 列表(List)
75.Python 字符串
76.Python 字典(Dictionary)
77.Python 日期和时间
78.Python 函数
79.Python 模块
80.Python capitalize()方法
81.Python center()方法
82.Python count() 方法
83.Python expandtabs()方法
84.Python endswith()方法
85.Python encode()方法
86.Python decode()方法
87.Python find()方法
88.Python index()方法
89.Python 异常处理
90.Python isspace()方法
91.Python isnumeric()方法
92.Python islower()方法
93.Python isdigit()方法
94.Python isalpha()方法
95.Python isalnum()方法
96.Python isupper()方法
97.Python istitle()方法
98.Python min()方法
99.Python max()方法
100.Python maketrans()方法