PostgreSQL中如何提取crypt(gen_salt('bf'))生成的密码哈希的盐?
提取PostgreSQL crypt(bf)生成的密码盐的方法
首先,crypt($password, gen_salt('bf'))生成的是bcrypt格式的哈希值,它的结构是固定的,和你猜测的按.分割的方式无关,正确拆分规则如下:
bcrypt哈希的标准格式为:$<版本>$<成本因子>$<盐(22字符)><密码哈希(31字符)>
拿你提供的第一个哈希举例:$2a$06$dcJkzmbYLbPHB2NL5QfVj.D.a7OnEq01l3ZIYJ0IVeNPZ3AIuEpWG
拆分后:
- 版本:
2a - 成本因子:
06 - 盐:
dcJkzmbYLbPHB2NL5QfVj(第三个$之后的前22个字符) - 密码哈希:
.D.a7OnEq01l3ZIYJ0IVeNPZ3AIuEpWG(盐之后的剩余部分)
第二个哈希同理:$2a$06$2Q3QwDby0xPJSL4CU.izXe1jDFdMDQ1SkSnFE3dWUt2sLeQHq6v76
- 盐:
2Q3QwDby0xPJSL4CU.izX - 密码哈希:
e1jDFdMDQ1SkSnFE3dWUt2sLeQHq6v76
PostgreSQL中提取盐的具体操作
你可以用字符串函数直接截取第三个$之后的前22个字符,推荐用正则表达式的方式更简洁:
-- 假设哈希存储在password_hash字段中 SELECT SUBSTRING(password_hash FROM '\$[a-z0-9]+\$[0-9]+\$(.{22})') AS salt FROM your_table;
也可以用位置计算的方式实现:
SELECT SUBSTRING( password_hash, POSITION('$' IN password_hash) + POSITION('$' IN SUBSTRING(password_hash FROM POSITION('$' IN password_hash)+1)) + POSITION('$' IN SUBSTRING(password_hash FROM POSITION('$' IN password_hash)+POSITION('$' IN SUBSTRING(password_hash FROM POSITION('$' IN password_hash)+1))+1)) +1, 22 ) AS salt FROM your_table;
你之前的猜测不成立,是因为bcrypt的盐和哈希部分可能包含.,按.分割完全不可靠,必须遵循bcrypt固定的长度规则来拆分。
内容的提问来源于stack exchange,提问作者perotom
相关产品推荐
相关产品推荐

