使用加密技术确保数据完整性和真实性

CompTIABeginner
立即练习

介绍

在数字世界中,确保数据未被篡改(完整性)并来自可信来源(真实性)至关重要。密码学提供了实现这些目标的工具。

本实验将向你介绍在 Linux 系统上的基础密码学实践。你将学习:

  • 哈希(Hashing): 为文件创建一个唯一、固定大小的“指纹”。即使文件只改变了一个比特,哈希也会完全改变。我们将使用 MD5 和 SHA256 算法。
  • 数字签名(Digital Signatures): 使用私钥对文件进行“签名”,这使得任何拥有相应公钥的人都可以验证文件的真实性且未被修改。
  • 加密(Encryption): 对文件内容进行混淆,使其只能被拥有正确密钥来解密的人读取,从而确保机密性。

我们将使用标准的 Linux 命令行工具,包括 md5sumsha256sum 和 GnuPG (gpg),它是 Pretty Good Privacy (PGP) 标准的 GNU 实现。在本实验结束时,你将能够自信地对文件进行哈希、签名、验证、加密和解密。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 94%。获得了学习者 100% 的好评率。

计算文件哈希值 (MD5 和 SHA256)

在本步骤中,你将学习如何为文件计算密码学哈希。哈希函数接收一个输入(如文件),并返回一个固定大小的字节字符串,称为哈希值或摘要。该值充当数字指纹。

首先,我们将使用 md5sum 命令计算在你的 ~/project 目录中预先创建的 important_data.txt 文件的 MD5 哈希。

在你的终端中执行以下命令:

md5sum important_data.txt

你将看到一个输出,由哈希值后跟文件名组成:

d9e21981521545759153147864347199  important_data.txt

虽然 MD5 速度很快,但由于存在漏洞,它现在被认为不适用于密码学目的。一个更安全且常用的替代方案是 SHA-2 系列,特别是 SHA256。

现在,让我们使用 sha256sum 命令计算 SHA256 哈希:

sha256sum important_data.txt

输出将是一个更长、更安全的哈希:

a39b2c414f234246a2535321238863141b1a4849443b9992994b4189317e8591  important_data.txt

如果你修改了 important_data.txt 中的任何内容,MD5 和 SHA256 哈希都会完全改变,从而让你能够轻松检测到任何未经授权的修改。

安装和配置 GnuPG (GPG)

在本步骤中,你将安装 GnuPG (GPG),这是我们将用于数字签名和加密的工具。虽然 GPG 通常在现代 Linux 发行版中已预装,但确保其存在且为最新版本是一个好习惯。

首先,使用 apt-get update 更新你的软件包列表。你需要使用 sudo,因为软件包管理需要管理员权限。

sudo apt-get update

接下来,安装 gnupg 包。-y 标志会自动回答“是”来处理任何提示,使安装过程无需交互。

sudo apt-get install -y gnupg

安装完成后,你可以通过检查其版本来验证 GPG 是否已正确安装。

gpg --version

你应该会看到类似以下的输出,确认安装成功。版本号和详细信息可能会略有不同。

gpg (GnuPG) 2.2.27
libgcrypt 1.9.4
Copyright (C) 2021 Free Software Foundation, Inc.
License GNU GPL-3.0-or-later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: /home/labex/.gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
        CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2

现在 GPG 已准备就绪,我们可以继续创建我们自己的加密密钥了。

生成用于数字签名的 GPG 密钥对

在本步骤中,你将生成自己的 GPG 密钥对,它包含一个私钥和一个公钥。

  • 私钥: 必须保密。它用于解密消息和创建数字签名。
  • 公钥: 可以自由共享。它用于加密发送给你的消息以及验证你的数字签名。

通常,gpg --full-generate-key 会运行一个交互式设置。为了让实验过程更简单且无需交互,我们将使用 GPG 的批处理模式。首先,创建一个参数文件来指定我们密钥的详细信息。

使用以下 cat 命令和“here document”来即时创建 gen-key-params 文件:

cat << EOF > gen-key-params
%echo Generating a basic key
Key-Type: RSA
Key-Length: 2048
Subkey-Type: RSA
Subkey-Length: 2048
Name-Real: LabEx User
Name-Email: user@labex.io
Expire-Date: 0
%no-protection
%commit
%echo done
EOF

