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

89 天前
 amiwrong123
个人目的只是想从 应用使用的角度来理解,非对称加密、公钥私钥这些概念。

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


那对于“私钥签名,公钥验证”,有什么应用场景是平时接触得到的?
- 而且最好有实物可以查看,帮助理解。
- 而且要是能有一个和我上面差不多的简单分析,就更好了。
5366 次点击
所在节点    程序员
60 条回复
mark2025
88 天前
ssh 也可能双向认证的: 即认证服务端,也认证客户端
neilp
88 天前
现在的公钥私钥, 主要都是来签名的, 几乎不在直接加密了.
ssh 或者 ssl/tls 中, 都是用 dh/ecdh 来动态协商产生对称加密密钥. 最后,用公钥私钥来签名就好了. 因为对称的密钥不需要通过网络传输, 所以不存在加密的问题.
amiwrong123
88 天前
@expy #39
那如果是不省事的做法呢,还会做啥呀
amiwrong123
88 天前
@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
88 天前
我记得有个开源项目 nostr 貌似可以做个例子。
大概是个去中心化的 twitter 微博,用户信息和数据存在第三方建立的节点上(relay),用户可选择在多个不同的 relay 上存储自己和订阅别人,用户 ID 就是公钥,用户明文发推,但私信用接收者公钥加密。relay 只需要无脑收发存储,不需要对用户做任何身份验证。
wOuv7i4e7XxsSOR1
88 天前
你的问题在于书读的不多但想的太多
amiwrong123
88 天前
@Xheldon #29
哈哈,没想到有你这个应用场景。
geelaw
88 天前
请看 /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
88 天前
@amiwrong123 就你标题里的验签名啊,https://archlinux.org/download/ Download verification 有详细说明。
neptuno
88 天前
也可以用来发邮件
jiefengwang
88 天前
GitHub 或者其他的代码托管平台,对于 commit 的提交进行签名,应该属于是这个场景吧
moioooo
88 天前
公钥加密的东西,只有私钥可以解密,
私钥加密的东西,也只有公钥可以解密。
由此引申的个种用法,利用的是以上两种机制。
最好理解的,公钥是公开的,私钥是藏起来自己用。
我用私钥加密了个文件,所有人可以用公钥解密。这叫数字签名,证明是我发的。
你用公钥加密一个文件给我,只有我可以用私钥解密,这个用于数据传输。
xiaokongwu
88 天前
PDF 数字签名,就是私钥签公钥验
mark2025
88 天前
@moioooo 加密和签名还是有区别的,前者是加密出密文,必须解密还原才知道明文;后者对原文(可以是明文也可以是密文)散列值进行签名,用于验证原文是否有变化。
mark2025
88 天前
@amiwrong123 哈哈,其实前面说的双向验证值得是 SSH 登录时 SSL/TLS 层面的操作,不是你标题说的 authorized_keys 相关的验证~~
mike1936
88 天前
说一个场景:JWT ,用户(浏览器之类的)向认证服务器提供登录信息,认证服务器验证后把用户对应的资源访问权限信息( Payload )用 [认证服务器的私钥签名] ,之后把权限信息和签名( JWT )返回给用户,用户拿到 JWT 之后带着个 JWT 去请求,资源服务器用 [认证服务器的公钥验证] JWT 里的没有被篡改,根据 JWT 里面的权限信息给用户返回对应的资源数据
rajab
87 天前
各个 Linux 发行版的源仓库中的各种包,都是用作者的私钥签名,然后系统内置了他们的公钥来验证包是否被篡改或是被 认证的,不知道我的理解对不对
proxytoworld
87 天前
@amiwrong123 #10 在没有约定 数据格式的情况下,没办法使用公钥证明身份

多的我也懒得说了
proxytoworld
87 天前
@proxytoworld 使用密钥加密,只有使用密钥签名才可以验证身份
hanyuwei70
86 天前
SSH 是典型的私钥签名,公钥验证……

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

https://www.v2ex.com/t/1074549

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

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

© 2021 V2EX