为什么MD5密码散列不同?

我一直在想,为什么运行“echo”helloworld“| openssl passwd -1 -stdin”每次都会产生不同的结果?如果我把任何哈希放在我的/ etc / shadow中,我可以使用它们作为我的密码和login到我的系统,它是如何工作的?

computer:/ user$ echo 'helloworld' | openssl passwd -1 -stdin $1$xlm86SKN$vzF1zs3vfjC9zRVI15zFl1 computer:/ user$ echo 'helloworld' | openssl passwd -1 -stdin $1$/0.20NIp$pd4X9xTZ6sF8ExEGqAXb9/ computer:/ user$ echo 'helloworld' | openssl passwd -1 -stdin $1$sZ65uxPA$pENwlL.5a.RNVZITN/zNJ1 computer:/ user$ echo 'helloworld' | openssl passwd -1 -stdin $1$zBFQ0d3Z$SibkYmuJvbmm8O8cNeGMx1 computer:/ user$ echo 'helloworld' | openssl passwd -1 -stdin $1$PfDyDWER$tWaoTYym8zy38P2ElwoBe/ 

我会认为,因为我使用这个散列来向系统描述我的密码应该是什么,所以我应该每次都得到相同的结果。 为什么不呢?

他们都有不同的盐 。 每次都select一种独特的盐,因为盐不应该被重复使用。 对每个密码使用独特的盐使他们抵抗彩虹表攻击。

事实上,如果你将盐提供给命令行,你总会得到相同的结果。

 $ echo 'helloworld' | openssl passwd -1 -stdin -salt my-salt $1$my-salt$S/PsLSioHR8ffN8bpIzsk/ $ echo 'helloworld' | openssl passwd -1 -stdin -salt my-salt $1$my-salt$S/PsLSioHR8ffN8bpIzsk/ $ echo 'helloworld' | openssl passwd -1 -stdin -salt my-salt $1$my-salt$S/PsLSioHR8ffN8bpIzsk/