对于“公钥加密,私钥解密”有在 ssh 的 authorized_keys 这种常见的应用场景,那么“私钥签名,公钥验证”有什么常见的应用场景?

2024-09-21 10:00:21 +08:00
 amiwrong123
个人目的只是想从 应用使用的角度来理解,非对称加密、公钥私钥这些概念。

对于 ssh 的`authorized_keys`的应用使用过程为:
● 服务器检查 `authorized_keys` 文件,找到与客户端提供的公钥匹配的条目。
● 服务器生成一个随机数,并使用公钥对其进行加密,然后将加密后的消息发送给客户端。
● 客户端使用私钥解密该消息,并将解密后的随机数返回给服务器。
● 服务器验证返回的随机数是否正确。如果正确,服务器接受客户端的连接请求。
从这个过程,理解了"正因为客户端使用了私钥来解密,所以才能证明客户端的身份。",而且反过来,“私钥加密,公钥解密”是无法证明身份的。
自己也去 ssh 连接了多个服务器,查看了`authorized_keys`的内容。也看了客户端自己`~/.ssh/id_rsa.pub`。


那对于“私钥签名,公钥验证”,有什么应用场景是平时接触得到的?
- 而且最好有实物可以查看,帮助理解。
- 而且要是能有一个和我上面差不多的简单分析,就更好了。
7113 次点击
所在节点    程序员
60 条回复
mark2025
2024-09-21 22:28:55 +08:00
ssh 也可能双向认证的: 即认证服务端,也认证客户端
neilp
2024-09-21 22:39:29 +08:00
现在的公钥私钥, 主要都是来签名的, 几乎不在直接加密了.
ssh 或者 ssl/tls 中, 都是用 dh/ecdh 来动态协商产生对称加密密钥. 最后,用公钥私钥来签名就好了. 因为对称的密钥不需要通过网络传输, 所以不存在加密的问题.
amiwrong123
2024-09-21 22:40:58 +08:00
@expy #39
那如果是不省事的做法呢,还会做啥呀
amiwrong123
2024-09-21 22:43:20 +08:00
@mark2025 #41
authorized_keys 我知道是服务器用来验证客户端的身份的。
你说的“认证服务端”,是指那个客户端保存的 known_hosts 文件吗?

但我看了 known_hosts 的用法:
A 通过 ssh 首次连接到 B ,B 会将公钥 1 传递给 A ,A 将公钥 1 存入 known_hosts 文件中,以后 A 再连接 B 时,B 依然会传递给 A 一个公钥 2 ,OpenSSH 会核对公钥,通过对比公钥 1 与公钥 2 是否相同来进行简单的验证,如果公钥不同,OpenSSH 会发出警告, 避免你受到 DNS Hijack 之类的攻击。

---------

只是一个很简单的对比 公钥 1 和公钥 2 啊
raw0xff
2024-09-21 22:48:53 +08:00
我记得有个开源项目 nostr 貌似可以做个例子。
大概是个去中心化的 twitter 微博,用户信息和数据存在第三方建立的节点上(relay),用户可选择在多个不同的 relay 上存储自己和订阅别人,用户 ID 就是公钥,用户明文发推,但私信用接收者公钥加密。relay 只需要无脑收发存储,不需要对用户做任何身份验证。
wOuv7i4e7XxsSOR1
2024-09-21 22:52:05 +08:00
你的问题在于书读的不多但想的太多
amiwrong123
2024-09-21 22:56:14 +08:00
@Xheldon #29
哈哈,没想到有你这个应用场景。
geelaw
2024-09-22 04:18:23 +08:00
请看 /t/519617 里面我的回复。

@kera0a #3 @NessajCN #7 #11 #15 #18 #20 @amiwrong123 #10 #19 #30 @LaTero #13
@iOCZS #26 @R18 #36

“用私钥加密,用公钥解密”在任何一本密码学教材上都不会出现。此外,私钥加密蕴涵着数字签名(这是一个公钥对象),但目前不知道数字签名蕴涵着公钥加密。

另请参阅 https://www.zhihu.com/question/432504839/answer/1681747812 答案和评论区。
expy
2024-09-22 07:57:31 +08:00
@amiwrong123 就你标题里的验签名啊,https://archlinux.org/download/ Download verification 有详细说明。
neptuno
2024-09-22 08:21:27 +08:00
也可以用来发邮件
jiefengwang
2024-09-22 09:33:15 +08:00
GitHub 或者其他的代码托管平台,对于 commit 的提交进行签名,应该属于是这个场景吧
moioooo
2024-09-22 10:51:33 +08:00
公钥加密的东西,只有私钥可以解密,
私钥加密的东西,也只有公钥可以解密。
由此引申的个种用法,利用的是以上两种机制。
最好理解的,公钥是公开的,私钥是藏起来自己用。
我用私钥加密了个文件,所有人可以用公钥解密。这叫数字签名,证明是我发的。
你用公钥加密一个文件给我,只有我可以用私钥解密,这个用于数据传输。
xiaokongwu
2024-09-22 12:46:03 +08:00
PDF 数字签名,就是私钥签公钥验
mark2025
2024-09-22 14:08:44 +08:00
@moioooo 加密和签名还是有区别的,前者是加密出密文,必须解密还原才知道明文;后者对原文(可以是明文也可以是密文)散列值进行签名,用于验证原文是否有变化。
mark2025
2024-09-22 14:11:22 +08:00
@amiwrong123 哈哈,其实前面说的双向验证值得是 SSH 登录时 SSL/TLS 层面的操作,不是你标题说的 authorized_keys 相关的验证~~
mike1936
2024-09-22 15:23:37 +08:00
说一个场景:JWT ,用户(浏览器之类的)向认证服务器提供登录信息,认证服务器验证后把用户对应的资源访问权限信息( Payload )用 [认证服务器的私钥签名] ,之后把权限信息和签名( JWT )返回给用户,用户拿到 JWT 之后带着个 JWT 去请求,资源服务器用 [认证服务器的公钥验证] JWT 里的没有被篡改,根据 JWT 里面的权限信息给用户返回对应的资源数据
rajab
2024-09-22 20:27:42 +08:00
各个 Linux 发行版的源仓库中的各种包,都是用作者的私钥签名,然后系统内置了他们的公钥来验证包是否被篡改或是被 认证的,不知道我的理解对不对
proxytoworld
2024-09-22 23:57:10 +08:00
@amiwrong123 #10 在没有约定 数据格式的情况下,没办法使用公钥证明身份

多的我也懒得说了
proxytoworld
2024-09-22 23:58:49 +08:00
@proxytoworld 使用密钥加密,只有使用密钥签名才可以验证身份
hanyuwei70
2024-09-23 16:30:17 +08:00
SSH 是典型的私钥签名,公钥验证……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1074549

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX