/ etc / shadow中的哈希如何生成?

我正在阅读关于影子文件的维基百科文章 ,并提到这些行的格式是这样的:

$id$salt$hashed 

所以,我的问题是,它是如何工作的?

我试图计算我自己的账户的散列,我有密码,所以我用这个命令:

sha512sum {salt} + {my_clear_text_password}

但是输出结果与我自己看到的散列不同。 那么它是怎样工作的? 我错过了什么?

    有几件事情需要考虑(你必须阅读Linux coreutils和glibc2中的资料来确认)

    • sha512sum的输出显示为可打印的hex符号,而存储在shadow文件中的输出显示为base64,因此它们将不同。

    • 我认为影子文件中的sha512sum已经不止一次地通过了散列函数( #define ROUNDS_DEFAULT 5000 ),而sha512sum只是通过散列传递了“文件”一次。

    • 可以通过一个或两个命令添加填充来alignment可能不同的数据。

    shadow(5)手册页 :

    encryption的密码

    有关如何解释此string的详细信息,请参阅crypt (3)。

    如果密码字段包含一些不是crypt (3)的有效结果的string,例如! 或*,用户将不能使用unix密码login(但用户可以通过其他方式login系统)。

    该字段可能为空,在这种情况下,不需要密码来authentication为指定的login名称。 但是,如果密码字段为空,则读取/ etc / shadow文件的某些应用程序可能决定不允许任何访问。

    以感叹号开头的密码字段意味着密码被locking。 线上的其余字符表示密码被locking之前的密码字段。

    crypt(3)手册页 :

    crypt()是密码encryptionfunction。 它基于数据encryption标准algorithm,其中包含了旨在阻止使用硬键实现的关键字search。

    键是用户input的密码。

    盐是从组[a-zA-Z0-9./]中select的两个字符的string。 该string用于以4096种不同的方式扰乱algorithm。

    通过取密钥的前八个字符中的每一个的最低7位,获得一个56位密钥。 这个56位密钥被用来重复encryption一个常量string(通常是一个由全零组成的string)。 返回值指向encryption密码,一系列13个可打印的ASCII字符(前两个字符代表盐本身)。 返回值指向内容被每次调用覆盖的静态数据。

    如果要以与/etc/shadow文件存储散列相同的方式创build散列,请使用以下命令:

     mkpasswd --method=sha-512 --salt=YOUR_SALT PASSWORD