SHA 散列算法
安全散列算法(Secure Hash Algorithms, SHA)是一组散列函数(台湾地区又称杂凑函数)的集合,常用于各种用途。
以下是 Arch Linux 中的一些使用示例:
- 验证 Arch Linux ISO 和软件包的完整性。
- 使用 Git 固定软件版本。
- 加密密钥的安全保护和验证,例如磁盘加密。
- 密码验证,详见安全#密码的散列值以及本文中的相关 SHA 散列的介绍。
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开头。