关闭

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

标签: 密码BcryptBlowfish密码长度
4481人阅读 评论(0) 收藏 举报
分类:

密码哈希函数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);
0
0
查看评论

BCrypt 密码加密和解密

项目中用到需要对登录密码进行加密 ,使用BCrypt 主要是能实现每次加密的值都是不一样的。 String password = "123456a";//$2a$10$ofPkBDUezOJp6Sik63Q/0.QlU8a1itEyzldjSXqfn2nDPqXjN0Ljm ...
  • phpfzh
  • phpfzh
  • 2017-03-22 11:22
  • 3109

使用BCryptPasswordEncoder管理密码

官方是推荐我们使用BCryptPasswordEncoder而PasswordEncoder 等已经被废弃了   1.看个简单的例子 @Test public void testPass(){ String pass = "he...
  • u013571243
  • u013571243
  • 2015-08-19 11:45
  • 10436

浅谈使用spring security中的BCryptPasswordEncoder方法对密码进行加密与密码匹配

浅谈使用springsecurity中的BCryptPasswordEncoder方法对密码进行加密(encode)与密码匹配(matches) spring security中的BCryptPasswordEncoder方法采用SHA-256 +随机盐+密钥对密码进行加密。SHA系列是Hash算...
  • J_bean
  • J_bean
  • 2017-09-19 16:28
  • 1986

springboot+security 的BCryptPasswordEncoder 使用

任何应用考虑到安全,绝不能明文的方式保存密码。密码应该通过哈希算法进行加密。有很多标准的算法比如SHA或者MD5,结合salt(盐)是一个不错的选择。 Spring Security 提供了BCryptPasswordEncoder类,实现Spring的PasswordEncoder接口使用BCry...
  • u012373815
  • u012373815
  • 2017-03-05 11:40
  • 6156

golang日記 - crypto/bcrypt

Web Development w/ Google’s Go (golang) Programming language 的067-Encrypt-Password-With-Bcrypt https://www.udemy.com/go-programming-language/learn/v4...
  • u014041227
  • u014041227
  • 2017-05-21 00:02
  • 697

go常见error解决办法

1. unrecognized import path "golang.org/x/crypto/bcrypt" 原因是网络被GFW墙啦!!!!用pandafan的代理进行设置。 要为 shell 配置 HTTP 代理只需两步: ...
  • scut1135
  • scut1135
  • 2015-12-02 19:22
  • 959

对用用户密码的保存方式之BCrypt加密方式

在需要用户模块的项目中,对于用户密码的保存,一般不会使用明文保存,这样是不安全的。通常情况下,我们都需要对密码进行不可逆的加密,然后存放在数据库中。然后在用户登录的时候,把其输入的密码进行加密与数据库中存放的密文对比来判断密码是否正确。 目前所使用比较多的是MD5,但是BCrypt也使用的比较多,...
  • techbirds_bao
  • techbirds_bao
  • 2013-07-05 15:34
  • 17906

spring security 3中推荐使用BCrypt算法加密密码

spring security 3中推荐使用BCrypt算法加密密码了,以前使用的是md5,  Md5PasswordEncoder 和 ShaPasswordEncoder,现在不推荐了,推荐用bcrpt  Bcrpt中的salt可以是随机的,比如:  ...
  • q1054261752
  • q1054261752
  • 2017-01-30 16:10
  • 1376

bcrypt加密算法

前言 我在公司内部做了一个“接口管理系统”(DRIM),这个系统的用户认证需要与公司已有的代码管理平台gitlab保持一致,采用的方式是DRIM直接读gitlab的数据库来做认证,所以需要知道gitlab是如何对密码做加密的。 过程 1.寻找数据库 这个过程很简单,很快就找到了其users表,里面有...
  • joeyyeoj
  • joeyyeoj
  • 2014-02-18 15:16
  • 12071

Java通过BCrypt加密

一、概述 在用户模块,对于用户密码的保护,通常都会进行加密。我们通常对密码进行加密,然后存放在数据库中,在用户进行登录的时候,将其输入的密码进行加密然后与数据库中存放的密文进行比较,以验证用户密码是否正确。 目前,MD5和BCrypt比较流行。相对来说,BCrypt比MD5更安全,但...
  • Tracyhuixingfu
  • Tracyhuixingfu
  • 2015-06-26 20:08
  • 5146
    个人资料
    • 访问:5961693次
    • 积分:52140
    • 等级:
    • 排名:第64名
    • 原创:795篇
    • 转载:23篇
    • 译文:24篇
    • 评论:1190条
    一名路过的黑客

    大家好,我是黑客,专门盗账号的。现在这个人的帐号被我盗了,但看这个人平时的博客空间,一直过着艰苦努力、持之以恒的技术研究生活,勤奋刻苦,积极分享,无私奉献,我被深深的感动了,这是一个纯粹的人,人品这样的高尚,希望大家看到我这条消息后,可以私聊他,多鼓励他,不缺钱的就多给他一些经济上的资助,让他再接再厉!就这样吧,我下线了,眼框湿湿的难受。

    文章存档