使用Python Hashlib进行安全哈希处理 、以及HTML标签会保留。
本教程将教你如何使用Python的hashlib模块中的内置功能创建安全哈希。
了解哈希的重要性以及如何以编程方式计算安全哈希可能会很有帮助,即使你不从事应用程序安全工作。但是为什么呢?
嗯,当你在Python项目上工作时,你可能会遇到需要在数据库或源代码文件中存储密码和其他敏感信息的情况。在这种情况下,最好对敏感信息运行哈希算法,然后存储哈希而不是信息本身。
在本指南中,我们将介绍哈希是什么以及它与encryption的区别。我们还将讨论安全哈希函数的属性。然后,我们将使用常见的哈希算法在Python中计算明文的哈希。为此,我们将使用内置的hashlib模块。
要了解更多信息,请开始吧!
哈希是什么?
哈希的过程是将一个消息字符串作为输入,生成一个固定长度的输出,称为哈希。也就是说,给定一个哈希算法,无论输入的长度如何,输出哈希的长度都是固定的。但它与加密有什么不同呢?
在加密中,使用加密算法对消息或明文进行加密,生成加密输出。然后我们可以对加密输出运行解密算法,以获取回消息字符串。
然而,哈希的工作方式不同。我们刚刚学到,加密的过程是可逆的,即可以从加密消息到非加密消息,反之亦然。
与加密不同,哈希不是一个可逆的过程,这意味着我们无法从哈希获取输入消息。
哈希函数的属性
让我们快速了解一些哈希函数应满足的属性:
- 确定性:哈希函数是确定性的。给定一个消息m,其哈希始终相同。
- 抗原像:我们在讲到哈希不是可逆操作时已经提到了这一点。原像抗性属性表示从输出哈希中找到消息m是不可行的。
- 抗碰撞:应该很难(或在计算上不可行)找到两个不同的消息字符串m1和m2,使得m1的哈希等于m2的哈希。这个属性被称为碰撞抵抗性。
- 第二原像抗性:这意味着给定一个消息m1和相应的哈希m2,找到另一个消息m2使得哈希(m1) = 哈希(m2)是不可行的。
Python的hashlib模块
Python的内置hashlib模块提供了几种哈希和消息摘要算法的实现,包括SHA和MD5算法。
要使用Python hashlib模块的构造函数和内置函数,可以像这样将其导入到你的工作环境中:
import hashlib
hashlib模块提供了algorithms_available
和algorithms_guaranteed
常量,分别表示可用的算法集和在平台上可保证的算法集。
因此,algorithms_guaranteed
是algorithms_available
的子集。
启动Python REPL,导入hashlib并访问algorithms_available
和algorithms_guaranteed
常量:
>>> hashlib.algorithms_available
{‘md5', ‘md5-sha1', ‘sha3_256', ‘shake_128', ‘sha384', ‘sha512_256', ‘sha512', ‘md4',
‘shake_256', ‘whirlpool', ‘sha1', ‘sha3_512', ‘sha3_384', ‘sha256', ‘ripemd160', ‘mdc2',
‘sha512_224', ‘blake2s', ‘blake2b', ‘sha3_224', ‘sm3', ‘sha224'}
输出的哈希与我们之前获取的消息字符串“Geekflare is awesome!”的哈希完全相同。
探索哈希对象的属性
哈希对象有一些有用的属性:
digest_size
属性表示摘要的字节大小。例如,SHA256算法返回一个256位的哈希值,相当于32个字节block_size
属性是哈希算法中使用的块大小。name
属性是我们可以在new()
构造函数中使用的算法名称。当哈希对象没有描述性名称时,查找此属性的值可能会很有帮助。
我们可以检查之前创建的sha256_hash
对象的这些属性:
>>> sha256_hash.digest_size
32
>>> sha256_hash.block_size
64
>>> sha256_hash.name
'sha256'
接下来,让我们看一些使用Python的hashlib模块进行哈希的有趣应用。
哈希的实际应用示例
验证软件和文件的完整性
作为开发人员,我们经常下载和安装软件包。无论是在Linux distro上工作还是在Windows或Mac上工作,这都是真实的。
然而,一些软件包的镜像站点可能会被篡改。您可以在下载链接旁找到哈希(或校验和)。您可以通过计算哈希并将其与官方哈希进行比较来验证下载的软件的完整性。
这也可以应用于您机器上的文件。即使文件内容发生最小的更改,哈希也会发生巨大变化,您可以通过验证哈希来检查文件是否被修改。
这是一个简单的示例。在工作目录中创建一个名为'my_file.txt'的文本文件,并添加一些内容。
$ cat my_file.txt
This is a sample text file.
We are going to compute the SHA256 hash of this text file and also
check if the file has been modified by
recomputing the hash.
然后,您可以以读取二进制模式('rb'
)打开文件,读取文件的内容,并计算SHA256哈希,如下所示:
>>> import hashlib
>>> with open("my_file.txt","rb") as file:
... file_contents = file.read()
... sha256_hash = hashlib.sha256()
... sha256_hash.update(file_contents)
... original_hash = sha256_hash.hexdigest()
在这里,变量original_hash
是当前状态下'my_file.txt'的哈希值。
>>> original_hash
# Output: '53bfd0551dc06c4515069d1f0dc715d002d451c8799add29f3e5b7328fda9f8f'
现在修改文件'my_file.txt'。您可以删除单词'going'之前的额外前导空格。 :)
再次计算哈希并将其存储在computed_hash
变量中。
>>> import hashlib
>>> with open("my_file.txt","rb") as file:
... file_contents = file.read()
... sha256_hash = hashlib.sha256()
... sha256_hash.update(file_contents)
... computed_hash = sha256_hash.hexdigest()
然后可以添加一个简单的assert statement,断言computed_hash
是否等于original_hash
。
>>> assert computed_hash == original_hash
如果文件被修改(在本例中是真的),您应该会收到一个AssertionError:
Traceback (most recent call last):
File "", line 1, in
AssertionError
在存储敏感信息(例如数据库中的密码)时可以使用哈希。在连接到数据库时,您还可以在密码验证中使用哈希。验证输入的密码哈希与正确密码的哈希是否相同。
结论
我希望这个教程能帮助你学习如何使用Python生成安全哈希。以下是关键要点:
- Python的hashlib模块提供了几种散列算法的现成实现。你可以使用
hashlib.algorithms_guaranteed
获取你的平台上保证可用的算法列表。 - 要创建一个哈希对象,你可以使用通用的
new()
构造函数,语法如下:hashlib.new("算法名称")
。或者,你可以使用与特定散列算法对应的构造函数,例如:hashlib.sha256()
用于SHA 256散列。 - 在初始化要被散列的消息字符串和哈希对象之后,你可以在哈希对象上调用
update()
方法,然后调用hexdigest()
方法来获取散列值。 - 散列在检查软件构件和文件的完整性、在数据库中存储敏感信息等方面非常有用。
接下来,学习如何用Python编码一个random password generator。