跳转到内容

SHA 散列算法

来自 Arch Linux 中文维基

安全散列算法(Secure Hash Algorithms, SHA)是一组散列函数(台湾地区又称杂凑函数)的集合,常用于各种用途。

以下是 Arch Linux 中的一些使用示例:

SHA 密码散列

自 shadow包 软件包的 4.1.4.3-3 版本(参见 bug 13591)到 4.14.0 版本(参见这则公告)内,Arch Linux 默认将 SHA-512 作为密码散列函数。它取代了较为老旧的、因存在碰撞攻击漏洞而已经被攻破的 MD5 散列函数。有关更多信息,参见zhwp:SHA家族#SHA函数对比。

配置

可以使用 rounds=N 选项来配置密码散列函数,这可以提升 {{zhwp:密钥延伸|密钥延伸(Key strengthening)}} 。例如 rounds=65536 意味着对于每一个要测试的密码,攻击者均需要重复计算 65536 次散列值才能与 /etc/shadow 中的密码散列值进行比对。

因此,攻击者的破解速度将会延缓 65536 倍。这也意味着登录时也需要计算 65536 次散列值,但是即便在慢速计算机上,这个流程也不会超过一秒。

从 pam包 1.6.0 版本开始,可以通过以下两种方式配置 SHA-512 的 rounds 选项:编辑 /etc/login.defs 文件,为 SHA_CRYPT_MAX_ROUNDS 参数设置一个值;或者编辑 /etc/pam.d/passwd 并添加合适的值的 rounds 选项[1]。

如果不使用 rounds 选项,那么 PAM 将使用一个与 /etc/login.defs 中注释掉的 5000 轮示例不同的默认值,因为与 PAM 走独立验证栈和独立配置文件 /etc/pam.d 不同的是,shadow包 源码中硬编码了默认值[2]。

例如:

/etc/pam.d/passwd
password	required	pam_unix.so sha512 shadow nullok rounds=65536
警告:如果在上述配置示例中显式指定了 sha512 等散列算法,它将会覆盖后续运行 passwd 命令时默认使用的 yescrypt 散列算法。

如需了解 /etc/pam.d/passwd 密码选项的详细说明,参阅 pam_unix(8)。

使用方法

即便更新了加密设置,在此之前设置的密码也并不会自动重新计算散列值。若需解决这个问题,需要重置所有用户的密码,以便于使用新的算法重新计算散列值。

以 root 身份执行以下命令

# passwd username

其中 username 是需要修改密码的用户名,随后重新输入他们当前的密码,系统就会使用新算法对重新计算散列值。

若需验证密码是否已经重新计算散列值,以 root 身份检查 /etc/shadow 文件。

  • 使用 SHA-256 的密码散列值以 $5 开头。
  • 使用 SHA-512 的密码散列值以 $6 开头。
  • 使用 yescrypt 的密码散列值以 $y 开头。