我正在阅读关于影子文件的维基百科文章 ,并提到这些行的格式是这样的:
$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