密码加密会掩盖用户的密码,使其难以猜测或解码。这是开发安全的用户基础软件的必要步骤。无论您是使用 Flask 还是其他轻量级 Python 框架构建一个,都不能忽略这一步。这就是 bcrypt 的用武之地。
我们将向您展示如何使用 bcrypt 在 Python 中散列密码。
Bcrypt 是一个与语言无关的散列库,提供独特的密码加密。在加密您的字符串时,默认情况下它会生成额外的随机字符(盐)以增强密码的安全性。
或者,您还可以指定要添加到传入字符串的额外字符数。
该 bcrypt库不只读原始字符串字节码。因此,首先,您将首先对传入的密码字符串进行编码,然后再将其传递给 bcrypt 进行加密。
编码与加密不同。它只能确保字符串在加密算法可以对其进行掩码之前成为机器可读的。
使用 Python 可以轻松进行 bcrypt 密码加密。我们将专注于如何在不使用框架的情况下做到这一点。但是不用担心,一旦您知道如何存储用户的输入并从数据库中读取它们,它就会在框架中遵循相同的过程。
如果您还没有这样做,请在您的项目根目录中激活 Python 虚拟环境。然后使用pip安装 bcrypt :
pip install bcrpyt
安装后,让我们看看如何使用 bcrypt 加密字符串:
# Import bcrypt:
import bcrypt
password = "mypasswordstring"
# Encode password into a readable utf-8 byte code:
password = password.encode('utf-8')
# Hash the ecoded password and generate a salt:
hashedPassword = bcrypt.hashpw(password, bcrypt.gensalt())
print(hashedPassword)
当您运行上面的 Python 代码时,它会打印一个加密的字节字符串。但是,每次执行脚本时,输出都会更改。这就是 bcrypt 如何确保每个用户都有一个唯一的加密密码。
顺便说一下,那是用于密码加密。
如果您想存储散列密码并稍后在身份验证期间确认它与用户提供的密码匹配怎么办?
这很容易。您只需将验证密码与存储在数据库中(或在这种情况下存储在内存中)的密码进行比较。
由于 bcrypt 只读取字节字符串,因此在将其与数据库中的密码进行比较之前,您还需要对验证密码进行编码。本质上,您将使用已存储在数据库中的编码散列密码交叉检查编码身份验证输入。
使用虚拟 Python 输入,让我们看看这在实践中是如何工作的:
import bcrypt
#store your password:
password = str(input("input password: "))
# Encode the stored password:
password = password.encode('utf-8')
# Encrypt the stored pasword:
hashed = bcrypt.hashpw(password, bcrypt.gensalt(10))
# Create an authenticating password input field to check if a user enters the correct password:
check = str(input("check password: "))
# Encode the authenticating password as well:
check = check.encode('utf-8')
# Use conditions to compare the authenticating password with the stored one:
if bcrypt.checkpw(check, hashed):
print("login success")
else:
print("incorrect password")
上面的代码要求您在执行时输入新密码。Python 将其存储在内存中。然后,您将在身份验证字段中提供相同的密码(只有您知道)。
如果比较的密码与之前存储的加密密码匹配,Python 会打印一条成功消息。否则,它输出包装在else语句中的失败消息:
整个概念与在注册期间将密码存储在数据库中并在稍后在身份验证期间提供密码相同。
虽然我们只演示了 bcrypt 如何通过将加密密码存储到普通 Python 短内存中来工作,但它的最终用途是在现实生活中的用户基础应用程序中。
尽管如此,本教程还是展示了构建代码以实现这一目标的基本方法,即使在现实生活中也是如此。例如,如果您使用 Flask,您可以用单独的 Web 表单替换输入以提供注册和身份验证字段。当然,您会将加密的密码存储在现实生活中的数据库中,并在比较密码时从中读取。