在确认用户或执行类似操作时,您绝不能以明文形式保存密码。
由于许多人使用相同的密码,如果攻击者发现未加密密码的数据库,它们可以很容易地与匹配的电子邮件一起使用以进入链接的网站或帐户,甚至用于尝试访问其他帐户。
今天,当提供密码时,密码通常会被散列。 建议使用盐进行散列,并将盐与散列密码放在一起。
加盐可能看起来像是薯饼配方中的步骤之一,但在密码学中,它指的是向哈希函数的输入添加随机数据,以确保即使输入相同,哈希也将始终提供唯一的结果。
因此,通过添加盐创建的独特哈希可以保护我们免受多种攻击方法的影响,包括哈希表攻击,同时扼杀字典和暴力离线尝试。
在这里,借助代码片段,我们将演示如何使用“bcrypt”来保护您的密码。
那么,什么是“bcrypt”?
Bcrypt 是一个支持多种语言并提供特殊密码加密的哈希库。 为了提高密码的安全性,它会在加密字符串时自动产生额外的随机字符(盐)。
您还可以选择定义要添加到传入字符串的附加字符数。
bcrypt 库只读取字节码,而不是原始字符串。 因此,在将传入的密码字符串提交给 bcrypt 进行加密之前,您必须先对其进行编码。
加密和编码不是一回事。 它只是确保字符串在被加密技术覆盖之前是机器可读的。
在 Python 中使用 bcrypt 加密密码
Python 使 bcrypt 密码加密变得简单。 我们将专注于在没有框架帮助的情况下执行此操作。 但是不用担心,如果您了解如何保存用户输入并从数据库中读取它们,那么框架中的过程是相同的。
装置
您只需要设置一个 Python 虚拟环境,然后使用像 PyCharm 这样的 IDE。 然后必须首先安装该库:
加密密码
让我们看看安装后如何使用 bcrypt 加密文本:
上述 Python 代码执行并输出一个加密的字节串。 但是每次运行脚本时,结果都不同。 Bcrypt 使用这种方法来确保每个用户都有一个专门加密的密码。
顺便说一句,那是用于密码加密。
使用 Bcrypt 进行密码比较和确认
如果您希望保存散列密码并稍后检查它是否与用户提交用于身份验证的密码匹配,会发生什么情况?
这很简单。 只有验证密码必须与数据库的条目(或在本例中的内存中)进行比较。
在与数据库中的密码进行比较之前,还必须对身份验证密码进行编码,因为 bcrypt 只能读取字节字符串。 基本上,您会将编码的身份验证输入与您当前在数据库中的编码散列密码进行比较。
让我们使用虚构的 Python 输入来测试一下:
运行上述代码后,系统会提示您输入新密码。 这是由 Python 保存在内存中的。 然后,在身份验证部分,您将输入相同的密码,该密码对您来说是私有的。
如果将密码与之前加密并保存的密码进行比较,Python 会发出一条成功消息。
如果不是,则打印出错误消息,然后添加 else 语句。
基本思想与注册然后向数据库提供密码以进行身份验证的思想相同。
结论
尽管我们只是简单地使用加密密码来展示 bcrypt 如何在纯 Python 短内存中发挥作用,但它的实际适用性在于基于用户的应用程序。
尽管如此,本文演示了组织代码以实现此目的的基本方法,即使在现实环境中也是如此。
例如,如果您使用 Flask,您可以通过单独的 Web 表单而不是输入来提供注册和身份验证字段。
当然,在比较密码时,您将从包含保存在现实世界中的加密密码的数据库中读取。
乔纳·尼奇
谢谢你这个简单又简单的解释,
这对我当前的项目帮助很大。
我认为示例代码仅限于最低限度并且不像许多其他解释那样过载,这是非常好的。
诚挚的问候