创建新用户时如何创建用户密码散列的盐,之后与 crypt() 一起使用?

how is the salt for user password hash created when creating a new user, for use with crypt() after?

目前在linux上对基于密码的认证做了一点分析,我理解了以下几点:

用户密码散列存储在 /etc/shadow 中,盐用于生成它们。 id 还提供用于获取哈希的算法。为了验证密码是否正确,我们将 id 和 salt 传递给 crypt 函数,生成一个临时散列并将其与注册的散列进行比较。

但是,例如,当您创建一个新用户时,您需要使用散列和盐填充该影子文件。哈希当然是通过调用crypt函数得到的,但是我不知道调用那个crypt函数时盐是如何产生的。

的确,根据我所阅读和理解的与 crypt 函数相关的 libc 代码,没有任何东西可以生成随机盐。我们可以为 crypt 提供我们在创建新用户时手动创建的随机盐,但我们几乎总是在创建用户时不为他们的密码散列提供盐。

那么,第一次创建用户时那个salt是怎么生成的呢? /dev/random被使用了吗?

我希望答案中包含一些代码或命令。

谢谢!

没有生成盐的标准函数,但每个好的库都应该为您随机生成一个。正如在另一条评论中所写,一些盐必须是特定的字母表,例如 crypt() 的 "A-Za-z0-9./",而其他盐则接受随机数据。

对于 Java,查看 Apache Commons Codec 项目,它实现了 Unix crypt() 兼容函数。这是一个简单的 for 循环,它从给定的字母表中选择随机字符:

http://grepcode.com/file/repo1.maven.org/maven2/commons-codec/commons-codec/1.10/org/apache/commons/codec/digest/B64.java#B64.getRandomSalt%28int%29