You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 11:07:38