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

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

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


那对于“私钥签名,公钥验证”,有什么应用场景是平时接触得到的?
- 而且最好有实物可以查看,帮助理解。
- 而且要是能有一个和我上面差不多的简单分析,就更好了。
5063 次点击
所在节点    程序员
60 条回复
cxh116
56 天前
linux 的包就是私钥签名,公钥验证,防止镜像站等中间人篡改,添加恶意代码。
leonshaw
56 天前
非对称加密基本上不会直接对数据操作。消息加密是用对方公钥加密一个对称密钥,用对称密钥加密数据。签名是用自己的私钥加密消息内容的 digest 。 会话场景是用于密钥交换阶段。
seers
56 天前
你做过逆向就知道,现在很多 app 就是带了一个 rsa 私钥,然后给 packet 签名发服务器,服务器用公钥验证,这个私钥会用各种方法隐藏起来,防止攻击者找到
Exxfire
56 天前
数字签名的主要作用是保护信息的完整性和防止抵赖。
数字签名的过程:A ----> B 发送一条数据,数据和签名是分开发的。
1. A 先使用摘要算法算出摘要;
2. A 使用自己的私钥对摘要进行加密;
3. A 发送数据给 B ;
4. A 发送签名给 B ;
5. B 收到签名后先使用 A 的公钥进行解密;(体现了防止抵赖的特性)
6. B 收到数据后进行摘要计算,和签名解密出来的摘要进行对比;(验证数据的完整性)

需要注意的是,出于保密性需求,数据发送前也可以使用某种算法进行加密,密钥及算法协商涉及其它过程。
这是书本上学习理解到的知识,没有验证过。
Exxfire
56 天前
非对称加密算法通常不用于数据处理的原因应该是出于性能方面的原因考虑,非对称算法复杂度高,效率低;(相对于对称加密算法而言)
iOCZS
56 天前
取决于解密的数据给谁看,给别人看就公钥解密,给自己看就私钥解密
LemonNoCry
56 天前
@R18 通俗易懂
LLaMA2
56 天前
@amiwrong123

请务必牢记规则

公加私解
私签公验

很多系统中总会存在部分数据有客户端提供,此时客户端总是不可信的,于是我们将公共密钥一道提供给他,
他公加密,我私解密,这样保证数据传递过程中的安全

我私签名,签名内容由客户端自行决定,我签名后传回给客户端,客户端使用公验证签名和他提供的内容是否正确,使得客户端确认我(服务端)不是个冒牌的

总之,如果一个系统中存在 RSA 用于抵御伪造攻击
那么谁持有私钥就必然要证明自己的权威性,此时私签(对什么内容签名由客户端说了算),客户端公验,从而使得客户端确信这个持有私钥的人就是他要找的人

谁持有公钥的人在任何时候传递数据的都公加,公加后的结果连客户端自己都无法解密(实际上客户端不需要解密,因为数据都是自己提供的,他根本不需要解密,只是为了在传递过程中不让其他人解密而已),只有持有私钥的人才能顺利解密
Xheldon
56 天前
典型的当然是产品激活验证码,我把公钥内置到产品里面用来验证购买的私钥加密的授权码是否可用。
amiwrong123
56 天前
@churchmice
为什么没有这种说法啊?签名操作的本质不就是一个加密操作吗
minottomie4383
56 天前
很多,公私钥都是非对称加密用。
私钥签名,公钥验签。公钥加密,私钥解密。是因为通常公钥是公开的,私钥是个人的,而各个语言和工具也是按照这实现和提供调用的
私钥签名,公钥验证,例如三方 API 也可以用,像接支付宝接口,银行支付接口,你会看到他们也有用公私钥方案。平台会提供你他们的公钥用于验签他们的响应包,你也要提供你的公钥给平台用于验签你的请求。为的就是互相证明双方身份。
当你开发开放接口给别人调用,且只能给指定的调用方调用,不让别人随便调用,也可以上签名这一套,安全级别较高的就用公私钥。
LLaMA2
56 天前
@amiwrong123 #30

姑且就当你私加公解了吧,前面我说了,这一套最终的目的是为了抵御伪造。
好了,公钥是公开的,所以叫公钥,也就是路人也能合法地取得公钥,你现在服务器使用私钥加密,你本期待着客户端顺利解密,然后顺顺利利地干活,不成想,半路有个蟊贼把数据原样拓印了一份,他也可以顺利使用公钥解密,客户端也不知道数据半路被劫道了。还自信地说,我这加密没人能破,

是的,蟊贼并没有破,但他也知道了服务器给你的数据的真实内容是什么,这是泄密啦!!!
为什么呢,因为蟊贼并没有伪造任何数据,他只是拓印了一份,本来你严格遵守公加私解,私签公验是不会出现他能解密的情况发生,结果你错误地使用,导致他能解密服务器发给你的数据,这属于使用不当。

总而言之,你需要借助这个 RSA 传递一些不可以让第三方知道的内容。你私加公解用起来完全没问题,可第三方知道了你们之间对话内容的一半(服务器告诉你的内容),因为你没有正确地使用

公加私解
私签公验

牢记牢记
vishun
56 天前
没有对接过支付宝支付、微信支付这些吗?这里面就有。
wnpllrzodiac
56 天前
图解密码技术
https://bkimg.cdn.bcebos.com/pic/80cb39dbb6fd526699ac8e84a718972bd507369e
可以看看这本书。浅显易懂。

非对称加密,主要解决的是密钥传输过程中被窃取的问题。
就是鸡和蛋的问题。怎么保证密钥的安全呢?密钥再加密?可是这个加密密钥的密钥怎么保证安全呢?
天才想出来一个法子,可以在明码传输密钥的情况下,也不会被破解。

核心就是一个大数怎么取模。找到另一个数。正常情况下,这个计算非常吃时间,就可以认为你就算有了公钥,也不可能计算出保密的私钥。
wnpllrzodiac
56 天前
R18
55 天前
@amiwrong123
加密、签名 的本质区别就是你的密文是由公钥生成的还是私钥生成的。公钥是你公开出去的,私钥加密出来的密文人人都可以解密,所以就其实就失去了“加密”的性质,但是它可以用来验证这段文本确实是私钥持有者产生的。

公钥、私钥是人为定义的密钥对的称呼,从数学上看 加密、签名 用的算法都是一样的。但是从工程实现上、生成的密钥对中私钥中还保存了生成密钥对所需的信息,通过私钥中所包含的信息,可以生成公钥。所以私钥是不可以公开出去的。

日常应用中,楼上的网友也讲的很清楚了,因为性能问题。加密传输其实加密的是对称加密算法所需的密钥。签名实际签名的是消息摘要。
kxg3030
55 天前
第一个已经回答了 https 就是典型的场景》...
CodeAllen
55 天前
并不是所有非对称加密算法都支持加解密数据,非对称加密算法的基本要求是签名-验签,确认签名数据的准确性,确定身份,加解密并不是核心要求,加解密数据那是对称加密算法的活儿,而且还有一点,非对称加密算法对同样的数据进行多次签名,得到的签名数据不保证完全一样,可能存在随机值参数,和具体算法实现有关系,只要能验证通过就行。
expy
55 天前
https://archlinux.org/iso/2024.09.01/archlinux-2024.09.01-x86_64.iso.sig

系统镜像是常见场景,不过一般省事只验 sha 校验和。
james122333
55 天前
其中一个答案是包管理器 用来验証下载下来的包是否正确 目前最常用场景

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

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

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

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

© 2021 V2EX