salt 的最小长度应该是多少,并且它总是唯一的 openssl_random_pseudo_bytes

What should be the minimum length of a salt and is it always unique with openssl_random_pseudo_bytes

我正在努力以安全的方式将我的用户密码存储在我的数据库中。我读了一点,我被建议使用 openssl_random_pseudo_bytes 来生成我的盐。我愿意:

bin2hex(openssl_random_pseudo_bytes($thenumberIwanttouse, $cstrong));

它有效,但我在徘徊两件事:

-我的 salt 和数据库中的长度应该是多少,例如,如果我的 salt 有 30 个字符,我只需要一个长度为 30 的 varchar 字段?

-openssl_random_pseudo_bytes 会一直生成新的盐吗?如果不是,是否意味着我需要将我的盐与数据库中所有其他现有盐进行比较,以确保没有重复的盐?

salt 的原始格式长度为 16 个字节,不是 hex-encoded。 但是,你不应该自己生成它,也不应该在数据库中有一个单独的盐字段!

password_hash() 会自动生成一个盐(它会比你做得更好),然后将它存储在 哈希本身 - 这就是算法有效。

除了 password_hash()password_verify() 之外,您不应该使用任何东西来使整个事情正常进行。

此外,还有openssl_random_pseudo_bytes()更好的替代方法来生成随机数据,例如random_bytes() under PHP7, or it's backport for older PHP versions - the random_compat包。