如何在 Linux 上对密码进行哈希处理 - Linux 安全如何在 Linux 上对密码进行哈希处理 - Linux 安全如何在 Linux 上对密码进行哈希处理 - Linux 安全如何在 Linux 上对密码进行哈希处理 - Linux 安全
  • 业务
  • 目标
  • 支持
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容

如何在 Linux 上对密码进行哈希处理 - Linux 安全

发表 admin at 2025年2月28日
类别
  • 未分类
标签

密码不应以纯文本形式存储。无论我们谈论的是网络应用程序还是操作系统,它们都应该始终采用哈希形式(例如,在Linux上,哈希密码存储在/etc/shadow 文件)。散列是通过使用一些复杂的算法将密码转换为不同字符串的过程。此过程是单向:无法将散列密码恢复为其原始的纯文本形式。哈希通常涉及使用随机数据作为哈希算法的附加输入,因此相同的密码经过两次哈希处理不会产生相同的结果。该随机数据称为盐。在本教程中,我们将探讨一些可用于在 Linux 上对密码进行哈希处理的方法。

在本教程中您将学习:

  • 如何使用 mkpasswd 实用程序对密码进行哈希处理

  • 如何使用 python 和 crypt 模块对密码进行哈希处理

  • 如何使用 openssl 对密码进行哈希处理

使用的软件要求和约定

使用 mkpasswd 对密码进行哈希处理

我们在本教程中讨论的第一种生成密码哈希的方法是使用 mkpasswd 实用程序,因此首先要做的就是确保它已安装在我们的系统上。该应用程序可在所有最常用的 Linux 发行版的官方存储库中找到。要在 Fedora 上安装它,我们应该运行以下命令:

$ sudo dnf install mkpasswd

相反,在 Debian 及其许多衍生版本上,该应用程序是“whois”软件包的一部分(无论如何都应该默认安装):

$ sudo apt install whois

一旦应用程序安装在我们的系统上,我们就可以使用它来哈希我们的纯密码。基本语法如下:

$ mkpasswd -m <hashing-algorithm>

使用 -m 选项(--method 的缩写)我们指定要使用的哈希算法。要获取可用列表,我们只需传递“help”作为选项的参数:

$ mkpasswd -m help
Available methods:
yescrypt        Yescrypt
gost-yescrypt   GOST Yescrypt
scrypt          scrypt
bcrypt          bcrypt
bcrypt-a        bcrypt (obsolete $2a$ version)
sha512crypt     SHA-512
sha256crypt     SHA-256
sunmd5          SunMD5
md5crypt        MD5
bsdicrypt       BSDI extended DES-based crypt(3)
descrypt        standard 56 bit DES-based crypt(3)
nt              NT-Hash

推荐的算法是 sha512crypt(这是 Linux 上使用的算法)。一旦我们运行该命令,系统就会提示我们输入要散列的密码。出于安全原因,该程序以交互方式运行:如果我们必须直接输入纯文本密码作为某个选项的参数,则它将在 ps 的输出中显示为命令以及 shell 历史记录中。

哈希密码作为命令的输出返回:

$ mkpasswd -m sha512crypt
Password:
$6$2sE/010goDuRSxxv$o18K52wor.wIwZp6aXXBC69phYwPQahKQo2ex8ce2.f0V9BtnYZc0KtTB0WGm2m5pNOcL1Ep3kgDWmJCz36B./

salt 是随机生成的,但要显式传递值,我们可以使用 -s 选项(--salt 的缩写)。

如果由于某种原因我们仍然想以非交互方式输入要进行哈希处理的密码(再次强调,不建议这样做),我们将使用 --stdin 选项和一些重定向魔法:

$ mkpasswd -m sha512crypt --stdin <<< "plainpassword"

使用 Python 对密码进行哈希处理

我们可以用来在 Linux 上生成密码哈希的另一种方法是使用 Python 和 crypt 模块。首先我们导入模块,然后使用其中包含的 crypt 函数。该函数有一个强制参数,即我们要加密的明文;它返回单向哈希密码,前面加上盐。哈希方法可以作为函数的第二个参数显式传递,从以下选项中选择一种(如果未指定,则使用平台上可用的最强者):

  • crypt.METHOD_SHA512

  • crypt.METHOD_SHA256

  • crypt.METHOD_BLOWFISH

  • crypt.METHOD_MD5

  • crypt.METHOD_CRYPT

crypt.METHOD_SHA512 是最强的。使用时,密码将使用 sha512 函数进行哈希处理,并使用 16 字符的盐。

为了避免将原始密码作为命令的一部分传递(这也将被记住在 python shell 历史记录中),我们还应该导入 getpass 模块,并使用交互方式请求密码其中包含 getpass() 方法。

要生成散列密码,我们将按以下步骤操作:

>>> import crypt
>>> import getpass
hashed_password = crypt.crypt(getpass.getpass(), crypt.METHOD_SHA512)
Password:

在 shell 中工作时,上面的示例可以作为单行执行,使用 -c 选项调用 Python 解释器,这让我们可以指定要直接执行的命令:

$ hashed_password="$(python3 -c 'import crypt; import getpass; print(crypt.crypt(getpass.getpass(), crypt.METHOD_SHA512))')"

在上面的示例中,您可以注意到我们使用了 print() 函数来打印生成的哈希密码,以便它将用作命令替换的结果,并将成为hashed_password 变量。

使用 openssl 对密码进行哈希处理

我们在本教程中探讨的第三种也是最后一种生成密码哈希的方法是使用 openssl passwd 命令。默认情况下,该命令使用 crypt 算法生成哈希密码。要使用 sha512 算法,我们必须使用 -6 选项。这是我们要写的:

$ openssl passwd -6
Password:
Verifying - Password:
$6$82Bk5H60hZqXBSUp$GPdqJ1zNQOXwuXqUBBB59a4oaKah/HpR3nbiNrW1eXXPH48mTRZ3y6cOOMHnBtMjLF9IBfhDWfQMXMk8kM5kZ/

正如您所看到的,出于我们已经提到的安全原因,即使使用此方法,也会以交互方式请求密码;此外,还会提示我们再次插入以进行验证。可以使用 --noverify 选项禁用此行为。

与其他方法一样,salt 是自动生成的,但我们有机会使用 --salt 选项直接提供它:

$ openssl passwd -6 --salt <SALT>

我们还有机会从文件中读取密码。我们所要做的就是使用 -in 选项,并将包含密码的文件路径作为参数传递。假设我们的密码写在 password.txt 文件中,我们会这样写:

$ openssl passwd -6 -in password.txt

使用最后一个选项时,我们可以在文件中提供多个密码(每行一个)。它们将被单独散列,结果将由命令返回。

最后,如果我们不介意安全隐患,我们可以将要哈希的密码直接作为命令的最后一个参数传递:

$ openssl passwd -6 "plainpassword"

结束语

在本教程中,我们看到了三种可用于在 Linux 上哈希密码的方法。我们了解了如何使用 mkpasswd 实用程序,如何使用 crypt 模块通过 Python 编程语言生成密码哈希,最后,如何使用openssl。

©2015-2025 Norria support@norria.com