哈希与安全

Unix Crypt 生成器

为 Linux 生成带盐的 /etc/shadow 密码哈希。

给这个工具评分

如何使用 Unix Crypt 生成器

  1. 输入您要哈希的密码。
  2. 除非目标系统需要更旧的方案,否则请保持方案为 SHA-512 crypt($6$)。
  3. 点击“生成”,然后将哈希粘贴到 /etc/shadow、您的 Ansible 变量或 cloud-init 文件中。

关于 Unix Crypt 生成器

这些是存在于 Linux /etc/shadow 中的哈希。其格式为 $id$salt$hash,id 表明了生成它的方案:$1$ 是 MD5-crypt,$5$ 是 SHA-256 crypt,$6$ 是 SHA-512 cryptSHA-512 crypt($6$)是大多数现代 Linux 发行版的默认方案,这也是本工具将其设为默认选项的原因——如果你要为一个现代系统写入哈希,几乎可以肯定这就是你想要的那个。

MD5-crypt 值得特别说明,因为它的名字常常让人误解。它由 Poul-Henning Kamp 为 FreeBSD 设计,尽管名字里有 MD5,它并不是对你的密码简单执行一次 MD5——它会混入盐值,对 MD5 应用多次,正是为了拖慢攻击者的速度。$1$ 哈希和一个普通的 MD5 哈希是完全不同的东西,不能互相替代。它仍是这三者中最弱的一个,只有在旧系统别无选择时才值得选用。

这三种方案都加了盐,所以每次运行输出不同——这是正常现象,不是 bug。盐值位于字符串中间,以便系统在校验登录时能够读取回来。这些方案都远胜于原始的不加盐哈希,但对于新应用而言,它们仍然是较弱的选择,因为它们不具备内存困难性:它们消耗 CPU 时间,却几乎不占用内存,所以 GPU 攻击对它们效果很好。这类场景请优先选用 bcryptArgon2。而 crypt 哈希真正大放异彩的地方是系统层面的工作——脚本化的用户创建、Ansible 的 user 任务、cloud-init 的 passwd 字段以及 Docker 镜像,这些场合操作系统就是要这种确切的格式,别无他选。

常见问题

$1$、$5$ 和 $6$ 分别代表什么?

它们是哈希开头的方案标识符:$1$ 是 MD5-crypt,$5$ 是 SHA-256 crypt,$6$ 是 SHA-512 crypt。后面跟着盐值,再之后才是哈希本身,各部分之间用美元符号分隔。

为什么每次点击“生成”哈希都会变化?

因为每次运行都会生成一个全新的随机盐值并混入其中。对同一个密码来说,两个哈希都是有效的——盐值存储在字符串内部,以便系统日后校验登录。

$1$ 和 MD5 哈希是一回事吗?

不是,这一点很容易让人搞混。MD5-crypt 由 Poul-Henning Kamp 为 FreeBSD 设计,它会混入盐值并多次应用 MD5。它并不是对你密码的一次普通 MD5 运算,两者不能互相替代。

我应该选哪一种?

SHA-512 crypt($6$)——它是大多数现代 Linux 发行版的默认方案。只有在面向需要旧方案的老系统时,才降级使用 $5$ 或 $1$。

我应该在自己的 Web 应用中使用 crypt 哈希吗?

不应该。它们加了盐,比原始哈希好得多,但不具备内存困难性,所以 GPU 能高效地攻击它们。应用程序密码请使用 bcrypt 或 Argon2,crypt 则留给 /etc/shadow 和系统配置使用。

我的密码会被存储吗?

不会。它会被发送到我们的服务器进行哈希计算,因为浏览器无法计算 crypt,计算完成后会立即丢弃——绝不记录,绝不存储。对于真实的生产账户密码,在自己的机器上运行 mkpasswd 仍然是更安全的习惯。