密码哈希函数Bcrypt的最大密码长度限制

简介: 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/60970765 密码哈希函数Bcrypt的最大密码长度限制作者:chszs,未经博主允许不得转载。
版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 https://blog.csdn.net/chszs/article/details/60970765

密码哈希函数Bcrypt的最大密码长度限制

Bcrypt是一个很流行的密码哈希算法,是Niels Provos和DavidMazières基于Blowfish加密算法设计的密码哈希算法,于1999年在USENIX协会上提交。Bcrypt在设计上包含了一个盐Salt来防御彩虹表攻击,还提供了一种自适应功能,可以随着时间的推移,通过增加迭代计数以使其执行更慢,使得即便在增加计算能力的情况下,Bcrypt仍然能保持抵抗暴力攻击。

Bcrypt是OpenBSD和SUSE Linux等操作系统默认的密码哈希算法。但是在使用Bcrypt算法的实现时,要注意它有最大密码长度限制,通常为50~72字符,准确的长度限制取决于具体的Bcrypt实现。超过最大长度的密码将被截断。

下面使用Spring Security的BCryptPasswordEncoder为例:

BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
// 72 字符
String password1 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
// 73 字符
String password2 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab";
String encodedPassword1 = passwordEncoder.encode(password1);
boolean matches = passwordEncoder.matches(password2, encodedPassword1);
System.out.println("encodedPassword1: " + encodedPassword1);
System.out.println("matches: " + matches);

当运行程序时,会输出这样的结果:

encodedPassword1: $2a$10$A5OpVKgjEZzmy6UNsqzkjuG2xGET1wp3b/9ET5dz/tHQ3eRvyXSSO
matches: true

这证明了Password字符串超过72字符的部分被截断丢弃了。

要解决Bcrypt密码算法72字符长度限制的问题,可以这样:
先使用SHA-256算法对字符串进行加密,再使用Bcrypt算法加密,用伪码示意如下:

hashpw(sha256('password'), salt);
目录
相关文章
|
13天前
|
Web App开发 JavaScript 前端开发
生成随机密码
生成随机密码
|
3月前
|
存储 算法 安全
密码哈希参考
OWASP组织针对密码存储提供了一个专题指引,本文针对里面的密码存储方法进行了翻译,并对密码存储(or 密码哈希)算法基于Go语言的crypto库实现做了一下的性能测试,并收集了对应算法的实现标准链接,方便后续进一步学习。
38 0
|
7月前
|
数据库 数据安全/隐私保护
Shiro学习-密码的比对及密码的MD5加密(八)
Shiro学习-密码的比对及密码的MD5加密(八)
60 0
|
8月前
|
算法 数据安全/隐私保护
什么叫明文,什么叫密文、密码、密钥,为什么在数据库里不采用明文保存密码?
什么叫明文,什么叫密文、密码、密钥,为什么在数据库里不采用明文保存密码?
234 0
|
存储 安全 算法
2021年你还不会Shiro?----4.使用MD5+盐+hash散列进行密码加密
上一篇文章里介绍了使用自定义的Realm来实现数据的获取,不过,数据的获取依然不是来源于真实的数据库或者是nosql,只是包装了一个方法,假装从这个方法里获取了数据库中的用户信息,然后我们返回了一个SimpleAccount,这个对象携带了用户名与密码,当时我们是明文返回的密码。这样做很显然是不安全的,一旦数据来源被攻破,所有的用户信息都会被泄露。所以这里我们介绍下,常用的密码加密策略。
151 0
2021年你还不会Shiro?----4.使用MD5+盐+hash散列进行密码加密
|
Go 数据库 数据安全/隐私保护
Go实现随机加盐密码认证
Go实现随机加盐密码认证
232 0
|
SQL 关系型数据库 MySQL
mysql更新密码字段为手机号后六位前面拼接上Q后面拼接上W然后md5加密
mysql更新密码字段为手机号后六位前面拼接上Q后面拼接上W然后md5加密
274 0
|
数据安全/隐私保护
MD5 加密解密 判断密码是否相等 全套实现方式
MD5 加密解密 判断密码是否相等 全套实现方式
253 0
|
存储 SQL 安全
加盐密码哈希:如何正确使用
加盐密码哈希:如何正确使用
380 0
加盐密码哈希:如何正确使用
|
算法 Java Maven
DES加解密算法:含DES密钥生成、参数名ASCII码从小到大排序
DES加解密算法:含DES密钥生成、参数名ASCII码从小到大排序
343 0
DES加解密算法:含DES密钥生成、参数名ASCII码从小到大排序