这个问题与PHP的crypt()的实现有关。 对于这个问题,盐的前7个字符不计算在内,所以盐' $2a$07$a '将被认为长度为1,因为盐只有1个字符,元数据有7个字符。 当使用超过22个字符的saltstring时,生成的哈希(即截断)没有变化,并且当使用less于21个字符的string时,salt将自动填充(显然为' $ '字符)。 这是相当简单的。 但是,如果给定一个盐20个字符和一个盐21个字符,除了21长度盐的最后一个字符,两个字符是相同的,那么两个哈希string将是相同的。 一个长22个字符的盐,除了最后一个字符,它和21长度的盐是一样的,哈希将会不同。 代码示例: $foo = 'bar'; $salt_xx = '$2a$07$'; $salt_19 = $salt_xx . 'b1b2ee48991281a439d'; $salt_20 = $salt_19 . 'a'; $salt_21 = $salt_20 . '2'; $salt_22 = $salt_21 . 'b'; var_dump( crypt($foo, $salt_19), crypt($foo, $salt_20), crypt($foo, $salt_21), crypt($foo, $salt_22) ); 会产生: string(60) "$2a$07$b1b2ee48991281a439d$$.dEUdhUoQXVqUieLTCp0cFVolhFcbuNi" string(60) "$2a$07$b1b2ee48991281a439da$.UxGYN739wLkV5PGoR1XA4EvNVPjwylG" string(60) "$2a$07$b1b2ee48991281a439da2.UxGYN739wLkV5PGoR1XA4EvNVPjwylG" string(60) […]