Linux: gpg 公钥签名技术学习

2024-08-05 15:07:28 浏览数 (2)

GPG(GNU Privacy Guard)是一种加密软件,广泛用于保护数据的隐私和真实性。其核心是基于公钥密码学(Public Key Cryptography)的技术,即使用一对密钥进行加密和解密操作。本文将深入探讨GPG的公钥签名技术,及其在数据安全中的应用。此外,我们还将介绍如何生成和管理密钥,尤其是ED25519算法的密钥,以及如何在没有密码短语的情况下配置和使用这些密钥。

什么是公钥签名技术?

公钥签名技术是一种确保数据完整性和真实性的方法。在公钥密码学中,每个用户拥有一对密钥:公钥和私钥。公钥可以公开分发,而私钥必须严格保密。签名技术利用这对密钥来创建和验证数字签名。

签名过程

  1. 生成摘要(Hash): 首先,对数据进行哈希运算,生成一个固定长度的哈希值(摘要)。常用的哈希算法有SHA-256等。
  2. 加密摘要: 使用私钥对生成的哈希值进行加密,得到数字签名。
  3. 附加签名: 将数字签名附加在原始数据后,一同发送给接收方。

验证过程

  1. 提取签名: 接收方从收到的数据中提取数字签名和原始数据。
  2. 生成摘要: 对接收到的原始数据再次进行哈希运算,生成哈希值。
  3. 解密签名: 使用发送方的公钥解密数字签名,得到签名时的哈希值。
  4. 对比哈希值: 比较解密后的哈希值与重新生成的哈希值,如果一致,证明数据未被篡改且确实由私钥持有者签名。

GPG 公钥签名的具体实现

在GPG中,实现公钥签名和验证过程非常简单。以下是基本操作步骤:

生成密钥对

首先,用户需要生成一对公私钥:

代码语言:javascript复制

bash
gpg --full-generate-key

根据提示,选择密钥类型、长度和有效期等信息,生成密钥对。

签名文件

使用私钥对文件进行签名:

代码语言:javascript复制

bash
gpg --sign <file>

这将生成一个带有签名的文件,文件扩展名为.gpg

验证签名

接收方使用发送方的公钥验证签名:

代码语言:javascript复制

bash
gpg --verify <file>.gpg

如果签名有效,GPG将提示签名者的身份及签名的有效性。

生成ED25519算法的密钥

ED25519是一种基于椭圆曲线的公钥签名算法,具有高安全性和高性能的特点。以下是使用GPG生成ED25519密钥对的步骤。

创建配置文件

首先,创建一个配置文件,例如gpg-gen-ed25519-key-script,内容如下:

代码语言:javascript复制

plaintext
�ho Generating an ED25519 key
Key-Type: eddsa
Key-Curve: ed25519
Key-Usage: sign cert
Subkey-Type: ecdh
Subkey-Curve: cv25519
Subkey-Usage: encrypt
Name-Real: Your Name
Name-Comment: Your Comment
Name-Email: your.email@example.com
Expire-Date: 0
Passphrase: your-secure-passphrase
%commit
�ho done

生成密钥对

使用以下命令生成ED25519密钥对:

代码语言:javascript复制

bash
gpg --batch --generate-key gpg-gen-ed25519-key-script

验证生成的密钥对

可以使用以下命令列出生成的密钥:

代码语言:javascript复制

bash
yijie@heaven:~$ gpg --list-keys
/home/yijie/.gnupg/pubring.kbx
------------------------------
pub   rsa4096 2024-08-02 [SC] [expires: 2034-07-31]
      7DADA698B9D2D0F4418F48C8596A0C0C2C56C7AD
uid           [ultimate] yijie (for yijie) <heishui@live.com>
sub   rsa4096 2024-08-02 [E] [expires: 2034-07-31]

pub   ed25519 2024-08-02 [SC] [expires: 2034-07-31]
      B2B13AB5FB447C5748009ACA5A8F298F477C40F7
uid           [ultimate] Dave (for Dave) <Dave@example.com>
sub   cv25519 2024-08-02 [E] [expires: 2034-07-31]

导出公钥和私钥

导出公钥:

代码语言:javascript复制

bash
gpg --armor --export your.email@example.com > public.key

导出私钥:

代码语言:javascript复制

bash
gpg --armor --export-secret-keys your.email@example.com > private.key

主密钥与子密钥

在GPG中,主密钥和子密钥是公钥加密体系中的两个重要概念。主密钥是核心密钥,主要用于签名和认证,而子密钥是从主密钥派生出来的辅助密钥,通常用于加密和签名操作。主密钥和子密钥的功能可以根据具体需求进行配置。

生成包含所有功能的主密钥

如果希望简化管理,只使用一个包含所有功能的主密钥,可以创建一个配置文件,指定密钥的用途:

代码语言:javascript复制

plaintext
�ho Generating an all-purpose key
Key-Type: default
Key-Length: 4096
Key-Usage: sign encrypt auth
Name-Real: Your Name
Name-Comment: Your Comment
Name-Email: your.email@example.com
Expire-Date: 0
Passphrase: your-secure-passphrase
%commit
�ho done

使用以下命令生成密钥对:

代码语言:javascript复制

bash
gpg --batch --generate-key gpg-gen-all-purpose-key-script

处理无密码短语的密钥

即使没有为私钥设置密码短语,GPG 可能仍会提示输入密码。这通常是由于GPG代理的配置或默认行为导致的。以下是避免密码提示的方法:

配置GPG代理

编辑或创建 ~/.gnupg/gpg-agent.conf 文件,添加以下行:

代码语言:javascript复制

plaintext
allow-loopback-pinentry

重启GPG代理:

代码语言:javascript复制

bash
gpgconf --kill gpg-agent
gpgconf --launch gpg-agent

使用 --pinentry-mode loopback 选项

在执行GPG操作时,使用 --pinentry-mode loopback 选项,使GPG在非交互模式下工作,并避免密码提示:

代码语言:javascript复制

bash
gpg --pinentry-mode loopback --import your-private-key.asc

检查和设置默认 pinentry 模式

确保GPG配置文件 ~/.gnupg/gpg.conf 中包含以下行,以默认启用 loopback 模式:

代码语言:javascript复制

plaintext
use-agent
pinentry-mode loopback

总结

通过理解和应用GPG的公钥签名技术,我们可以在多种应用场景中有效地保护数据的完整性和真实性。无论是生成包含所有功能的主密钥,还是处理无密码短语的密钥,正确的配置和使用方法都是确保数据安全的关键。

0 人点赞