前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux: gpg 公钥签名技术学习

Linux: gpg 公钥签名技术学习

作者头像
运维开发王义杰
发布2024-08-05 15:07:28
1400
发布2024-08-05 15:07:28
举报
文章被收录于专栏:运维开发王义杰

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-08-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维开发王义杰 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是公钥签名技术?
    • 签名过程
      • 验证过程
      • GPG 公钥签名的具体实现
        • 生成密钥对
          • 签名文件
            • 验证签名
            • 生成ED25519算法的密钥
              • 创建配置文件
                • 生成密钥对
                  • 验证生成的密钥对
                    • 导出公钥和私钥
                    • 主密钥与子密钥
                      • 生成包含所有功能的主密钥
                      • 处理无密码短语的密钥
                        • 配置GPG代理
                          • 使用 --pinentry-mode loopback 选项
                            • 检查和设置默认 pinentry 模式
                              • 总结
                              领券
                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档