目前正在对基于linux的密码进行身份验证进行一些分析,我理解如下:
用户密码哈希存储在/ etc / shadow中,盐用于生成它们。 id还提供用于获取哈希的算法。为了验证密码是否正确,我们将id和salt传递给crypt函数,生成临时散列并将其与注册的散列进行比较。
但是,例如,当您创建新用户时,需要使用hash和salt填充该shadow文件。 Hash当然是通过调用crypt函数获得的,但我无法弄清楚在调用crypt函数时如何生成salt。
实际上,根据我对libc代码相对于crypt函数的阅读和底层,生成随机盐没有任何意义。我们可以在创建新用户时为crypt提供我们手工创建的随机盐,但我们几乎总是创建用户而不为他们的密码散列提供盐。
那么,在创建用户时第一次生成盐是怎么产生的?是/ dev / random使用了吗?
我很欣赏答案中的一些代码或命令。
谢谢!
答案 0 :(得分:0)
没有生成盐的标准函数,但每个好的库都应该为您生成随机函数。正如在另一个评论中所写的,一些盐必须是特定的字母表,例如" A-Za-z0-9。/"对于crypt()而其他人接受随机数据。
对于Java,请查看实现Unix crypt()兼容功能的Apache Commons Codec项目。它是一个简单的for循环,用于从给定的字母表中选择随机字符: