SHA512 crypt的盐值在ASCII 32-127范围内有哪些禁用字符?
SHA512 crypt 盐值(对接Dovecot场景)禁用字符说明
ASCII 32-127区间内的禁用字符列表
标准SHA512 crypt算法本身的盐值规则和Dovecot的解析规则叠加后,以下字符属于明确禁用范围:
::你已经发现的冲突点,Dovecot的密码存储文件(如dovecot-passwd)使用冒号作为字段分隔符,盐值或哈希中出现冒号会直接导致字段解析错位,服务运行报错。$:SHA512 crypt的哈希输出格式本身使用$作为分段标识符,固定格式为$6$<盐值>$<哈希结果>,如果盐值中包含$会导致crypt库、Dovecot都无法正确识别盐值的边界,解析直接失败。- 空格(ASCII 32):Dovecot的配置和密码文件读取逻辑会默认忽略行首尾的空白字符,盐值中如果包含空格,大概率会被截断或识别错误,最终导致哈希校验不通过。
PHP生成适配Dovecot的盐值最佳实践
推荐直接使用a-z、A-Z、0-9、.、/共64个字符作为盐值的可选字符集,完全兼容crypt算法和Dovecot的解析规则,不会出现任何兼容性问题,参考生成代码如下:
// 生成16位符合要求的随机盐值(SHA512 crypt盐值最长支持16位) $saltChars = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; $salt = ''; for ($i = 0; $i < 16; $i++) { $salt .= $saltChars[random_int(0, 63)]; } // 生成最终可对接Dovecot的SHA512 crypt哈希 $dovecotHash = crypt($originalPassword, '$6$'.$salt.'$');
内容的提问来源于stack exchange,提问作者user2772439
相关产品推荐
相关产品推荐

