Python 密码哈希
我们将了解密码散列以及如何使用名为 bcrypt 的第三方库加密 salt 和 hash 密码。 我们还研究了 Python 中 hashlib 库中的不同哈希算法。
Python 中使用 bcrypt 库的 Salt 和 Hash 密码
散列是将一个字符串变成一个固定长度的看似随机的字符串的过程,这个过程是不可逆的。 它是一种单向函数,因此您不能像加密那样将哈希返回到其原始字符串,您可以在其中加密消息然后解密。
哈希用于用户管理; 例如,如果我们有一些数据库泄露或丢失数据,或者当我们使用明文密码时有人入侵了我们的系统。 散列为我们提供了一些保护层; 但是,如果我们妥善维护它,散列密码是不容易被破解的。
在本节中,我们将看到如何使用 bcrypt 模块处理散列密码; 让我们继续并进入代码。 我们将使用一个名为 bcrypt 的第三方库,它是一种哈希算法。
bcrypt 是一种可靠、健壮且值得推荐的散列密码算法; 它为我们提供了一些不错且易于使用的功能,让我们可以快速完成工作。
首先,我们将使用以下命令安装此库。
pip install bcrypt
现在我们需要导入bcrypt,创建一个密码,并将其存储在一个变量中,密码必须是一个字节串。 为了散列这个密码,我们将创建一个名为 hashed_pswd 的新变量,并从 bcrypt 调用 hashpw()
方法。
它需要两个参数; 第一个是密码,第二个是 gensalt()
,随机生成一个数字或盐和哈希密码。
import bcrypt
My_pswd = b"Mypassword111"
hashed_pswd = bcrypt.hashpw(My_pswd, bcrypt.gensalt())
print(hashed_pswd)
输出:
b'$2b$12$KEW01pYNDc3ee9U0wZpmgOBpUvvjkig/qxs593hGh/aZ2AvvGTyWu'
使用 hashlib 库对密码进行哈希处理
本节将使用 hashlib 库创建盐和散列密码。 如果您将密码等安全数据从一个位置传递到另一个位置,最好确保别人无法读取它。
当您想要隐藏某些内容或使其对用户不可读时,您可以执行两种类型的操作。 第一个是散列,第二个是加密; 密码中大多不使用加密。
如果我们想将文件从我们的计算机传输到另一台计算机或发送文件,那么我们使用加密。 但是,如果我们想检查密码是否正确或将密码存储在我们的服务器中,则主要使用散列。
hashlib 库最好的一点是我们不需要安装任何东西; 它带有 Python 3 或更新版本。 导入 hashlib 后,我们将创建一个名为 MD5_Algo 的对象并从 hashlib 调用 md5()。
md5只是一种哈希算法,md代表message-digest,5是版本。 现在我们需要要将明文转换为散列的字符串,为此,我们调用 update()
方法并写入要散列的字符串。
然后在 print()
函数内部,我们调用 hexdigest()
方法; 将应变转换为实际 md5 后,它会转换为十六进制形式。
import hashlib
MD5_Algo=hashlib.md5()
MD5_Algo.update('hello')
print(MD5_Algo.hexdigest())
这段代码会抛出一个错误(Unicode objects must be encoded before hashing),并且在上面的部分中,我们已经讨论过我们需要将字符串转换为字节。
\---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_4064/2416014515.py in <module>
2
3 MD5_Algo=hashlib.md5()
----> 4 MD5_Algo.update('hello')
5 print(MD5_Algo.hexdigest())
TypeError: Unicode-objects must be encoded before hashing
将字符串转换为字节后,我们看到它为我们提供了一个 md5 加密的散列密码。
import hashlib
MD5_Algo=hashlib.md5()
MD5_Algo.update(b'hello')
print(MD5_Algo.hexdigest())
输出:
5d41402abc4b2a76b9719d911017c592
hashlib.sha512()
还有其他种类的加密哈希; 让我们找出 Python 中实际上有什么样的哈希东西。 我们可以使用 algorithms_available 属性打印出可用的算法。
print(hashlib.algorithms_available)
输出:
{'md4', 'md5', 'shake_256', 'shake_128', 'sha512_224', 'md5-sha1', 'sha224', 'sha3_512', 'sha1', 'sha3_384', 'sha512', 'sha3_224', 'sha512_256', 'sha384', 'sha256', 'blake2b', 'sha3_256', 'blake2s', 'ripemd160', 'whirlpool', 'sm3', 'mdc2'}
正如我们所看到的,有很多很酷的算法,显然,所有这些对象都具有相同的结构,它们将具有相同的函数和变量,但它只是一种不同的算法。
sha512 是我们将使用并传入一个字符串的那个; 之后,我们对该字符串使用 hexdigest() ,该字符串将被散列。
import hashlib
MD5_Algo=hashlib.sha512(b'hello')
print(MD5_Algo.hexdigest())
当我们运行这段代码时,我们会得到一大堆字符。
9b71d224bd62f3785d96d46ad3ea3d73319bfbc2890caadae2dff72519673ca72323c3d99ba5c11d7c7acc6e14b8c5da0c4663475c2e5c3adef46f73bcdec043
sha512 比 sha1 更强,更好; 这完全取决于您认为在您的情况下更好或最好的场景。
Salting和散列
这些旧算法的问题在于它们可以被暴力破解或逆向工程,而且并不安全,因为每个人都可以轻松解密这个加密的哈希值。 我们的加密哈希是 hello; 如果我们进行字典攻击并从 sha512 字典中解密会怎样?
sha512 的垮台是许多人在 Facebook 或其他应用程序上使用他们的密码; 通常,他们使用已经在 sha512 中反转和查看的生日,所以这不是一种安全的方法。
最安全的方法之一是加盐; salt会在原始字符串前面添加一些字符。 比方说,如果我们在“hello”前面添加“a”,我们就在原始字符串前面添加了字符“a”作为 salt。
hashlib.sha512(b'helloa')
现在我们已经用这个额外的 salt 加密了这个散列,这就是为什么黑客和其他试图弄清楚如何解密散列的人会非常困难的原因,所以这就是 salt 的来源。
hashlib.pbkdf2_hmac()
在 Python 中,hashlib 库有一个功能有点慢但非常好的功能,称为 pbkdf2_hmac()
。 我们将使用此函数,第二个库实际上用于将二进制文件转换为 ASCII 字符。
pbkdf2_hmac()
需要几个参数; 第一个参数是我们将使用的算法的名称,所以我们在这种情况下使用 sha512。 下一个是我们要散列的密码或文本; 在这种情况下,它将是“你好”。
下一个叫盐,盐会加到这个密码上,然后用sha512加密。 最后一个是迭代次数; 如果我们进行十万次这样的迭代,那么将很难找到它来解密。
在最后一行代码中,我们使用 binascii 库中的 hexlify()
方法将加密的哈希值转换为 ASCII 字符。
import hashlib, binascii
Enc_Salt = hashlib.pbkdf2_hmac('sha512',b'hello',b'a',100000)
print(binascii.hexlify(Enc_Salt))
输出:
b'40b5957a2d2f5aebcdd878a04e644215d4f3aba3f11c00a1f24e75f8ea2efa11611b2a923a9050832cb768a3a3ad282011cab524b741d392c664b8efbb5f389f'
现在我们可以看到 sha512 字典无法解密。
相关文章
Python 中的 Collatz 序列
发布时间:2023/06/16 浏览次数:180 分类:Python
-
Collatz数列是一种以1结尾的数字序列。据说当一个数字经过一组特定的运算后,最后剩下的数字一定是1。本文将解释如何编写程序,在 Python 中找到任何给定数字的 collatz 序列。Collatz 序列背后
Python 中的最长递增子序列
发布时间:2023/06/16 浏览次数:90 分类:Python
-
我们将学习什么是子序列以及如何使用 Python 中的 n 平方方法和二分搜索方法计算数组中最长的递增子序列。
使用 Python 将文件上传到 Google 云端硬盘
发布时间:2023/06/15 浏览次数:136 分类:Python
-
本文将介绍我们如何使用 Python 将文件上传到云盘,以 Google Drive 为例。 为此,我们将使用 Google Drive API。
Python 子进程捕获输出
发布时间:2023/06/15 浏览次数:136 分类:Python
-
本文的主要目的是演示如何在 Python 中捕获、存储和显示子进程的输出。Python 子进程捕获输出 Subprocess 是一个内置的 Python 模块,预装了 Python 安装文件。
Python 子进程在运行时读取标准输出
发布时间:2023/06/15 浏览次数:129 分类:Python
-
本文的主要目的是演示如何读取在 Python 中执行的子进程的标准输出。Python 子进程在运行时读取标准输出 与许多其他内置模块一样,Subprocess 也是一个内置模块,预装了“正常”Python 安装。
使用 Python 获取 CPU 数量
发布时间:2023/06/15 浏览次数:173 分类:Python
-
CPU 可以包含单核或多核。 单核只处理一个进程,而多核同时处理多个进程。本篇文章将介绍使用 Python 程序查找 CPU 内核总数的不同方法。使用 multiprocessing 模块获取 Python 中的 CPU 数量
Python获取CPU温度
发布时间:2023/06/15 浏览次数:111 分类:Python
-
本文的主要目的是演示如何借助 Python 中的 pythonnet 库读取和显示 CPU 温度。Python获取CPU温度
Python 从网页中提取表格
发布时间:2023/06/15 浏览次数:50 分类:Python
-
本文的主要目的是演示如何在 Python 中使用 Pandas 和 lxml 从网页中提取表格。Python 从网页中提取表格
Python Antigravity 模块的用途
发布时间:2023/06/15 浏览次数:72 分类:Python
-
一个这样的 Python 彩蛋是反重力模块。让我们看看 Antigravity 模块做了什么,并看看其他几个例子。