如何在创建新用户时创建用户密码哈希的salt,以便在之后与crypt()一起使用?

时间:2016-02-16 09:30:05

标签: linux authentication salt crypt

目前正在对基于linux的密码进行身份验证进行一些分析,我理解如下:

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

但是,例如,当您创建新用户时,需要使用hash和salt填充该shadow文件。 Hash当然是通过调用crypt函数获得的,但我无法弄清楚在调用crypt函数时如何生成salt。

实际上,根据我对libc代码相对于crypt函数的阅读和底层,生成随机盐没有任何意义。我们可以在创建新用户时为crypt提供我们手工创建的随机盐,但我们几乎总是创建用户而不为他们的密码散列提供盐。

那么,在创建用户时第一次生成盐是怎么产生的?是/ dev / random使用了吗?

我很欣赏答案中的一些代码或命令。

谢谢!

1 个答案:

答案 0 :(得分:0)

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

对于Java,请查看实现Unix crypt()兼容功能的Apache Commons Codec项目。它是一个简单的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