首页 > 教程 > Python开发中的用户密码哈希算法选择:bcrypt和Passlib

Python开发中的用户密码哈希算法选择:bcrypt和Passlib

时间:2024-08-22 | 来源: | 阅读:166

话题: a T Cry 哈希算法 S C 算法 开发 用户 密码 Python

在设计一个系统的时候,肯定都有会有用户身份认证的问题,一般对用户校验的时候,都是对用户存在数据库总的密码哈希值进行判断,从而避免密码泄露和反向解密,那么在Python 开发中,我们可以引入bcrypt 或 Passlib 对系统用户密码进行哈希和验证处理,以及介绍使用其他类库实现常规加解密处理操作。

在设计系统时,用户身份认证是一个必不可少的问题。一般来说,用户验证时会对数据库中存储的密码哈希值进行比对,以避免密码泄露和反向解密。在Python开发中,我们可以引入bcrypt或Passlib对用户密码进行哈希和验证处理。本篇文章将介绍这两者之间的差异,并提供实际使用中的一些代码供参考。

1、bcrypt和Passlib的介绍

bcrypt和Passlib都是用于密码哈希和验证的Python库,但它们之间有一些显著的区别:

  • bcrypt:
    • bcrypt是一个专门用于实现bcrypt哈希算法的库。它相对简单,专注于单一功能,即对密码进行bcrypt哈希处理和验证。
    • 适合只需要bcrypt哈希算法的场景。
    • 提供的API简单直接,功能较少。
  • Passlib:
    • Passlib是一个更高级的密码哈希库,它支持多种哈希算法(如bcrypt、PBKDF2、Argon2等),并且提供了更丰富的功能。
    • 适合需要支持多种密码哈希算法和策略的场景。
    • 提供的CryptContext类可以方便地管理和迁移多个哈希算法,还提供了密码哈希的自动升级机制,以及对旧算法的弃用处理。

当确定只需要使用bcrypt算法并且不需要额外的复杂功能时,bcrypt是一个合适的选择。它适合简单的项目,或者在需要直接控制salt等参数的情况下使用。

Passlib适合复杂的项目,尤其是需要支持多个哈希算法或需要迁移哈希算法的场景。适合需要长期维护的项目,因为它提供了更多的配置和安全功能。

bcrypt: 灵活性较低,因为它只支持bcrypt算法。没有多种哈希算法选择或密码策略管理功能。使用简单,代码更直观。如果你只需要bcrypt算法,bcrypt库可能更容易上手。

Passlib: 提供了很高的灵活性和扩展性。可以根据需要切换和配置不同的哈希算法,管理复杂的密码策略。通过CryptContext,可以轻松管理不同算法之间的过渡。功能强大但相对复杂,需要更深入的学习和理解。但它的高层API设计得很友好,一旦熟悉,可以简化很多常见任务。CryptContext是其中一个用于管理多个哈希算法和密码哈希策略的类。

示例代码对比:

bcrypt 使用示例:

Passlib 使用示例:

定义了一个CryptContext对象,用于管理密码哈希算法。schemes=["bcrypt"]表示你要使用bcrypt算法,而deprecated="auto"表示自动管理过时的哈希方案。

使用pwd_context.hash()方法对密码进行哈希处理。每次生成的哈希值都是唯一的,即使是相同的密码也会生成不同的哈希值。

使用pwd_context.verify()方法可以验证给定的密码与存储的哈希值是否匹配。

你还可以在创建CryptContext对象时传递更多参数来定制密码哈希行为,这种方法可以增强密码存储的安全性。

2、使用指定的salt进行加密

在Passlib中,bcrypt算法默认会自动生成一个随机salt,这也是bcrypt的一种安全特性。如果你想使用指定的salt进行加密,需要注意的是,Passlib并不直接支持通过指定salt来进行哈希处理,因为这可能会降低安全性。

  1. 手动拼接salt和密码: 可以手动拼接salt和密码,然后对结果进行哈希处理。但这种方法仅适用于了解风险并确保安全措施的场景。
  2. 使用bcrypt库: 直接使用bcrypt库进行处理,它允许你传递一个指定的salt。不过,注意这会有一定的安全风险。

1) 使用bcrypt库指定salt

如果你确实需要指定salt,可以使用bcrypt库。

2) 手动拼接salt和密码

如果你使用Passlib,并想使用指定的salt,可以手动拼接salt和密码,然后对这个组合结果进行哈希处理。这个方式一般不建议使用,因为它破坏了bcrypt的安全设计原则。

注意事项

  • 使用固定的salt会降低密码哈希的安全性,因为相同的salt和相同的密码会生成相同的哈希值。
  • bcrypt的设计初衷是让每次生成的salt都不同,以此提高安全性。
  • 如果你需要在特定的场景下使用固定的salt,一定要确保你的系统有足够的其他安全措施。

同一密码,每次获得的hash值都会不同,那么有些人会问,如果通过pwd_context.hash获得的hash值,下一次能够对比正确吗?

回答是的,使用pwd_context.hash()生成的哈希值可以在后续对比中正确匹配,即使每次生成的哈希值看起来不同。Passlib和bcrypt的设计确保了这一点。

  • 自动生成的salt: 每次你使用pwd_context.hash()生成一个新的哈希值时,bcrypt都会自动生成一个随机的salt并将其嵌入到生成的哈希值中。因此,即使对同一个密码进行多次哈希,每次生成的哈希值也会不同。
  • 验证过程: 在验证过程中,pwd_context.verify()会自动从存储的哈希值中提取salt并重新计算哈希,然后将其与提供的哈希值进行比较。这意味着,即使哈希值不同,验证仍然能够成功匹配。

即使你每次运行pwd_context.hash(password)得到的哈希值不同(因为salt不同),pwd_context.verify(password, hashed_password)仍然会返回True,表示密码验证成功。

3、加密和解密处理

Passlib主要用于密码哈希处理,并不支持加密和解密操作。如果你需要对字符串进行加密和解密,或者使用非对称加密,你需要使用其他库,例如cryptography或PyCryptodome。

1) 对称加密和解密

对于对称加密,你可以使用cryptography库中的Fernet,它是基于AES算法的加密方案。

对称加密和解密示例

2) 非对称加密和解密

对于非对称加密,你可以使用cryptography库中的RSA算法。通常,非对称加密用于加密较短的信息或加密对称密钥。

非对称加密和解密示例

3) 保存和加载密钥

保存私钥 :

加载私钥 :

保存公钥 :

加载公钥 :

我们在开发过程中,可以根据需求选择合适的加密方式和库,并妥善管理密钥。


湘ICP备2022002427号-10湘公网安备:43070202000427号
© 2013~2019 haote.com 好特网