PHP中BCRYPT哈希含点字符,求无点哈希方案用于链接密钥
解决BCRYPT哈希带点的问题,生成适合链接密钥的无点标识
嘿,我来帮你捋清楚这个问题!首先得明确:bcrypt生成的哈希格式里带点(.)是算法本身的特性,没有任何配置能让它不生成带点的哈希——这是它设计的一部分,改不了的。
不过你的核心需求是生成不含点的唯一值当链接密钥,这里有几个更贴合需求的方案,分两种情况说:
如果你只是需要安全的唯一链接密钥(不用复用密码哈希)
这种情况最推荐直接生成专门的链接密钥,别复用密码哈希啦:
- 用PHP的
random_bytes()生成加密安全的随机字节,再转成无特殊字符的格式就行:
这么生成的密钥不仅没有点,而且加密安全,用来当唯一链接标识再合适不过。// 生成16字节的随机数据(足够保证唯一性和安全性) $randomBytes = random_bytes(16); // 转成Base64URL格式:把+换成-,/换成_,去掉末尾的=,完全没点 $linkKey = rtrim(strtr(base64_encode($randomBytes), '+/', '-_'), '=');
如果你必须基于某个原始值(比如用户ID、密码)生成哈希当密钥
要是你一定要基于特定值生成无点哈希,试试这两个方法:
方法1:SHA-2哈希 + Base64URL编码
$originalValue = "你的原始数据"; // 比如用户ID、密码之类的 // 生成SHA-256哈希(二进制格式) $hash = hash('sha256', $originalValue, true); // 转成Base64URL格式,彻底去掉所有可能的特殊字符(包括点) $linkKey = rtrim(strtr(base64_encode($hash), '+/', '-_'), '=');
这样得到的结果完全没点,哈希的唯一性也足够用。
方法2:用Argon2哈希并替换点字符
如果你坚持想用密码哈希算法(比如比bcrypt更现代的Argon2),可以生成哈希后把点换掉:
$password = "用户密码"; // 生成Argon2id哈希 $hash = password_hash($password, PASSWORD_ARGON2ID); // 把哈希里的.换成下划线_(或者你喜欢的其他无冲突字符) $linkKey = str_replace('.', '_', $hash);
注意哦:如果之后要验证这个哈希,得先把下划线换回点,再用password_verify()验证。但说实话,链接密钥一般不需要用来验证密码,所以还是更推荐第一种情况的方案。
最后提醒下:别改bcrypt哈希!
bcrypt的哈希结构是标准格式,随便改里面的字符会直接破坏它的密码验证功能——要是你原本想让它同时当密码哈希和链接密钥,这么做之后就没法用password_verify()验证密码了,绝对不推荐这么干。
内容的提问来源于stack exchange,提问作者harry4912
相关产品推荐
相关产品推荐

