安全高效又易用的密码哈希神器 bcrypt 算法解析

2023-11-15 15:35:23 字數 2899 閱讀 6067

在当今数字化的世界中,密码在保护个人隐私和信息安全方面扮演着至关重要的角色。密码是最常用的身份验证手段,因为既简单又有效。密码安全是网络安全的基石,对保护个人和组织的信息安全具有根本性的作用。然而,随着网络攻击日益频繁和复杂,传统的密码哈希算法如 md5 和 sha 系列在面对现代的安全威胁时显得力不从心。所以采用强密码和有效的密码管理策略变得越来越重要,因此 bcrypt 应运而生,它是一种安全且灵活的密码哈希算法,能够抵御各种攻击,保障用户的数据安全。

以下是常见的密码存储方法及对应的缺陷:

明文存储

明文存储指的是不对密码做任何加密直接存储在数据库中。缺陷是如果数据库泄露,攻击者可以立即获得所有用户的密码。这是最不安全的存储方法,项目中是绝不能使用的。

基本哈希存储

指的是密码通过哈希函数处理后存储,如 md5 或 sha-1。缺陷是每次哈希的结果都是一样的,相同的密码总是生成相同的哈希值,使得攻击者可以使用彩虹表(预先计算的哈希值列表)来反向查找密码。此外,这些哈希算法的计算速度很快,使得暴力破解变得可行。

加盐的哈希存储

为了应对基本哈希的缺点,可以为每个密码生成一个唯一的盐(随机值),将其与密码组合后再进行哈希。缺陷是虽然加盐可以抵抗彩虹表攻击,但如果使用的哈希函数计算速度很快(如sha-256),则依然很容易被暴力破解和使用字典攻击。

适应性哈希算法

适应性哈希算法(如 bcrypt、pbkdf2 和 argon2)设计时考虑了计算时间,可以调整计算资源的消耗,从而对抗暴力破解攻击。缺陷是如果未适当配置(如设置过低的工作因子),仍然可能受到攻击。

密码加密存储

使用对称或非对称加密算法对密码进行加密,然后存储加密后的值。缺陷是需要安全地存储加密密钥。如果密钥泄露,等同于密码以明文形式泄露。

硬件加密机存储(hsm)

使用专用的安全硬件来处理和存储密码,如hsm。缺陷是虽然非常安全,但成本较高,且扩展性和灵活性不够。

每种密码存储方法都有其优缺点,但最佳实践是使用适应性哈希算法,这些算法专门为密码存储而设计,提供了盐值的自动管理和计算强度的调整能力,以此来抵御各种攻击手段。其中最具代表性的是 bcrypt,接下来详细讲解一下 bcrypt。

bcrypt 是为了保护存储在数据库中的密码免受攻击而设计的,在2023年由 niels provos 和 d**id mazières 开发,基于 blowfish 密码算法,并采用“盐”来保护密码免受彩虹表攻击。

bcrypt 的设计初衷是为了提供一种更加强大、可靠的密码散列方式,以防止暴力破解和彩虹表攻击等常见密码攻击手段。为了达到这个目标,bcrypt 结合了多项创新性的设计理念,其中包括:

基于 blowfish 的强哈希函数:bcrypt 算法的核心是一个基于 blowfish 算法的哈希函数,具有很高的抗碰撞能力和抵抗预计算攻击的能力。

自适应工作因子:bcrypt 算法引入了一个“自适应”的工作因子,可以根据实际需求调整散列的复杂度,使其能在短时间内保持较高的安全性。

盐值:bcrypt 算法采用了盐值技术,每一条密码都有一个独特的随机字符串添加到前面,以此增加破解难度,防止被彩虹表攻击。

并行计算抵抗:bcrypt 算法对内存访问进行了严格的控制,以防止利用并行计算加速破解。

易于使用:bcrypt 算法易于实现,可以在多种平台上使用。

bcrypt 的工作流程如下:

生成盐(salt)

对密码进行哈希时,bcrypt 首先生成一个随机的盐(salt),盐是一个足够长的随机数,通常是128位(16字节),盐的作用是确保对同一个密码每次哈希的结果都不同。

设置工作因子(work factor)

工作因子(也称为成本因子)决定了哈希计算的复杂度。工作因子越高,计算哈希所需的时间和资源就越多。工作因子实际上是一个指数,表示主循环的迭代次数是2的多少次方。例如,工作因子为12意味着2^12(4096)次迭代。

组合密码和盐。

将密码与盐组合在一起,以确保即使是相同的密码结果也会不同。

扩展密钥。bcrypt 使用 blowfish 算法对密码和盐进行多轮加密操作,这个过程被称为密钥扩展(key stretching),会多次加密一个固定的文本,通常是"orpheanbeholderscrydoubt"这32个字符。目的提高密码哈希的计算成本,从而抵抗暴力破解。

生成哈希值。

经过多次迭代之后,最终生成一个固定长度的哈希值,即存储在数据库中的值,用于之后的密码校验。

校验密码。当用户尝试登录时,取出存储在数据库中哈希值,使用相同的参数对用户输入的密码进行哈希处理。

通过这样的流程,bcrypt 能够有效地保护密码,即使在数据库被泄露的情况下,由于哈希的复杂性和唯一性,破解密码变得极其困难。

golang 中的 crypto/bcrypt 包是对 bcrypt 算法的实现,具体使用示例如下:

package mainimport ( fmt" "log" "golang.org/x/crypto/bcrypt")func main() fmt.println("hashed password: "string(hashedpassword)) verifying the password with the hashed password err = bcrypt.comparehashandpassword(hashedpassword, [byte(password)) if err !=nil fmt.println("password is correct")}
bcrypt 是专为密码存储设计的哈希函数,通过盐值、工作因子和 blowfish 算法的结合使用,能有效对抗彩虹表攻击和暴力破解。随着时间的推移,可以通过调整工作因子来适应新的威胁模型。

什么是商用密码应用安全性评估(密评)?

什么是商用密码应用安全性评估呢?今天永恒无限就为大家介绍下商用密码应用安全性评估!商用密码应用安全性评估 以下简称 密评 是指对商用密码应用系统的安全性进行全面 客观 准确的评估,以确保商用密码应用系统的安全性符合国家法律法规和相关标准的要求。密评是保障商用密码应用安全的重要手段,也是加强商用密码应...

商用密码产品认证 保护信息安全的“金钥匙”

随着信息技术的飞速发展,商用密码产品在金融 通信 电子商务等领域的应用越来越广泛。为了确保这些产品的安全性和可靠性,商用密码产品认证应运而生。那么,商用密码产品认证究竟是什么?它有哪些作用?适用范围又如何?申报条件 认证流程 资料清单 认证周期及注意事项又是怎样的呢?本文将为您一一解答。一 商用密码...

密码虽安全,但有时麻烦!如何禁用或删除Windows 11中的密码登录

如果你想在windows 上自动登录,在本指南中,我们将向你展示如何删除你的帐户密码。在windows 上,你可以至少通过三种方式从帐户中删除登录密码。在你的帐户上使用密码有助于保护你的计算机和文件免受来自internet或本地的未经授权的访问。然而,在某些情况下,密码可能没有加快访问桌面的过程那么...