上一节讲到了密码哈希算法,首先我们从bcrypt入手,之前说到bcrypt算法不需要再生成盐,其实这么说是错误的,应该说bcrypt算法生成的结果自身就包含了盐,而且可以进行算法复杂度参数调整,从而加长了哈希算法执行时间,有效的防止了彩虹表攻击等手段。
本次以Java为例,其他javascript、python等主流语言都有相应的库,相信并不难找,本次用的Java库如下:
<dependency>
<groupId>org.mindrot</groupId>
<artifactId>jbcrypt</artifactId>
<version>0.4</version>
</dependency>
代码示例如下所示:
String password = "123456";
String hashed = BCrypt.hashpw(password, BCrypt.gensalt(10));
if(BCrypt.checkpw(password, hashed)) {
// 校验成功
}
首先让我们看一下生成的密码哈希结果
$2a$10$C5nirnEy0TgpB6UjtZebcOf7EanmJhFi2g0t8Vek3kZTEeer.BaR6
上述的哈希结果准确来说并不全是哈希的结果,它是一种Shadow密码格式字符串,可以分为四个部分:类型、复杂度、盐和哈希结果。
1. 类型:$