此文件指示 GPG 为名为“LabEx User”且邮箱为“user@labex.io”的用户创建一个 2048 位 RSA 密钥。该密钥将永不过期,并且我们使用 %no-protection 来简化创建过程,使其无需密码短语(在实际场景中,你应该始终使用强密码短语)。

现在,使用参数文件生成密钥:

gpg --batch --gen-key gen-key-params

GPG 将使用这些参数生成密钥对。这可能需要几分钟时间。完成后,你可以列出你的密钥来确认密钥对已成功创建。

gpg --list-keys

输出应显示你新创建的公钥,类似如下:

/home/labex/.gnupg/pubring.kbx
-------------------------------
pub   rsa2048 2023-10-27 [SC]
      XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
uid           [ultimate] LabEx User <user@labex.io>
sub   rsa2048 2023-10-27 [E]

你现在拥有了一个可用于签名和加密文件的 GPG 密钥对。

使用 GPG 对文件进行数字签名和验证

在本步骤中,你将使用你的私钥为文件创建数字签名。此签名证明文件源自你,并且自你签名以来未被修改。

我们将创建一个“分离式”签名,它存储在一个单独的文件中。这很有用,因为原始文件保持不变。

要对 important_data.txt 进行签名,请运行以下命令。GPG 将自动使用你刚刚生成的默认私钥。

gpg --detach-sign important_data.txt

由于我们创建密钥时没有设置密码短语,因此不会提示你输入。现在,列出目录中的文件以查看新的签名文件。

ls

你将看到原始文件及其签名:

gen-key-params  important_data.txt  important_data.txt.sig

现在,假设你是一名收件人,收到了 important_data.txtimportant_data.txt.sig,以及你的公钥。为了验证文件的真实性和完整性,他们将运行 gpg --verify 命令。

让我们自己来执行验证:

gpg --verify important_data.txt.sig important_data.txt

输出将确认签名是有效的:

gpg: Signature made Mon Aug  4 16:39:30 2025 CST
gpg:                using RSA key 8765265B14E42532B9CBAE6DE2120C9784C69814
gpg: Good signature from "LabEx User <user@labex.io>" [ultimate]

“Good signature”(签名良好)消息确认文件是真实的且未被修改。

使用 GPG 加密和解密文件

在本步骤中,你将学习如何加密文件以保护其机密性。与签名(使用你的私钥)不同,为他人加密文件需要他们的公钥。然后,接收者使用他们的私钥来解密它。

在这里,我们将为自己加密 important_data.txt,因此我们将使用我们自己的公钥作为接收者的密钥。

使用以下命令加密文件。--recipient 标志指定使用谁的公钥进行加密,--output 定义加密文件的名称。

gpg --encrypt --recipient "user@labex.io" --output important_data.txt.gpg important_data.txt

如果你尝试查看新加密文件 important_data.txt.gpg 的内容,你将看到不可读的二进制数据。

cat important_data.txt.gpg

现在,让我们解密文件。此操作需要相应的私钥。由于你拥有私钥,因此可以解密消息。我们将解密后的内容保存到一个名为 decrypted_data.txt 的新文件中。

gpg --decrypt --output decrypted_data.txt important_data.txt.gpg

GPG 将使用你的私钥解密文件。你将在终端上看到一些来自 GPG 的信息,包括文件已使用你的密钥加密的确认。

最后,查看解密文件的内容以确认过程成功。

cat decrypted_data.txt

输出应该是原始的、可读的消息:

This is a secret message that needs to be protected.

你已成功加密文件以保护其内容,然后解密文件以检索原始信息。

总结

在本实验中,你已在 Linux 系统上获得了使用基本加密工具和概念的实践经验。你已成功完成了以下任务:

  • 使用 md5sumsha256sum 计算文件哈希值以确保数据完整性。
  • 安装和配置了 GnuPG (gpg),这是开源加密的标准工具。
  • 生成了个人 GPG 密钥对(公钥和私钥)。
  • 使用 gpg --detach-sign 创建数字签名,以提供真实性和完整性。
  • 使用 gpg --verify 验证数字签名。
  • 使用 gpg --encrypt 加密文件以保护其机密性。
  • 使用 gpg --decrypt 解密文件以访问其原始内容。

这些技能对于保护数据安全、验证软件下载以及在各种专业和个人环境中保护通信至关重要。