它用图片通俗易懂地解释了,"数字签名"(digitalsignature)和"数字证书"(digitalcertificate)到底是什么。
====================================================
数字签名是什么?
作者:DavidYoud
翻译:阮一峰
1.
鲍勃有两把钥匙,一把是公钥,另一把是私钥。
2.
鲍勃把公钥送给他的朋友们----帕蒂、道格、苏珊----每人一把。
3.
苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密,就可以达到保密的效果。
4.
鲍勃收信后,用私钥解密,就看到了信件内容。这里要强调的是,只要鲍勃的私钥不泄露,这封信就是安全的,即使落在别人手里,也无法解密。
5.
鲍勃给苏珊回信,决定采用"数字签名"。他写完后先用Hash函数,生成信件的摘要(digest)。
6.
然后,鲍勃使用私钥,对这个摘要加密,生成"数字签名"(signature)。
7.
鲍勃将这个签名,附在信件下面,一起发给苏珊。
8.
苏珊收信后,取下数字签名,用鲍勃的公钥解密,得到信件的摘要。由此证明,这封信确实是鲍勃发出的。
9.
苏珊再对信件本身使用Hash函数,将得到的结果,与上一步得到的摘要进行对比。如果两者一致,就证明这封信未被修改过。
10.
复杂的情况出现了。道格想欺骗苏珊,他偷偷使用了苏珊的电脑,用自己的公钥换走了鲍勃的公钥。此时,苏珊实际拥有的是道格的公钥,但是还以为这是鲍勃的公钥。因此,道格就可以冒充鲍勃,用自己的私钥做成"数字签名",写信给苏珊,让苏珊用假的鲍勃公钥进行解密。
11.
12.
鲍勃拿到数字证书以后,就可以放心了。以后再给苏珊写信,只要在签名的同时,再附上数字证书就行了。
13.
苏珊收信后,用CA的公钥解开数字证书,就可以拿到鲍勃真实的公钥了,然后就能证明"数字签名"是否真的是鲍勃签的。
14.
15.
首先,客户端向服务器发出加密请求。
16.
服务器用自己的私钥加密网页以后,连同本身的数字证书,一起发送给客户端。
17.
客户端(浏览器)的"证书管理器",有"受信任的根证书颁发机构"列表。客户端会根据这张列表,查看解开数字证书的公钥是否在列表之内。
18.
如果数字证书记载的网址,与你正在浏览的网址不一致,就说明这张证书可能被冒用,浏览器会发出警告。
19.
如果这张数字证书不是由受信任的机构颁发的,浏览器会发出另一种警告。
20.
如果数字证书是可靠的,客户端就可以使用证书中的服务器公钥,对信息进行加密,然后与服务器交换加密信息。
(完)
towry说:
太棒了,真的,非常有帮助,谢谢!!!
落水狗说:
加上图片以后确实清晰了很多,这个真的很好。
33ad3说:
说实话,还是有点迷糊
fenghanzhao说:
还是有点模糊!没太明白!
Xtrats说:
道格想欺骗苏珊,他偷偷使用了苏珊的电脑,用自己的公钥换走了鲍勃的公钥。因此,他就可以冒充鲍勃,写信给苏珊。-----------有鲍勃的公钥就可以冒充鲍勃?道格自己不也有鲍勃的公钥么?“每人一把”。
阮一峰说:
引用Xtrats的发言:有鲍勃的公钥就可以冒充鲍勃?道格自己不也有鲍勃的公钥么?“每人一把”。
只有有了鲍勃的私钥,才能冒充鲍勃。
道格没有鲍勃的私钥,只好伪造鲍勃的公钥。
Michael.Z说:
还是有些模糊,需要慢慢理解。
有一个问题,公钥和私钥的算法是一样的吗?为什么私钥加密可以用公钥解密?
febird说:
有个疑问,鲍勃的证书中鲍勃的公钥有没有被加密?
史诗在线说:
CNNIC也有根证书了,不过我把它屏蔽了。
bluegene说:
道格用自己的私钥加密发给苏珊的信件,苏珊收到信件后用道格的公钥自然能正常解密该信件,但是苏珊以为她收到的是鲍勃的信件,并且认为是用鲍勃的公钥来解密的,自然认为发信的就是鲍勃,所以道格就达到了伪造鲍勃与苏珊通讯的目的。
ncsglz说:
其实我觉得把三个人名换成中文名,会更容易理解一点,不然容易记不住,哈哈大学的时候学过这玩意,当时也是一知半解,现在全明白了,太有用了
lszhao说:
xiongbo027说:
既然道格可以替换鲍勃的公钥,为什么不能故技重施,伪造CA的公钥,然后用自己的私钥伪造成CA的数字证书,从而达到欺骗苏珊的目的呢?
newuser说:
1(前提是有权威的CA认证苏珊,保证确实是苏珊为鲍勃创造了数字证书)得先用苏珊自己的公钥检查鲍勃的数字证书,目的是为了证明苏珊创造了鲍勃的数字证书。
3帕特用通过解密数字证书得到的公匙(这个公匙苏珊为鲍勃创造数字证书所用的鲍勃的公匙)来检查鲍勃的签名,如果这个公匙确实能成功解密签名,证明确实这个签名是由鲍勃的私匙所创造,当然也证明了道格没有修改文档,因为MD没有变化。
道格确实有鲍勃的公匙,不过他用的是鲍勃的电脑和邮件,而且发给苏珊的是自己用鲍勃的姓名生成的keypair。
CK说:
==============================
其实我也有同上的问题,既然CA的公钥是公开的,那么有什么办法能保证别人无法替换掉CA的公钥呢
Ciger说:
公钥不需加密。
CA公钥无法伪造,因为CA公钥是可查的,比如在MSDN里可以查到微软用于签名driver的公钥(Base64码)。
引用CK的发言:既然CA的公钥是公开的,那么有什么办法能保证别人无法替换掉CA的公钥呢
CA都是一些可靠的大机构,它们的公钥在自己网站上提供下载,所以无法伪造。
引用febird的发言:有个疑问,鲍勃的证书中鲍勃的公钥有没有被加密?
1.如果加密了,则苏珊必须能从某个地方获取CA的公钥方能和鲍勃通信,这CA公钥要么随证书附送,要么预先存放在苏珊的电脑中。
2.如果鲍勃的公钥被加密,同时CA的公钥也在证书中附送,那加密鲍勃公钥有什么意义?
我看到有的资料说,公钥被加密打包后,做成证书。
1.CA的公钥网上可以取得,浏览器中也有预存。
2.证书必须用CA的私钥加密,如果能用CA的公钥打开,就证明确实是CA颁发的。
3.我对HTTPS的一些实现细节不熟悉,但是我的理解是,如果HTTPS公钥不在浏览器列表内,浏览器可以从网上取得。
玉沭林沣说:
引用阮一峰的发言:CA都是一些可靠的大机构,它们的公钥在自己网站上提供下载,所以无法伪造。
那么在下载到本地后,如何避免被替换的问题呢?感觉跟道格用自己的公钥替换鲍勃的公钥一样啊,假若苏珊每次也是重新下载鲍勃的公钥岂不是同样可以避免公钥被替换的问题,那么还要数字证书干什么?
Yonny说:
引用玉沭林沣的发言:
苏珊必须自己保证自己计算机的物理安全。如果别人已经可以直接控制你的计算机,修改根证书列表,那什么证书安全也救不了你。
楼主把数据完整性和数据加密放在一起讲,会让人糊涂。
实际上,数字签名是保证数据完整性的,但它不保证数据加密,不保证数据传输途中无人嗅探窃听。
好比一辆敞篷大货车从A开到B,中途没有洒落任何东西,完整性得到了保证。但是车上有什么东西也被路人看光光。
数据加密是从A到B建了一条虚拟隧道,货车在里面开,路人谁也不知道是什么东西。
车子到了B后,送货的人给出自己的身份证,证明自己的确是从A来的。收货的人可以选择相信这个身份证。也可以把身份证放到自己的身份证校验仪查询,看看是不是公安部发的真的身份证。
如果你的身份证校验仪(CA)已经是假的了,那就啥都别说了,重装系统吧。
“如果数字证书是可靠的,客户端就可以使用证书中的服务器公钥,对信息进行加密,然后与服务器交换加密信息。”
这里似乎有点问题。通常公开钥算法用于相互验证,之后会建立sessionkey(比如128位AESkey)。后续交互的信息都是用sessionkey和对称加密算法(比如AES)来加解密的,已经与证书本身和公钥密钥无关。因为公开密钥算法比对称密钥算法开销大很多。不过HTTPS不了解,不敢定论。
goool说:
8.苏珊收信后,取下数字签名,用鲍勃的公钥解密,得到信件的摘要。由此证明,这封信确实是鲍勃发出的。9.苏珊再对信件本身使用Hash函数,将得到的结果,与上一步得到的摘要进行对比。如果两者一致,就证明这封信未被修改过。--------------8的说法有问题,只此一步,是无法确定信由鲍勃发出的。必须89两步都完成了,才能确定:信由鲍勃发出,信未修改。
20.如果数字证书是可靠的,客户端就可以使用证书中的服务器公钥,对信息进行加密,然后与服务器交换加密信息。-------------Ciger的说法是正确的。
mazhechao说:
引用Ciger的发言:通常公开钥算法用于相互验证,之后会建立sessionkey(比如128位AESkey)。后续交互的信息都是用sessionkey和对称加密算法(比如AES)来加解密的,已经与证书本身和公钥密钥无关。因为公开密钥算法比对称密钥算法开销大很多。不过HTTPS不了解,不敢定论。
你说的对,就是这样的。
引用goool的发言:8的说法有问题,只此一步,是无法确定信由鲍勃发出的。
必须89两步都完成了,才能确定:信由鲍勃发出,信未修改。
20.如果数字证书是可靠的,客户端就可以使用证书中的服务器公钥,对信息进行加密,然后与服务器交换加密信息。
8的说法没有问题,就这一步就可以保证信由Bob发出的。因为消息是由Bob的私钥签名的,只有Bob本人才有他的私钥,所以能用Bob的公钥解密的,一定是Bob发出的。8实现了抗否认性,9实现的是完整性。这是两个不同的概念。
引用Michael.Z的发言:公钥和私钥的算法是一样的吗?为什么私钥加密可以用公钥解密?
私钥和公钥在算法上是等价的,只不过一个是private,一个是public。这个应该是由密钥生成算法保证的。
确实是被加密的(被CA的私钥加密),但这里的意义不在加密(数据的保密性),而是保证证书是由CA签发的。
2.Bob的公钥被用于后续的会话密钥(sessionkey)交换时的加密传输。
jlake说:
用RSA加密解密的数学原理说明这一过程,可能更容易理解。
引用Yonny的发言:苏珊必须自己保证自己计算机的物理安全。如果别人已经可以直接控制你的计算机,修改根证书列表,那什么证书安全也救不了你。
维基百科上的说明,比较容易理解。
假设两个用户A,B进行通信,公钥为c,私钥为d,明文为x.
A用公钥对明文进行加密形成密文c(x),然后传输密文;B收到密文,用私钥对密文进行解密d(c(x)),得到要通信的明文x。
补充:如果是A同时和B,C通信,如果C的私钥为eC收到密文,用私钥对密文进行解密e(c(x)),得到要通信的明文x。
c是公钥,d、e是私钥。用不同的私钥解密,能得到同样的结果。这个过程通过很巧妙的数学来实现。
@mazhechao原文的56789是一个完整的签名场景,请在这个场景下重新考虑一遍。然后重新看一下8的表述:8.苏珊收信后,取下数字签名,用鲍勃的公钥解密,得到信件的摘要。由此证明,这封信确实是鲍勃发出的。实际上Bob的“数字签名”可以用任何人的公钥解密,得到一个hash值。如果不加上第9步(比对原文的hash值)。这个第8步得不到任何有价值的信息。
dindog说:
ssdt说:
有ca也没用,cnnic现在在ca里了
cnnic可以伪造别人的ca然后利用窃取的公钥对信解密
公钥也可以被窃取,窃取了不就可以解开信了
只要操作系统有后门,什么签名也没用
操作系统的后门可以作为进入一个国家市场的筹码
你以为微软是可以相信的吗
eggcalm说:
13.苏珊收信后,用CA的公钥解开数字证书,就可以拿到鲍勃真实的公钥了,然后就能证明"数字签名"是否真的是鲍勃签的。----------------------------在这里,CA的公钥会不会被道格用假的CA公钥替换掉?如果可以,那么道格就可以像[10]中那样向苏珊发送假的数字证书,达到冒充鲍勃的目的。
引用goool的发言:实际上Bob的“数字签名”可以用任何人的公钥解密,得到一个hash值。如果不加上第9步(比对原文的hash值)。这个第8步得不到任何有价值的信息。
我不这么认为,我认为第8步的价值就在于,苏珊能确定这封信是鲍勃发出的(虽然不确定信的内容是否被窜改过),因为如果不是使用鲍勃的私钥加密,苏珊使用鲍勃的公钥不可能解密成功。
wqfeng说:
真不错。后面那个HTTPS的例子是译者加的吧?原文中没有。
引用mazhechao的发言:Bob的签名怎么会可以用任何人的公钥解密?Bob是用他的私钥签的啊,当然只有用Bob的公钥才能解密。在原文第8步的场景里,所谓的“解密”只是一次数学运算(典型算法RSA)。输入是signature和某个人的公钥,输出是一个hash值。重申一次,得到的这个hash没有任何价值。因为可以用任何人的公钥参与这次运算。
以上可以简单归结为:没有原文的数字签名是没有价值的。
@goool:
价值就在于我能解开这个签名,能够解开这个签名本身就是有意义的——消息是Bob发出的,Bob不能否认消息是他发的,不是Bob的人也不能说是他自己发的,即实现了数据的抗否认性。至于hash值不hash值的,其意义体现在第9步,实现的是数据的完整性。这是两个完全不同的概念。原文分两步阐述,没有任何问题。
@mazhechao
我不知道你所说的“解开签名”是什么意义,它只是一步数学计算而已。
让我们更细致地看一下“验签”的过程:1:输入签名和公钥,算出hash值h1;2:输入原文,算出hash值h2;3:比较h1和h2,发现h1和h2相等。在这一步上,我们开始推理,得出原文是bob发出且没有修改过。也就是你说的抗抵赖和数据完整。
请注意,这两个有价值的结论都是第三步得出的。
原文第8步和你都认为:经过第8步的计算,即可以得出原文由bob发出的结论。这是错误的,实际上12两步只是可以交换顺序的两个计算步骤,它们不是任何有价值结论的充分条件,连必要条件也不是。
lewis说:
雨下路人说:
xy说:
引用ncsglz的发言:其实我觉得把三个人名换成中文名,会更容易理解一点,不然容易记不住,哈哈大学的时候学过这玩意,当时也是一知半解,现在全明白了,太有用了
sfumato说:
涎弟说:
鲍勃会给苏珊的信?不加密?明文?第七步只是把signature附上了原文呢?不做任何操作????
Ivan说:
abc说:
看了你的1,2步和前几个回复(实际上Bob的“数字签名”可以用任何人的公钥解密,得到一个hash值。如果不加上第9步(比对原文的hash值)。这个第8步得不到任何有价值的信息。特别是这个),好象你不懂公钥和私钥的原理吧,公钥和私钥是一对的,某个私钥加密的内容只有这个私钥所对应的公钥才能解开,其他的公钥是解不开的,反之亦然不然怎么叫密码学呢
路灯时代说:
去年有幸上过台湾的信息安全老师讲的数字签名这块的课,是学校搞的什么和台湾学校联合课程。用的是志明和春娇的做为例子。内容讲的更为详尽,课件应该还在。不过是专门面向密码学研究的内容。
看来不止一个人误会了“解得开”“解不开”的问题。
设想一个签名场景,我们叫“理想中的签名”:Bob直接用自己的私钥对原文加密,把结果发送给Alice,Alice用Bob的公钥去解密,得出原文。在这种情况下,的确存在一个“解开”或“解不开”的问题。如果Alice用别的什么人的公钥去解密,这次计算仍然能得出一串符号,但是结果没什么意义,这就是你说的“解不开”。
但实际中为了效率起见,被广泛应用的签名是这样的:Bob对原文做一次hash,然后用私钥对hash值加密,加密得到的结果我们称之为“签名”,然后把原文与“签名”发给Alice。
Alice首先作的计算(也就是原文的第8步)是用Bob的公钥对“签名”作一次解密,从而得出一个有待于与第9步得出的结果相比较的一串符号。
这串符号有什么意义么?没有。与原文有什么关系么?看不出来。通过这次计算,Alice能不能断定“签名”是Bob发出的呢?不能。因为**如果用别的什么人的公钥参与这次计算,同样能得到一个符号串,也同样看不出什么意义**。
所以,这一步计算没有所谓的“解得开”“解不开”的问题。
这就是为什么原文第8步是错误的,原文说:
Alice的确得到了一个被暂时当作是原文hash值的符号串,但这个符号串还有待接下来的比对。这句话里的因果关系是不成立的。
啊啊呵说:
汗,第八步如果用别人的密钥解密的话会报错,一报错就知道你用的密钥不对了。。。。你真的先看看密码学原理吧。。。。别人已经说的很详细了,8,9有着分别不同的意义
签名消息
RSA也可以用来为一个消息署名。假如甲想给乙传递一个署名的消息的话,那么她可以为她的消息计算一个散列值(Messagedigest),然后用她的密钥(privatekey)加密这个散列值并将这个“署名”加在消息的后面。这个消息只有用她的公钥才能被解密。乙获得这个消息后可以用甲的公钥解密这个散列值,然后将这个数据与他自己为这个消息计算的散列值相比较。假如两者相符的话,那么他就可以知道发信人持有甲的密钥,以及这个消息在传播路径上没有被篡改过。
以RSA算法为例。
拿其它人的公钥去解Bob的签名会发生什么,与RSA的原理无关,与具体的算法实现有关。从RSA的原理来说,所谓“公钥”“私钥”在数学上没有区别,所谓的“加密”、“解密”、“签名”、“验签”本质上是一回事,只是一个乘方和一个取模运算。
报错,报什么错,为什么报错?因为标准实现下,Bob要对他的信息进行编码和填充。用别的人的公钥解密,会因为填充的字节不对而无法继续计算,或无法从计算结果提取出字符,或与hash串规则不符,大多数实现会在此处返回错误或抛出异常。
但是,RSA从原理上并没有保证这一点,因为它只是三个数字参与的计算而已:把一个数与另一个数作乘方运算,然后除以第三个数,得到余数。
我们完全可以采用另一套字符编码规则、字节补齐规则、以及另外的hash算法,让其他人的公钥参与这次计算,也能得到一个符合规则的hash值。
所以从逻辑上,Alice不能作出这样的推理:用Bob的公钥对签名作了一次计算,就断定签名是Bob发过来的。
风逐蓝天说:
不错的科普文,只是感觉还不够通俗易懂。。。。
引用goool的发言:……
你试一下就知道了啊,用别人的密钥试试看啊,看看会不会报错,你说说的那些什么取模比较数值都在解密也就是第八步里面包含了。。。
Jak说:
不错不错,很形象~菜鸟们稍微了解下就好了。对于CA证书的伪造问题……无可避免,谁知道会不会有木马把证书改掉呢。
我怎么觉得我开始有点理解goool的意思了。。。
阿迪说:
引用mazhechao的发言:我怎么觉得我开始有点理解goool的意思了。。。什么意思啊?
引用阿迪的发言:什么意思啊?
他的意思就是把8,9步误解成解密的过程,其实第八步解密已经包含取模比较等步骤了
peeekkk说:
应该是说,用Alice用随便什么公钥解密,也会有一点点几率解密成功。所以不能认为解密成功,就100%确定签名的正确,有可能中彩票
引用peeekkk的发言:应该是说,用Alice用随便什么公钥解密,也会有一点点几率解密成功。所以不能认为解密成功,就100%确定签名的正确,有可能中彩票
那到是,只要那个质数被猜到就行了,虽然希望很渺茫。。。
fan0219说:
第八那里,我提一点异议。。苏珊收到信后,用公钥检验数字签名,用鲍勃的公钥解密摘要。不是由此可以验证这封信是由鲍勃发出的。。而是可以由此验证这封信的数字签名是有效的。。这封信,可能是由鲍勃发给A。然后A冒充鲍勃发给B。
第十一文字部分大概也有错误。。鲍勃提交自己的公钥和个人信息给CA(数字证书认证中心),并不需要提供苏珊的私钥。
Maple说:
MrWind说:
finian说:
引用Xtrats的发言:有鲍勃的公钥就可以冒充鲍勃?
道格自己不也有鲍勃的公钥么?“每人一把”。
注意这里所说的“用自己的公钥”,不是鲍勃给道格的那支,而是道格自己伪造的另一支
Qujer说:
我竟然看懂了!!!
引用MrWind的发言:如果鲍勃是亲手通过U盘把他的公钥交给苏珊的,那上面的讨论就不需要了;……
太道说:
卢达说:
这叫“非对称加密”
riefuy说:
ly说:
bob给他们每人一把的公钥是不是是一样的?如果是,那么信件被道格截取到,是不是就同样被解密了!
精英一客说:
呵呵,这个我之前也不是很懂。但是,如果你从证书的用途上去理解,比如私钥的目的是什么,公钥的目的是什么,这样的话会理解的很快
阿萨德说:
银行的u盾属于私钥还是公钥,要是公钥每个u盾的内容是不是一样的呢
HahA说:
引用Xtrats的发言:道格想欺骗苏珊,他偷偷使用了苏珊的电脑,用自己的公钥换走了鲍勃的公钥。因此,他就可以冒充鲍勃,写信给苏珊。-----------有鲍勃的公钥就可以冒充鲍勃?道格自己不也有鲍勃的公钥么?“每人一把”。
其实是道格用自己的公钥(不是鲍勃给他的,是他自己的公钥)替换了苏珊的鲍勃公钥(注意是替换,原文翻译成换走可能对你理解产生了误导)。之后道格用自己的密钥加密信件发给苏珊,苏珊用假的鲍勃公钥(实际上是道格公钥)解密信件,发现信息正确,便以为是鲍勃发来的信件,于是道格实现了伪装成鲍勃欺骗苏珊的目的
lich说:
想这个过程的时候,如果略掉生成摘要的Hash函数貌似会更清晰些。
1alice使用私钥对一份合同生成签名,同时把合同和签名发给bob。2bob收到后,使用公钥对签名解密生成一段文本。对应步骤8。3bob对比收到的合同和解码生成的文本。如果相同,则确定是来自alice。对应步骤9。
这里不能完全通过是否能解码成功来判断数据是否来自alice。假设我使用自己的密钥对一段数据生成签名,发送给bob。bob使用alice的公钥解码,结果碰巧能解开,解开的数据有可能是乱码,无法阅读,但如果再碰巧看起来像一份合同。所以必须同时和收到的数据进行比较。
jieson79说:
如果道格在网络上截取了BOB给苏珊的信,是不是就可以得到其中的内容?
晴天娃娃说:
如果第三方冒充发送方发出了一个文件,因为接收方在对数字签名进行验证时使用的事发送方的公开密钥,只要第三方不知道发送方的私有密钥,解密出来的数字签名和经过计算的数字签名必然是不相同的,这酒提供了一个确认发送方身份的方法。
hui说:
作者对公钥,私钥谁加密谁解密的解释似乎是有点问题的:“Public-keycryptographyreferstoacryptographicsystemrequiringtwoseparatekeys,onetolockorencrypttheplaintext,andonetounlockordecryptthecyphertext.Neitherkeywilldobothfunctions.”
shanshan说:
有个地方不明白,既然苏珊可以用鲍勃的公钥进行解密,看到鲍勃的信件内容,那道格他也有鲍勃的公钥呀,那他也可以看到鲍勃写给苏珊的信件内容罗。
张永说:
图形并茂,讲的真是太好了,o(∩_∩)o哈哈
辛盈说:
加密:公钥加密、私钥解密
认证:私钥加密、公钥解密
首先要搞清楚一个操作的目的是什么,目的是加密数据还是认证作者。
Vaporz说:
我的理解,道格给苏珊的是自己私钥生成的公钥,但因为苏珊不知道这是道格的公钥,就以为是在跟鲍勃通信。而且因为是道格私钥生成的公钥,所以道格可以正常的加密解密消息
lzm说:
乜都5识说:
爱国者说:
引用goool的发言:Alice不能作出这样的推理:用Bob的公钥对签名作了一次计算,就断定签名是Bob发过来的。
但Alice已经知道采用哪种公钥密钥算法了,因此如果使用Bob的公钥无法解密,那么可以推定消息不是Bob所发
Jeremy说:
引用lich的发言:假设我使用自己的密钥对一段数据生成签名,发送给bob。bob使用alice的公钥解码,结果碰巧能解开,解开的数据有可能是乱码,无法阅读,但如果再碰巧看起来像一份合同。所以必须同时和收到的数据进行比较。
当"我"给Bob发信的时候,我的信是公开的,未被加密的,因为加密也没有意思啊,原因就是很多人有我的公钥.但关键是,怎么才能让Bob看见我的信是原版,未经删减的.所以需要对原文Hash一下得到Y.当Bob收到信后,用"我"的公钥解开签名,得到Y.然后Bob需要对原文Hash一下,得到M,这个时候,对比Y与M.才能确保数据是安全的.
这里的安全包括:是由"我"发出去的,并且中途未被修改.
引用shanshan的发言:有个地方不明白,既然苏珊可以用鲍勃的公钥进行解密,看到鲍勃的信件内容,那道格他也有鲍勃的公钥呀,那他也可以看到鲍勃写给苏珊的信件内容罗。
这样的啊.本来就这个样子的.全是道格看不见苏珊给鲍勃的信.对应到计算机上就是:Server发给Client的数据是可以被截获的.
引用爱国者的发言:
在第8步上,goool说法是正确的.譬如说,我们可以想像一下这个情况:Bob写了封信(包括原文和签名)给Lily,然后Lily对原文做了些修改,再把这封信转发给了Alice.Alice当然是可以对这个签名解密的.因为他有Bob的公钥啊.但是我们不能说,这封信是由Bob发给Alice的,因为这封信的直接受体应该是Lily.
亭子说:
非常赞,学到了好多东西,您的博客我非常喜欢看,请问是否可以做一个Android版的应用呢?这样,我们随时随地都可以看了。如果有需要,我可以做这个android应用。
暗影吉他手说:
再强调一遍,根本不存在“解密失败”这种说法。
spraith说:
我觉得之所以第8步有些问题,是因为Bob在制作数字签名那一步没加上一些更详细的说明,比如,第6、7步制作签名时,同时把Bob的个人信息和信件摘要并到一起再用私钥加密的话,在第8步苏珊用公钥解密后,就确实能知道此信件是由Bob发出的了,然后第9步通过hash函数也可以验证信件是否被修改过。而且根据第8和第9步所做的事情来看,我觉得作者的原意非常可能就是这样的,他只不过在第67步时漏掉了把Bob的个人信息也一起加入数字签名中。
小乖说:
银行专业版usbkey里面存储的是什么信息,是客户端私钥,和客户端证书,还是服务器端证书.怎么和银行的服务端通讯的,我怎么都没想清楚
引用雨下路人的发言:某些语句没有把逻辑关系表达得足够清晰(“道格想欺骗苏珊,他偷偷使用了苏珊的电脑,用自己的公钥换走了鲍勃的公钥。”起初理解为道格把鲍勃手上的公钥换走了,乱乱的,仔细琢磨语句,才明白意思是:道格用自己的公钥换走了鲍勃送给苏珊的公钥……)
道格的公钥和苏珊的公钥不都是鲍勃送的吗,不是一样的吗
arlen说:
之所以会觉得第8步有问题,是因为翻译的时候有一句重要的话没有翻译出来,原文是这样的:Pat'ssoftwaredecryptsthesignature(usingBob'spublickey)changingitbackintoamessagedigest.Ifthisworked,thenitprovesthatBobsignedthedocument,becauseonlyBobhashisprivatekey.
teddywu说:
引用小乖的发言:
“道格用自己的公钥换走了鲍勃送给苏珊的公钥”是指道格用道格的公钥(不是鲍勃给道格的公钥)替换掉了鲍勃送给苏珊的公钥。
刀尖红叶说:
shfqbluestone说:
JohnK说:
第8步确实有问题,仅由签名解密得到的结果是没法判断签名者身份的。
举个例子:(假设不考虑对明文的加密)
Alice发送一串附带签名的明文给Bob,格式如下:
TEXTSIG1明文签名
现在Eve截获了这段信息,并伪造为:
TEXTSIG2明文签名
Bob收到信息,抛弃明文不看,对SIG2使用Alice的公钥解密,得到了DIG2。
但他并不知道正确的HASH(TEXT)是什么,也就不知道得到的DIG2到底对不对,那么怎么判断发送者的身份呢。
不可抵赖性的实现是依赖TEXT和SIG共同实现的。
假设Eve想篡改Alice的信息为:
TEXT2SIG2明文签名
SIG2应=RSA(Alice的私钥,HASH(TEXT2))
这样才能骗过Bob以为这封信息来自Alice。
但Alice的私钥Eve并没有,因此他伪造不出签名。因此当Bob验证过签名(相对明文)正确后,就认为这封信是Alice发送的。而不与明文相对是不成立的。
至于使用Alice的公钥去解密Eve伪造的签名会不会报错,则一定意义上依赖于加密算法。起码RSA这种幂乘和取模运算是不会有任何报错的。
大神说:
引用阮一峰的发言:
GeorgeChen说:
第5点,Bod决定采用数字签名。
为什么Bod要用数字签名,应该说明下,这里Bod是为了证明自己是Bod,即这是认证过程而非加密过程
Chil说:
引用bluegene的发言:道格用自己的私钥加密发给苏珊的信件,苏珊收到信件后用道格的公钥自然能正常解密该信件,但是苏珊以为她收到的是鲍勃的信件,并且认为是用鲍勃的公钥来解密的,自然认为发信的就是鲍勃,所以道格就达到了伪造鲍勃与苏珊通讯的目的。
我也正好有这个疑问,如果苏珊收到信件后能用道格的公钥解密,这岂不是每个拥有道格公钥的人都能对信件解密都能看到信件的内容这样的话通信就不安全了.
引用mazhechao的发言:私钥和公钥在算法上是等价的,只不过一个是private,一个是public。这个应该是由密钥生成算法保证的。
如果是这样的话那通信就不安全了.就比如Bob将信息用自己的私钥加密发给suzan,但是很多人都有Bob的公钥,那岂不是有Bob公钥的人都可以解密看到信息?
SelfMedicated说:
引用goool的发言:@mazhechao
转牛角了。同意m
引用SelfMedicated的发言:
御宅暴君说:
引用goool的发言:
大哥,假设私钥为(d,n),公钥为(e,n),那么通过前者加密后,若要解密,所用到的e就必须满足ed≡1(modφ(n))公式了。当然就几乎只有原来那个公钥(e,n)的e满足其条件,所以不是任何公钥都可以解的。毕竟如同其它前辈指出的,你拿别的公钥去计算,就因为会满足不了该条件而出错。你可以再好好地通过阮一峰的《RSA算法原理》补习下。
如果要找出同样满足该公式其它的e也不是不可以,但其算法复杂度就和用公钥加密私钥解密的情况一样了。归根结底,公私钥的确可互换,且无法通过其中一个钥匙能在可接受的成本下计算出另一个钥匙,也难怪RSA深得『非对称』的真谛了。
且不说这个,有人质疑既然也可以用私钥加密用公钥解密,那么因为公钥是公开的,岂不是人人都可以解开被私钥加密的数据了?
但是私钥就只有对方一人知道了,就拿正文中例子来说。只要对方确确实实是鲍勃,从而私钥的确也是鲍勃所使用的。于是只要『苏珊所手上的公钥能对对方发过来的数据进行有效解密』,那么就证明了这公钥的确是与对方,即鲍勃使用的私钥构成一对公私钥。这就所谓的『认证』了。
但是,万一对方偏偏不是鲍勃而是道格,且已经偷偷把苏珊手上的公钥换成道格的公钥了呢?这个公钥当然就与道格所有用的私钥构成有效的一对公私钥,于是道格的确就可以在苏珊完全不知情的情况下,假装成鲍勃并与她通讯。其实这问题就要通过CA来解决了,正文的后续当然也是围绕此而展开的。
这地方阮一峰先生的确讲的不够好,没明确好『加密』和『认证』的区别,仍未尚未彻底掌握RSA算法的同学的确很容易被弄糊涂甚至陷入误区。
liuruoze说:
zhanlang说:
如果道格也去认证了自己的证书,并且用自己的公钥换了bob的公钥,每次通信的时候发自己的证书过去,结果就是一切验证都没有问题,但是苏珊却以为自己在跟bob通信,实际确实跟道格通信,我的意思是如何辨别证书所有者跟你要通信的目标是同一个人呢?
Colin356说:
英文与中文在表达的逻辑上还是不同的,喜欢谨慎的接受概念和原理的人还是改天再看看原文吧~
xinxinyu说:
引用zhanlang的发言:
门外汉猜测。CA认证是收费的,可能会保证不会被恶意替换。网站和证书是一一对应的。a.com-public1b.com-public2可能像hosts那样的列表。
heramerom说:
你说的‘并且用自己的公钥换了bob的公钥'是指道格偷偷用了苏的电脑,把里面的公钥换成自己么。可是文中说CA认证后,是把公钥放在传送的信息中的,而不是保存在苏的电脑上得。
richard说:
怎么又变成了Bob的私钥了哈?Susan不是用Bob的公钥来解密的么?
另外还有点疑问就是为啥被替换为假的Bob公钥后,不能鉴别出来哈?不是可以将假Bob公钥解密的digest与原文hash之后比较,来判断内容是否一致么?如果是假的,digest会匹配不上哈,不是就不需要数字证书了哈?
还请您指教:)
引用mazhechao的发言:
是不是说,如果解密的公钥不对了,是不能执行解密过程的,如果能执行解密就一定是bob的公钥了?
liuinsect说:
证书中心怎么保证这个是鲍勃的公钥而不是其他人的?
呆瓜路说:
谢谢院一峰先生的讲解,一目了然,通俗易懂。。
etnlona说:
helpalot,thanks~!!!
zyj说:
对收到的信件进行hash,得到的怎么可能跟对签名进行的hash的结果相等呢?????
Leon说:
引用zyj的发言:对收到的信件进行hash,得到的怎么可能跟对签名进行的hash的结果相等呢?????
刘哈哈说:
引用CK的发言:xiongbo027说:既然道格可以替换鲍勃的公钥,为什么不能故技重施,伪造CA的公钥,然后用自己的私钥伪造成CA的数字证书,从而达到欺骗苏珊的目的呢?==============================其实我也有同上的问题,既然CA的公钥是公开的,那么有什么办法能保证别人无法替换掉CA的公钥呢=================================说下我个人理解:CA的公钥是放在网站上的,当需要使用的时候在网站上进行下载,这样就能保证每次使用的CA公钥是不可能被替换的正确的公钥
阿凡提说:
文中第三步,苏珊给鲍勃写信,鲍勃怎么确定这封信就是来自苏珊的??
yuntauy说:
加密和完整性确实稍作区分更好。Bob持有私钥,Susan有公钥。Susan---->Bob,数据是加密的,因而也是没被修改的。Bob--->Susan,数据是公开的,但是能保证是没被修改的。这时Susan实际上可以是公众中任何一个人。因为Signature是不能被修改的(修改了解不出来),进一步保证了Digest没被修改,再进一步保证信件没被修改。实际上在原理上Bob可以直接对给Susan的回信加密,这也能保证信件没被修改。但当信件的体量太大时,直接加密就不可取了。
纳信说:
门外汉说:
大家可以搜索下。。。不对请指教
pony说:
总体写得不错,不过看完后还是有几个疑问:1.也是争论得最多的,第8步中如果数字签名被道格修改,那苏珊用鲍勃的公钥解密时会不会报错?报什么错?希望有人能提供可靠的证据。2.如果问题1的答案是会报错,那么是否可以完全不使用数字签名,鲍勃直接用私钥对信件内容加密,苏珊用公钥解密,这样是否也能保证信件的完整性?因为如果内容被篡改,则解密时会报错。按照yuntauy的意思,似乎这样是可行的。3.第13步中,苏珊怎么知道用哪个CA的公钥去解密数字证书?
woodie说:
有个疑问确实下Bob发给三个人的公钥都是一样的吗?
MemoMou说:
如果还是觉得迷糊的同学,我觉得可以看看《离散数学及其应用》(KennethH.Rosen著)的4.6章,有实例分析,看完就懂了
Daily1993说:
引用啊啊呵的发言:@goool:
这个还会报错的啊?如果是敌军截取一段密文,用“与加密用的私钥不配对”的公钥解出一串字符,解密错了还会报错的啊,不会吧。。
老钱说:
yao说:
第五步:鲍勃给苏珊回信,决定采用"数字签名"。
我想知道为什么要用数字签名?用数字签名的作用是什么?鲍勃直接用私钥加密传给苏珊不行吗?
sgqm说:
还是没搞明白!
houkai说:
同感!
AutumnLight说:
你好,我想问下,原文中有这样一句“EitheroneofBob'stwokeyscanencryptdata,andtheotherkeycandecryptthatdata.“其中任何一个密钥都可以用来加密,而另外的一个则可以用来解密;可不可以这样理解:使用私钥加密的信息可以使用公钥解密,而不能使用私钥解密;使用公钥加密的信息可以使用私钥解密,但是不能使用公钥解密?
还有一个问题:第8条说,苏珊拿到数字签名后,使用鲍勃的公钥进行解密,得到文档摘要,那么是不是鲍勃用私钥加密的数字签名只能使用鲍勃的公钥进行解密,而解密工具会给出是否可以使用此公钥进行解密?如果使用的公钥不能对数字签名进行解密就会出错,而不是使用任意的公钥都能进行解密,只不过是否正确了?
jqk6说:
太清楚了!非常感谢阮老师!
pjm说:
引用yao的发言:第五步:鲍勃给苏珊回信,决定采用"数字签名"。
Jason说:
阮大师:
整个hash步骤似乎是完全没有必要的,签名直接用私钥加密原信息,然后连同certificate和原信息一同发给对方。对方收到后先验证certificate,如果通过再用公钥解码签名,如果和原信息一样就说明没问题。我觉得如果按这个流程操作本质也是一样的,作用也一样。
请大师解答一下,谢谢
guest说:
数字签名,简单来说就是利用公钥机制,对消息的hash值加密,完成数据的不可否认性(公钥通信双方的唯一匹对)、数据完整性(消息的hash是唯一的)
徐朋说:
引用Jason的发言:阮大师:
亲啊,你发送给别人的信息,如果用私钥加密,那么任何拥有你公钥的人都能够看到信的内容。所以,使用私钥来加密信件内容是错误的。所以,这个地方阮大师讲解的时候,漏掉了一点内容。就是,你给别人发私信必须要对这封信(信的内容+你的签名)使用信件接收人的公钥进行加密。
lorne说:
Godlike说:
有没有软件实现
gongfei说:
很厉害,很容易弄懂,谢楼主
随智阔说:
CA的钥匙要是丢了呢被替换
kai说:
Yongming说:
HTTPS是否也有漏洞,过程如下:
A:serverB:clientC:hacker1)B向A发送请求2)A收到请求后,发送包含pub-key的证书给B3)对于2)中的由A发送给B的证书,碰巧的是,C刚好接截获这段证书,并由root证书验证是真实的,那么root证书解析出pub-key。C就拿着这把pub-key等着。4)B收到2)中的证书,也跟C一样验证并解析出pub-key,并生成一对AES-key,用pub-key加密AES-key并发送给A5)又不巧的的是,C截获了4)中的秘闻AES-key。......OK,此时C成功侵入A-B之间的通信,请问上诉过程是否有bug,或者怎么破解?谢谢。
ZheZhang说:
引用Yongming的发言:HTTPS是否也有漏洞,过程如下:
第(5)步似乎不行吧。Hacker并没有拿到server的密钥,仅知道公钥pub-key是无法解密client发出的AES-key的。
Martin说:
是这样的过程么?
看了以后,有点自己的想法,希望讨论一下如你上面所说,C有了pub-key,等着,然后又有step5),截获了4)中的AES-key因为AES-key用pub-key加密,解密的话,可以再用pub-key进行解密?我以为的是pub-key加密,private-key解密。对加密解密不太了解,如果问题小白,见谅
引用lorne的发言:
我也是这样理解的,虽然没有测试。认为传输原文成本,要比传输hash大得多如果只是为了保证传输内容没有被修改过,使用md5之类的方式也可以做到这一点吧?hash是可逆的么?
coooder说:
同意goool的观点。假设对下面两段文本进行签名:text1(hash)=>100(加密)=>100-1text2(hash)=>200(加密)=>200-2公钥为pub-key那么pub-key应该是可以同时解密100-1和200-2的那么如果接收到的数据为:text1+200-2单纯进行第8步,200-2解密得到200,通过200这个数据无法得知信是由谁发的只有通过第9步,对比200和100,才能得到“信是不是由鲍勃发的以及信的内容是否被修改”
浪迹说:
你们说的牛逼,我弱弱的问一句,公钥是对的,有哪些情况解不开私钥发过来的消息呢??
iMusicDog说:
写的很好,虽然我不是100%懂了,但是觉得了解了很多!!!感谢阮老师!
另外,我觉得gools说得是对的!可能实现上会更直接一点给用户提示错误,比如说,如果用一个错误的(不对应的)公钥去解签名的话,直接报错。
最后,我有一个问题,为什么在5的时候,鲍勃要突然使用签名呢?
饭别稀说:
苏珊收信后,用CA的公钥解开数字证书,就可以拿到鲍勃真实的公钥了,然后就能证明"数字签名"是否真的是鲍勃签的。如何确定鲍勃证书中的公钥是真的?上面的解释是有问题的,苏珊做的不只是简单的解密成功就完了,而是用CA的公钥对证书中的签名做了一次完整的验签,可解密表示是CA发来的,hash一致表示正文未篡改,所以证书的正文包含的鲍勃的公钥,鲍勃的基本信息都是可信的。
王松说:
引用徐朋的发言:
其实英文原文中也并没有提到,对信的内容加密。
echo爱你说:
小法说:
如果道格用自己的公钥和伪造的鲍勃的个人信息去证书中心认证,然后伪装成鲍勃给苏珊发信息怎么办?还是说证书中心有义务验证个人信息的正确性,确保加密的个人信息是正确的?希望大家能给解释一下
弱弱的问下,用公钥解密,用正确的可以解开,用错的公钥解不开,到底什么叫解得开,什么叫解不开,解不开有什么提示吗?是会报错,还是得到一串没有意义的字符?新手求指导!!
binzeng说:
fspore说:
我的理解是:1)要达到保密的目的,则message必须由公钥加密,因为私钥只有一个人有,所以保证只有一个人能解得开。所以要达到双方的message都是保密的,则须存在两对公私钥,双方互持有自己的私钥和对方的公钥。但是由于message是用你的公钥加密的,所以虽然message是密文,但不能保证这个密文就是Bob加密后给你的,任何持有你的公钥的人都可以给你发密文。2)因此还需要实现认证这个功能。这回,Bob使用只有他自己才持有的私钥对message的摘要hash进行加密,然后将之附在原message上发给你。这个时候,你尝试用你手上所有的公钥来对hash密文进行解密,如果某个公钥A解开了hash密文,则证明对该hash进行加密的就一定该公钥所对应的私钥-A。而私钥只有一个人持有,所以能惟一确认这个message是被这个人经手过的。也就是说,如果我手上的Bob的公钥确实就是属于Bob的话,那么当这个公钥能解开hash密文时,我就能说这个message确实是由Bob发出的。3)而如何保证"我手上的Bob的公钥确实就是属于Bob"呢?只有引入第三方权威认证。也就是CA了。
上面goool说的第8条,我也有同样的疑问。我对密码学不甚了解。但按文中的说法,能够知道:a)如果公钥与私钥对应,那么私钥加密hash后的密文被该公钥解密后能够还原出那hash。问题是:其他不与私钥对应的公钥在尝试对密文解密后,其结果是完全无法解密呢?还是得出一个无意义的hash值呢
有人能解答一下吗?
godshit说:
我的滑板鞋说:
刘大敏说:
留大名说:
chicoge说:
xiadeng说:
大机构的网站被黑了,就可以了
Jiguang说:
阮大,上面貌似有错误的地方。如果加密方式是非对称加密,那么是不可以用私钥加密,公钥解密的。应该是双方各自产生一个密钥对,然后交换公钥。
rabbitws说:
引用Jiguang的发言:阮大,上面貌似有错误的地方。如果加密方式是非对称加密,那么是不可以用私钥加密,公钥解密的。应该是双方各自产生一个密钥对,然后交换公钥。
芊度说:
确实不错,很好。每当我忘记的时候就再来看看/touxiao
薛子嘉说:
第八步原文本来就含糊不清,作为一个初学者,那么就有一个疑问,假设有一个函数,getOutput(signature,publicKey),那么使用一个非bob的publicKey在调用这个函数时会发生下面哪一种结果?1.traceback(抛异常,只是打个比方别扯远了),证明非bob的publicKey在解密时就能够判断出来。2.返回字符串(只是打个比方别扯远了)。
补充一下1.有些人可能认为,哦,traceback了,或者返回错误码了,就知道这里解密就是失败了。2.有些人可能认为,哦,这里返回了某一个字符串,或者hash,在这里,明显判断不了是否失败。3.有些人在这里没有概念,你说成功了就是成功了。
bmcciscoding说:
@Jeremy:
修改了之后hash值不一样了
bwangel说:
有个问题想请教一下,比如像Tornado中有个设置
cookie_secret
文档中说这个值是对cookie进行签名的?
这个值就是签名的私钥吗,那么公钥是如何生成的啊?
water说:
很清晰,通俗易懂
Chris说:
这里是您的理解有误,道格用自己生成的公钥替换了苏珊电脑上鲍勃原先的公钥,但苏珊潜意识里面还以为是鲍勃的公钥,以后道格用自己的私钥加密信件,冒充是鲍勃,苏珊用电脑上的公钥解密,就真的以为是道格.
QuinnChen说:
首先感谢博主一如既往地为大家带来这么多优质博客。
这个例子不错唯一的不足是,讲到私钥解密还可以私钥加密
按我理解,像RSA这种非对称加密算法中,私钥只能解密从公钥加密来的密文,而不能进行加密
引用QuinnChen的发言:首先感谢博主一如既往地为大家带来这么多优质博客。
抱歉,我个人理解有误,公钥私钥其实是可以相互加解密的。对于数据加密时,公钥加密,私钥解密对于数据认证时,私钥签名,公钥验证(这时就是私钥加密,公钥解密)
yehot说:
根本就没有帕蒂什么事啊,这就尴尬了
鲍勃的信,签名是用私钥加密了。但是新建内容本身不用加密么?
shiyang说:
我有一个疑问就是8里面苏珊对签名解密后得到摘要,就能知道这是鲍勃的签名,那这个摘要里面有什么信息可以让苏珊知道是鲍勃的摘要?是不是摘要也是公开信息?
Harvey说:
代码喵说:
醍醐灌顶,感谢阮老师
成雨霖说:
老师这内容太多了,眼睛都看花了。谢谢老师
大盛说:
好文,通俗易懂,受教了。正如前辈们所说,再修补一下,澄清混淆之处,就完美了!1.加密和认证的区别,公钥和私钥的使用;2.只凭第8步,是否能确定是Bob发出的?为什么?
魏海通说:
引用大盛的发言:好文,通俗易懂,受教了。正如前辈们所说,再修补一下,澄清混淆之处,就完美了!1.加密和认证的区别,公钥和私钥的使用;2.只凭第8步,是否能确定是Bob发出的?为什么?
第二个问题,Bob用私钥加密,只要他的私钥没有泄漏就能证明是Bob发出来的。不对称加密算法,公钥私钥成对出现决定的
引用xiongbo027的发言:既然道格可以替换鲍勃的公钥,为什么不能故技重施,伪造CA的公钥,然后用自己的私钥伪造成CA的数字证书,从而达到欺骗苏珊的目的呢?
引用阿凡提的发言:文中第三步,苏珊给鲍勃写信,鲍勃怎么确定这封信就是来自苏珊的??
那就需要相互认证了。每个人都有CA证书且公布自己的公钥。
very_well2说:
Curiosity说:
引用御宅暴君的发言:若要解密,所用到的e就必须满足ed≡1(modφ(n))公式了。当然就几乎只有原来那个公钥(e,n)的e满足其条件,所以不是任何公钥都可以解的。大哥,你才是理解错了吧。作为解密方,你只有d和n,你怎么可能有e来给你验证这个ed≡1(modφ(n))公式呢?
解密方做的只不过是求解公式:c^d≡m(modφ(n))中的m罢了,(c为密文)。
解密方完全可以根据任意一个d`得出一个m`,但是这个m`是否与原来的m相同,只能通过第9步才能验证,进而验证这个d`确实是真正的加密方的公钥。
key说:
CA的公钥是附在数字证书上面的吗
张文说:
CA公钥是附在数字证书上面的吗?
何时,枫叶红说:
鲍勃给苏珊回信,那所有人,不都可以看到信的内容了吗
王昊明说:
最好不要用鲍勃、苏珊之类。就用A、B、C就好了
依力哈木·多来提说:
努力创业
滕均说:
开启支付功能
薛来桓说:
1063672谢谢大哥
弗丁老爹说:
1、只是CA证书被替换不要紧,操作系统or浏览器会在一张表里去查这个证书是否存在,是不是CA的。如果不是就揭穿了骗局;2、如果CA证书列表也被篡改了,说明你的操作系统or浏览器已经被攻破了,那神仙也救不了,没办法,只能等系统升级或者打补丁了。
引用何时,枫叶红的发言:鲍勃给苏珊回信,那所有人,不都可以看到信的内容了吗
对于HTTPS而言,鲍勃对每个人的加密算法都不一样,所以不存在这个问题,本文没有涉及到。
落叶_为谁说:
第9步中,既然是“苏珊再对信件本身使用Hash函数”,那么为什么图片上的“信件”下方还有一个“Digest”是不是图画错了?
引用落叶_为谁的发言:第9步中,既然是“苏珊再对信件本身使用Hash函数”,那么为什么图片上的“信件”下方还有一个“Digest”是不是图画错了?
第9步中,既然是“苏珊再对信件本身使用Hash函数”,那么为什么图片上的“信件”下方还有一个“Signature”是不是图画错了?【修正】
阿萨的说:
那不是每个拥有CA公钥的人都可以拿到鲍勃的公钥,都可以对数据进行解密?
钟品安说:
好用,真好!直的点赞。
mokuten说:
引用阿萨的的发言:那不是每个拥有CA公钥的人都可以拿到鲍勃的公钥,都可以对数据进行解密?
都可以拿到鲍勃的公钥没错,但此公钥只是用来加密数据后发给鲍勃而已。每个人都可以发信息给鲍勃,这没问题。
胡成超说:
张灿说:
@御宅暴君:
goool其实有点钻牛角尖了,加密和解密的RSA实现应该是一样的。
王楠说:
写得太好了,受教了...
还有根证书没有讲到。
feibenren说:
鲍勃分发的给三个人的公钥是一模一样的吗
561说:
WCD说:
可能是道格自己也有一套公钥-私钥,然后把自己的公钥和苏珊手里的鲍勃的公钥对换,然后再通过自己的私钥和现在苏珊手里自己的公钥通信。所以才有了后来找认证中心对鲍勃的公钥认证,已确定自己手里的公钥是鲍勃的公钥
zhangliang说:
通俗易懂,赞一个
hayabusa_l说:
@Yonny:
好的说:
终于明白了,谢谢大神!大道至简!
TommyWhite说:
想问第5步,在Bob写完信息后应该会先用私钥加密信息再Hash运算得到摘要的吧???
引用TommyWhite的发言:想问第5步,在Bob写完信息后应该会先用私钥加密信息再Hash运算得到摘要的吧???
还有第9步骤应该Susan首先要拿公钥对信件本身解密再使用Hash运算才将得到的结果与上一步得要的再要进行对比以确认这封信件是否有被修改?
CA说:
那CA中心想耍流氓,用自己的(ca私钥——ca公钥)ca公钥通过侵入到苏珊的电脑换掉道格的公钥(但他说还是道格的公钥,其实已经是ca公钥),然后冒充道格去和苏珊通信,苏珊岂不把信息都发给了CA
引用CA的发言:那CA中心想耍流氓,用自己的(ca私钥——ca公钥)ca公钥通过侵入到苏珊的电脑换掉道格的公钥(但他说还是道格的公钥,其实已经是ca公钥),然后冒充道格去和苏珊通信,苏珊岂不把信息都发给了CA
不是道格是鲍勃,名字记错了
张奇说:
苏珊是需要公钥加密给鲍勃法信息的,鲍勃用私钥进行解密,但是鲍勃回信的时候采用数字签名的形式验证信是自己发的,但是鲍勃回信的内容需要加密么?这里只讲了对摘要进行加密,苏珊也是对摘要解密,可是信件本身需不需要加密解密并没有解释
峰中劲草说:
引用张奇的发言:苏珊是需要公钥加密给鲍勃法信息的,鲍勃用私钥进行解密,但是鲍勃回信的时候采用数字签名的形式验证信是自己发的,但是鲍勃回信的内容需要加密么?这里只讲了对摘要进行加密,苏珊也是对摘要解密,可是信件本身需不需要加密解密并没有解释
至于信件本身加密可以使用对称加密方法,信息发送之前,使用某种密钥交换算法共享密钥。(防止信件内容泄露)
lllqqq说:
太棒了,清晰很多
xiami说:
wenfei123505说:
引用Michael.Z的发言:还是有些模糊,需要慢慢理解。
私钥和公钥是一对加密密钥和解密密钥吧
FutaoSmile丶说:
证书中心的给出的公钥不是也可以被道格修改成自己在证书中心拿到的公钥吗
mimi说:
曲双如说:
生吃汉堡包说:
我来说说第八步:
鲍勃给苏珊回信,如何回?总不能就直接在信道里传吧?他肯定要用苏珊的公钥加密,然后苏珊用她的私钥解密,得到明文本及数字签名。此时她只是收到明文本,然后她根据发来人信息判定是谁发来的,然后用相对应的公钥来验证,是否属实。公钥解密数字签名,肯定会得到东西,Hash值只是摘要的一部分(这个博主好像没说),hash值是用来验证完整性的,摘要中还有认知部分(可辩别的部分)。如果相应公钥解密可认知,那么就可确定是谁发出来的。如果是伪造,解密出来几乎肯定(万恶的量子物理)是奇奇怪怪的东西。
PS:前提你的设备是安全的,不然说个毛。
盛世游侠说:
@徐朋:
lyn说:
你没有发送方的私钥,你用自己的私钥重新签过的名,是无法通过发送方的公钥来验证的
xiaoxionga说:
我认为是这样理解的:道格将自己的公钥换走了鲍勃的公钥后,苏珊写给鲍勃的信,其实是写给了道格.反过来,道格写给苏珊的信,苏珊也可以拿这个公钥解密,只不是她不知道这个信已经不是鲍勃写的了.
Holla说:
某个网站的CA公钥和它的证书我可以拿到,同时也就解密出这个网站的公钥了。如果这个网站正在给一个用户发一封邮件,我截取到这个邮件,再通过网站公钥解密不就得到传输的内容了??虽然客户端给服务器发送的没法解密。这怎么解释??
修改完邮件生成签名时的服务器私钥你是没有的,只要不是一对秘钥,即便拿到修改后的信件内容也是没法用数字证书解密后的服务器公钥去解密信件内容的。
杨亚达说:
“服务器用自己的私钥加密网页”
这里似乎不对,难道不是服务器用客户机的公匙加密网页,客户机再用私匙解密?
准确的说,是①服务器发送证书;②客户机解密并验证证书得到服务器公匙;③客户机生成对称密匙,用服务器公匙加密,发送给服务器;④服务器用私匙解密,得到对称密匙;⑤(还有一些具体的过程省略...)⑥服务器用对称密匙加密网页发送给客户机;⑦客户机用对称密匙解密网页。
姚伟说:
有一个问题,鲍勃给苏珊发信时,苏珊怎么证明收到的信中的数字证书是鲍勃的?如果道格有能力去把苏珊电脑中保存的鲍勃的公钥替换成自己的公钥,那么他也有能力把苏珊电脑种保存的鲍勃的数字证书替换成自己的数字证书。然后道格用自己的私钥生成签名,在信件中附加自己的数字证书,发信给苏珊,苏珊还是会以为是鲍勃在给她发信。
张春星说:
鲍勃在信件内容后面附加上数字签名后发给苏珊。苏珊收信后,取下数字签名,用鲍勃的公钥解密,得到信件的摘要。由此证明,这封信确实是鲍勃发出的。-------------------------------------问题:这个地方不懂,信件内容不加密了?明文传输?
Lion说:
前四步我是明白了,公钥加密,只能用私钥解密;第五步说的:鲍勃给苏珊回信,决定采用"数字签名"。他写完后先用Hash函数,生成信件的摘要(digest)。这里使用数字签名的意思是不是:内容没有加密,只是和内容一起发送了一个数字签名。苏珊通过公钥也可以生成一个鲍勃用私钥生成的一样的数字签名。这样就可以确认是不是鲍勃发出的信件了是吗?
CA是不是就相当于一个公钥托管中心,这样苏珊电脑里存的鲍勃公钥就不会被人修改了。然后从CA请求下来公钥,从而解密数字证书得到鲍勃公钥,再用这个公钥进行解密,但是这个过程鲍勃发的信的内容还是没有加密的,只是确保数字签名解密正确是吗?
开发小菜鸟说:
引用Lion的发言:CA是不是就相当于一个公钥托管中心,这样苏珊电脑里存的鲍勃公钥就不会被人修改了。然后从CA请求下来公钥,从而解密数字证书得到鲍勃公钥,再用这个公钥进行解密,但是这个过程鲍勃发的信的内容还是没有加密的,只是确保数字签名解密正确是吗?
CA就是几个权威机构,是用来验证Bob的公钥就是Bob的,然后拿数字证书中解密出来的Bob公钥来解密Bob的数字签名验证信件的完整性,如果完整就可以解密信件,但是HTTPS应该楼主说的这些是握手过程,如果成功了着两个点的通信往来就用sessionKey来进行对称加解密,开销更小。
老路人甲说:
@杨亚达:正解,这里确实有问题.
uu说:
感觉说的不明白啊
kingfire说:
引用盛世游侠的发言:@goool:
为什么不可能?用A的公钥去解密用B的私钥加密的密文的话,就是得到乱码而已呗。只有一个私钥只对应一个公钥才能保证业务正确呗。
Chris投票好人说:
感谢,也是目前为止我对数字签名理解的最清楚的一次
慢速快门_说:
zhouzixi说:
前面数字签名和数字证书的解释很清晰,但后面的使用过程貌似不是很正确
比如第17条,”受信认的根证书颁发机构“应该就是指CA吧,如果得到证书里的颁发机构写的不是列表里的,才是不受信任吧,而不是check要通信的server的公钥是不是在列表里
双方加密通信实际使用的,应该是用这个公私钥协商出来的对称密钥,这个过程怎么就没有了,客户端上来就给B发加密请求这里解释的比较模糊,实际还在握手阶段吧
如果如文中所述使用公私钥作为加密通信,只能实现单向加密,无法交换加密信息
昼伏君说:
引用Yonny的发言:如果你的身份证校验仪(CA)已经是假的了,那就啥都别说了,重装系统吧。
对哦!CA的作用是校验,即保证鲍勃的公钥的确是鲍勃的,这样杜绝了道格通过伪造鲍勃公钥,欺骗苏珊的可能。道格还想继续欺骗,就得连证书也伪造了,即此时“校验仪”也是假的。
兆一弟弟说:
引用yehot的发言:根本就没有帕蒂什么事啊,这就尴尬了
哈哈哈对呀我也发现了
赵文明说:
@QuinnChen:
同意你的理解。1、信息安全传输(A->B,A使用B的公钥加密,B使用B的私钥解密);2、数字签名(A->B,A使用A的私钥加密,B使用A的公钥解密)。
张健说:
请问:苏三给鲍勃写信用的是公钥,鲍勃如何确认信就是苏三写的,既然3个人有公钥,苏三可以冒充其他任何一个人吧?不对称加密是:只要用我的公钥加密的文件,只有我自己的私钥能解。既然这么多人用我的公钥发文件给我,怎么核实发件人的真实性呢?
hoho说:
我不明白服务端不加数字签名为什么就会被人冒冲的可能,没有私钥怎样冒充或撰改得了呢
JackLin说:
因为证书上面又bob或者doge的信息,如果Susan认为bob的证书是doge的,那susan就没救了。就好像A拿了自己身份证给你看,你还把他当作是B。
同意goool的观点,原理应该是那样的。可能实现上面会又一些差别,可能用其他人的公钥来解用bob私钥加密的信息会无返回值甚至出错,但是这已经无关要紧。
得之吾幸说:
请问第9张图在发送同样一个哈希算法后明文对比,那如果这个被截获了,不就看到内容了么???
引用得之吾幸的发言:请问第9张图在发送同样一个哈希算法后明文对比,那如果这个被截获了,不就看到内容了么???
bob给susan发送的消息是用susan的公钥加密的,只有susan用她的私钥才能解开消息,然后用hash计算出摘要。
chen.amy2017说:
引用QuinnChen的发言:
diletrich说:
1.鲍勃->苏珊的消息可能不安全,只要第三方偷偷换调苏珊的公钥,再用自己的私钥给苏珊发消息,那么苏珊将只收到假消息,而真鲍勃永远无法给她传递消息。
2.既然苏珊本地的公钥会不安全,那就再来一层,加上CA颁发的证书包裹着这个公钥,每次交流前再把公钥给你,但第三方就不会再假扮一个CA再弄个假证书里面放着假公钥
3.关键就在这里,第三方这次真做不了假了,因为有OnlineCertificateStatusProtocol和HTTPPublicKeyPinnin这两个东西存在,浏览器会去检查CA的证书是否已被吊销,完毕。
111说:
这个网页存在很大的漏洞,十分钟后我将攻破这个网页,植入病毒,做好准备。
本分说:
浏览器对证书及时的更新,即发给权威机构CA,CA用自己的私钥发现解不开假的证书,或者解得的是乱码,则反馈给浏览器,浏览器再警告给用户,证书被人通过隐蔽的方式偷换掉了,此证书是假的,请删除!至此即可完成更新,当然如果你所坏人还会继续偷换证书,那我也没话说。
xiao星说:
感觉软件就是个循环,万一证书中心的私钥也被人篡改了咋办。。。。。是不是就是得有个机构去对这个证书中心去监督了。。。但是不就是循环了?或者去中心化?当下流行的区块链技术是不是可以解决这个问题?
伯格说:
QuietHeart说:
直观的描述:#+BEGIN_EXAMPLE1.a发送信件给b。b:这信件是不是a发的2.a告诉b指纹(公钥),再写信并且每个字都按下指纹(用私钥加密信件)发给b。b:每个地方都验证指纹(加密解密),得到内容--太慢了(非对称加密效率低下)。3.a告诉b指纹,直接写信,并且在整个信上按下一个大大的指纹(签名)发给b。b:嗯,是a的指纹(由签名获取到摘要与自己计算的匹配),不错挺快--可是告诉我指纹的那人真的是a吗(第三方劫持篡改消息)4.a去大家都信任的国家机构注册(认证机构私钥加密)了自己的指纹,并且在信上按下大大的指纹(签名)后,连同身份证(证书)一起发给b。b:先检查身份证,对,这个是国家机构发布的;再查看身份证内容(解密证书得到公钥和签名),恩,对信上按的是a的指纹(由签名获取到匹配摘要);恩,对,这封信是a发的(证书上其它信息描述具有这个公钥的人是a)。好了,这回我相信了(将信任基础建立在绝对安全的常识上,而非个人)。#+END_EXAMPLE
zijian说:
@diletrich:
感谢,很有意义的答案,大多数人加密和认证弄混了,Bob只想证明内容是自己发出的,而加密过程由client对随机AES-Key用Server的PublicKey加密后,Server端解出AES-Key来完成
mmz说:
引用xiao星的发言:感觉软件就是个循环,万一证书中心的私钥也被人篡改了咋办。。。。。是不是就是得有个机构去对这个证书中心去监督了。。。但是不就是循环了?或者去中心化?当下流行的区块链技术是不是可以解决这个问题?
zhangyx说:
对18步骤有一些疑问,因为SSL协议在握手阶段需要客户端和服务端协商出一个对话密钥用于后面的通讯,才算是握手成功,生成对话密钥的需要证书当中的公钥。如果证书不可信,把证书添加到可信列表中,那么浏览器是怎么怎么从证书当中获取公钥的,因为浏览器没有该证书的CA的公钥,按道理浏览器应该和服务端是连接不成功的,可现实是浏览器能正常和服务端通讯。
Jerry说:
@Jason:
公钥能解私钥,私钥也能解公钥,所以用私钥直接加密原文是危险操作,因为只要有对方的公钥就能直接破解。之所以多了一层hash加密是因为hash一般是不可逆的,所以无法由摘要还原成原文
llj说:
厉害!很容易懂
善用佳软说:
你应该翻译成宋江/李逵/李鬼……:-)
Jack说:
能用公钥解密就能证明对方身份这里能详细说说公私钥加密解密原理吗,具体什么是"能解密",在不知道原文是否正确(是否被篡改)的情况下,怎么知道有没有成功解密。
arong说:
马克思说:
6->7的过程鲍勃只是用自己的私钥加密摘要生成数字签名然后发送给苏珊这个时候信件是透明的,别人有鲍勃的公钥也可以解开信件。
我觉得是不是应该将生成的明文+数字签名用苏珊的公钥加密在发送给苏珊,保证只有苏珊的私钥可以解开信件。然后在验证其是否被篡改。
findmoon说:
整个过程,如果客户端使用信任了不受信任的证书机构,则将导致所有的安全措施和加密行为没有任何效用
litbear说:
第8步博主理解错了,应该是Bob把数字签名和原文一起使用Pat的公钥进行加密,Pat得到信息后使用Pat的私钥进行解密,得到原文和签名两部分,然后再对原文应用同样的hash函数得到摘要,首先确定原文完整性,其次使用Bob的公钥对摘要进行加密,然后与随原文来的数字签名进行比较,如果一致,则确定了保密性。
引用litbear的发言:第8步博主理解错了,应该是Bob把数字签名和原文一起使用Pat的公钥进行加密,Pat得到信息后使用Pat的私钥进行解密,得到原文和签名两部分,然后再对原文应用同样的hash函数得到摘要,首先确定原文完整性,其次使用Bob的公钥对摘要进行加密,然后与随原文来的数字签名进行比较,如果一致,则确定了保密性。
很抱歉,是我理解有误,发送者应使用私钥签名,同时接收者在得到发送者的签名后应用发送者的公钥进行验证,以保证信息是该公钥对应的发送者发送来的。“公钥与私钥都能用来加密与解密,使用私钥加密往往与保证签名者真实性有关”
pingia说:
我感觉各位还不如看英文文档来的靠谱。英文看不明白,自己用谷歌翻译好了。楼主中间可能漏掉一些没有翻译,导致有些地方模糊。最后一段的谷歌翻译如下:现在Bob的同事可以检查Bob的可信证书,以确保他的公钥真正属于他。事实上,Bob公司的任何人都不会接受Susan生成的证书不存在的签名。如果私钥被泄露或不再需要,这使Susan有权撤销签名。还有更广泛接受的证书颁发机构认证苏珊。
假设Bob向Pat发送签名文档。为了验证文档上的签名,Pat的软件首先使用Susan(证书颁发机构)的公钥来检查Bob证书上的签名。证书的成功解密证明了Susan创建了它。证书解密后,Pat的软件可以检查Bob是否与证书颁发机构保持良好的信誉,并且所有关于Bob身份的证书信息都没有被更改。
然后,Pat的软件从证书中获取Bob的公钥,并使用它来检查Bob的签名。如果Bob的公钥成功解密签名,那么Pat确保签名是使用Bob的私钥创建的,因为Susan已经认证了匹配的公钥。当然,如果签名有效,那么我们就知道Doug没有尝试更改签名内容。
您的大名说:
同时没有使用ca时道格修改了苏珊保存鲍勃的公钥完蛋使用ca后道格修改了鲍勃返回给苏珊的证书中的鲍勃的公钥同时修改了苏珊使用的比如浏览中内置的ca公钥后也是完蛋
杨洋说:
“鲍勃拿到数字证书以后,就可以放心了。以后再给苏珊写信,只要在签名的同时,再附上数字证书就行了”道格偷了鲍勃的数字证书怎么办?
LXX说:
有个疑问?使用数字签名的意义是什么?为什么不直接使用私钥加密数据然后返给别人?为什么要使用私钥加密摘要发送给别人?
别人解密了摘要就判断是本人了,那解密了使用私钥加密的数据不也能判断是本人吗?还有防篡改,如果我使用私钥加密数据然后返回,别人没拿到私钥怎么篡改?如果能篡改,我觉得数字摘要那个签名也能篡改。
来了来了说:
引用杨洋的发言:“鲍勃拿到数字证书以后,就可以放心了。以后再给苏珊写信,只要在签名的同时,再附上数字证书就行了”道格偷了鲍勃的数字证书怎么办?
不怕的,通过数字证书获得的是真实的公钥,真实的公钥只能解密真实的数字签名,别人无法获得私钥,只能生成假的数字签名
xiaoheiyohehe说:
引用LXX的发言:有个疑问?使用数字签名的意义是什么?为什么不直接使用私钥加密数据然后返给别人?为什么要使用私钥加密摘要发送给别人?
*数字签名中的信息摘要是用来证明你看到的确实是我想发给你看的.(没有人为篡改或传输过程中造成的位信息错误,假如有人故意在加密文本上给你篡改数据,你解密后是一堆乱码,那你又怎么知道对方是不是一开始就打算发一堆乱码给你).
*数字签名中的公钥私钥是为了验证你的身份.
*关系总结:数字签名=公钥私钥加密算法+信息摘要验证算法,信息摘要--(私钥加密)--->数字签名.数字签名验证正确就可以判断,这个消息确实是我写的,并且文本正确;如果验证错误,要么是拿错了钥匙,要么是文本内容出错.
Veeupup说:
alibaba说:
xwine说:
@LXX:
数字签名是为了保证数据完整性。通过它可以判断数据是否被篡改私钥加密完的数据所有知道公钥的都可以解密,这样不安全。私钥加密的作用是为了确认身份,用对应的公钥解密概要,则证明概要来自谁,起到签名的作用解密摘要和你说的==‘解密了使用私钥加密的数据’这个数据一般就是摘要使用私钥加密的数据是没法被篡改的,但是可以被其他所有人用公钥解密
zm说:
苏珊收信后,用CA的公钥解开数字证书,就可以拿到鲍勃真实的公钥了,然后就能证明"数字签名"是否真的是鲍勃签的。这个CA的公钥苏珊是从哪里获得的呢,是在数字证书里吗
苏珊说:
觉得第8步没有问题的,考虑一下这个场景:假如阿猫拦截了通讯过程,将信件内容修改之后也Hash了摘要并用阿猫的私钥签名,然后发给苏珊.此时苏珊用鲍勃的公钥解密,但是也得到一串已解密字符串即便是错误的,如何证明这串字符串就是真正的解密文本呢还是非对称加解密算法本身提供了校验机制如果是就可以证明发送者是鲍勃,否则还需要第9步的帮助才能证明是不是鲍勃.
陈南说:
我觉得这个意思是说道格到苏珊得电脑上把保存得鲍勃得公钥换成了自己得公钥吧。既用自己得公钥伪装成鲍勃得公钥
Slayer说:
"苏珊收信后,用CA的公钥解开数字证书,就可以拿到鲍勃真实的公钥了,然后就能证明"数字签名"是否真的是鲍勃签的。"
这里的CA的公钥应该只是来解密“签名值”,然后计算数字证书的hash值比对,鲍勃的公钥和其他信息没有用CA的私钥解密吧。
wcc说:
引用苏珊的发言:觉得第8步没有问题的,考虑一下这个场景:假如阿猫拦截了通讯过程,将信件内容修改之后也Hash了摘要并用阿猫的私钥签名,然后发给苏珊.此时苏珊用鲍勃的公钥解密,但是也得到一串已解密字符串即便是错误的,如何证明这串字符串就是真正的解密文本呢还是非对称加解密算法本身提供了校验机制如果是就可以证明发送者是鲍勃,否则还需要第9步的帮助才能证明是不是鲍勃.
公钥是鲍勃的,解阿猫的签名出来的摘要跟发送信息中的摘要对不上的。
depingchen说:
引用zm的发言:苏珊收信后,用CA的公钥解开数字证书,就可以拿到鲍勃真实的公钥了,然后就能证明"数字签名"是否真的是鲍勃签的。这个CA的公钥苏珊是从哪里获得的呢,是在数字证书里吗
CA的公钥假设是操作系统安装的时候自带的。
lxr说:
苏珊收信后,取下数字签名,用鲍勃的公钥解密,得到信件的摘要。由此证明,这封信确实是鲍勃发出的。请问为什么这里能确认写信者是鲍勃?
test说:
引用lxr的发言:苏珊收信后,取下数字签名,用鲍勃的公钥解密,得到信件的摘要。由此证明,这封信确实是鲍勃发出的。请问为什么这里能确认写信者是鲍勃?
摘要是用鲍勃的私钥加密的,只有鲍勃的公钥才能解开。而鲍勃的私钥只有鲍勃才有。
路人甲说:
请问在生成证书摘要是怎么确定用的是哪种hash算法??@阮大神
大厨海森堡说:
是的,其实沿用RSA的论文的说法比较合适,用公钥加密明文的过程才是通常意义的加密,用私钥进行“加密”实际上是签名,这样所有人都可以通过公钥进行签名验证。
SmallMuscle说:
你好,如果是自签名的证书,如何安全的给客户端公钥呢?!
懵说:
关于第八步,没看到结果。。什么是所谓的解不开?解得开和解得对不是一回事吧。
是不是很多人误当成了现实中的锁,以为错误的钥匙一下子就能被试出来。还是这里的加密算法真是这样的,除非正确的密钥,否则算出来肯定是异常数据。
飘扬说:
964说:
很棒,受益匪浅
2924196224说:
阮一峰老师您好,关于数字证书的整个过程,之前一直感觉仍然有一个小小的安全隐患,但仔细想想又没有,下面是这个过程,不知道理解的对不对:
1、苏珊在与鲍勃监理通信时,道格"截获了"鲍勃发送给苏珊的包含证书的回复,并用自己的证书替换鲍勃的证书2、苏珊获取到"替换了证书"的鲍勃回复,但是此时没有可信任机构的公钥,于是去获取公钥,此时道格有两种方式试图欺骗苏珊:(1)道格"伪装"成可信任机构。无法伪装,因为可信任机构是在证书写明并且可信任机构是共知的。(2)道格"截获"并"伪造"苏珊和可信任机构的整个获取公钥通信。自己替换的证书也是该机构的,无法通过替换公钥的方式伪装,只能自己代替"苏珊"与可信任机构通信,同时自己"伪装"成可信任机构与真实的"苏珊"通信,中间篡改信息,但是由于自己替换的证书是该机构的,篡改信息就无法验证证书。(3)最终只剩一种可能,苏珊"信任了"不可信任机构的情况下,才有可能导致安全问题。
不知道这个理解对不对
关于私钥加密生成数字签名的疑问如文中介绍,私钥加密的签名可以用公钥解密吗?也就是公钥可以解密私钥,私钥也可以解密公钥,但是公钥加密只能用私钥解密,这样理解对吗?
雷小伊说:
私钥解密相比公共密钥的安全性哪个更高啊;/
沁宁说:
这个写的确实很清晰
养乐多说:
@febird:
xjz说:
中间有些疑惑不太懂,望懂的人解答。我中间拦截把数字证书拿到,既然公钥是公开的说明我也可以解开这个数字证书,我发送的信息用自己的私钥加密得到摘要,把证书替换成自己的证书,证书中的公钥是我的公钥,消息是自己的私钥加密的,发送给对方,对方得到摘要事我私钥加密得,证书中是我得公钥。这不也做到了偷天换日吗?那个细节我理解错误了望解答
sukidayo说:
第8条,应该不能说是公钥解密了私钥,而应该是公钥可以验证私钥签名,从而保证内容的真实性和完整性.而且对原文进行摘要计算之后,是对摘要进行私钥签名.
leeorz说:
引用xjz的发言:中间有些疑惑不太懂,望懂的人解答。我中间拦截把数字证书拿到,既然公钥是公开的说明我也可以解开这个数字证书,我发送的信息用自己的私钥加密得到摘要,把证书替换成自己的证书,证书中的公钥是我的公钥,消息是自己的私钥加密的,发送给对方,对方得到摘要事我私钥加密得,证书中是我得公钥。这不也做到了偷天换日吗?那个细节我理解错误了望解答
这里的关键点是:证书是CA用私钥签发的,只能用CA的公钥解开。你篡改了证书,用自己的私钥签发证书,信息接收方用CA的公钥没办法解开。除非你想办法让对方用你的公钥去解密证书。这一步一般都是浏览器完成的。阮老师文中也说明了,浏览器会内置一份"受信任的根证书颁发机构"列表,从这份列表去判断证书的签发机构。显然你不是这份列表里面的机构,除非你攻破了浏览器。
今晚吃啥说:
1.理解第8,9两步的关键"用公钥可以解开私钥加密的信息,反之亦成立。"。2.如果使用公钥解密后拿到的报文摘要有误,有两种情况,·确实是bob的私钥加密的摘要,但是报文在传输图中遭到了篡改。·摘要不是bob的私钥加密的,用公钥解密出来的是错误的摘要。所以通过公钥解开数字签名能得到正确的摘要,就能证明这个报文是bob发送的。
liziyang说:
第九步骤有个问题没说清楚:所有拥有公钥的人都可以窃取并还原回bob给苏珊的回信。所以鲍勃需要和苏珊商议一个只有他们彼此知道的基于本次会话的对称密钥来对信息进行加密。
king4e说:
苏珊收信后,取下数字签名,用鲍勃的公钥解密,得到信件的摘要。由此证明,这封信确实是鲍勃发出的
-------------------------------
数字签名只能证明是鲍勃发出的,而无法加密给苏珊的信吗也就是说任何人都可以用鲍勃的公钥(每人一把)看给苏珊的信吗
ChampionFu说:
我的理解是:中间人攻击分为两种类型:拦截和伪装,也就是'偷'和'骗'。如果没有证书公证机构(CA)的话,RSA只能解决'偷'的问题(其实感觉如果能偷鲍勃的公钥,为什么不把苏珊的私钥一起偷了)。数字签名是为了防止被'骗'。于是私人间使用的公钥也要加密。唯一公开的其实就是CA的公钥。其实这也不怎么安全,道格使用'偷'的办法拦截到'回信',把'回信'上面的证书换成自己的,这样还是把苏珊给'骗'了
jiang说:
引用玉沭林沣的发言:那么在下载到本地后,如何避免被替换的问题呢?感觉跟道格用自己的公钥替换鲍勃的公钥一样啊,假若苏珊每次也是重新下载鲍勃的公钥岂不是同样可以避免公钥被替换的问题,那么还要数字证书干什么?
mlshenhua说:
kingofswing说:
引用bluegene的发言:
这个才是正确的理解,也就是道格他自己私下里生成了一对RSA秘钥,把这对秘钥里的公钥偷偷地替换了susan电脑里原来bob的公钥。如果翻译的时候把这层意思说明了,看客就理解清楚了。
你好,李焕英说:
既然dog能替换susan的bob公钥,也可以替换susan的ca公钥吧?dog也能拿自己的公钥到ca生成证书,然后偷偷把susan的bobca公钥替换成dog的ca公钥,然后dog写信签名+证书,然后susan使用被替换的ca公钥解密,也可以达到伪造bob与Susan通讯的目的?谁来解答一下,谢谢
amy说:
引用你好,李焕英的发言:既然dog能替换susan的bob公钥,也可以替换susan的ca公钥吧?dog也能拿自己的公钥到ca生成证书,然后偷偷把susan的bobca公钥替换成dog的ca公钥,然后dog写信签名+证书,然后susan使用被替换的ca公钥解密,也可以达到伪造bob与Susan通讯的目的?谁来解答一下,谢谢
2.“然后偷偷把susan的bobca公钥替换成dog的ca公钥”不存在“bobca公钥”、“dog的ca公钥”一说。一方面,CA是一种专门的第三方机构,并且国际的根CA机构数目非常有限,bobdog这样的个体是不会有“ca公钥”的;另一方面,CA都是一些可靠的大机构,它们的公钥在自己网站上提供下载,所以无法伪造;并且CA的公钥网上可以取得,浏览器中也有预存。
3.如果dog把susan电脑里存的CA公钥换掉了怎么办:可以在当前网页中搜索网友“Yonny”对相似问题的回答
以上是我的理解
维努斯说:
我有一个疑问,第八步苏珊解密之后也只是拿到了摘要,第九步的时候苏珊又是怎么一下子拿到信息的本身呢?是不是可以这样理解,鲍勃在发送信息的时候明文,密文都发给了苏珊呢?
弹钢琴的杜甫说:
从头到尾也没说数字签名的作用啊,按我来看,数据只要通过秘钥加密就可以,如果能解密成功就说明是可靠的,为啥要签名。
fish说:
引用弹钢琴的杜甫的发言:从头到尾也没说数字签名的作用啊,按我来看,数据只要通过秘钥加密就可以,如果能解密成功就说明是可靠的,为啥要签名。
对不起,没有数字签名你上的可能是钓鱼网站。钓鱼网站也可以随便给你一个公钥。数字签名保证的是你得到的这个公钥是可信的
Bol说:
服务器用自己的私钥加密网页以后,连同本身的数字证书,一起发送给客户端。--“使用自己的私钥加密”是不是错了
引用fish的发言:
hehe123450说:
有一个很好的讲述,希望对大家有帮助:
中间人有可能把证书掉包吗?假设有另一个网站B也拿到了CA机构认证的证书,它想劫持网站A的信息。于是它成为中间人拦截到了A传给浏览器的证书,然后替换成自己的证书,传给浏览器,之后浏览器就会错误地拿到B的证书里的公钥了,这确实会导致上文“中间人攻击”那里提到的漏洞?
其实这并不会发生,因为证书里包含了网站A的信息,包括域名,浏览器把证书里的域名与自己请求的域名比对一下就知道有没有被掉包了。
我是Bob说:
引用goool的发言:@mazhechao原文的56789是一个完整的签名场景,请在这个场景下重新考虑一遍。然后重新看一下8的表述:
实际上Bob的“数字签名”可以用任何人的公钥解密,得到一个hash值。如果不加上第9步(比对原文的hash值)。这个第8步得不到任何有价值的信息。
我的数字签名是用我的私钥加密的,只有我的公钥能解密,如果你能解密,就说明你用的是我的公钥,就证明该信件一定是我发的,这就是签名的含义。
pengb说:
想问一下,为什么bob的信不直接用私钥加密呢,为什么要生成摘要,这样不已经可以直接证明这封信是bob发出的,不需要生成签名去认证呢?
接化发说:
引用pengb的发言:想问一下,为什么bob的信不直接用私钥加密呢,为什么要生成摘要,这样不已经可以直接证明这封信是bob发出的,不需要生成签名去认证呢?
vincent说:
看来争论比较大。我一直认为是这样:用户连接过程也是用户权限认证过程,是采用非对称加密解密来认证,也确认接下来双方数据交换时的对称加密的方法A,双方都是用A加密,当然也能解密。数字签名应该是非对称加密认证过程发生的,你们说呢是非对称的,而且是握手时,后面就不用
waley说:
引用FutaoSmile丶的发言:证书中心的给出的公钥不是也可以被道格修改成自己在证书中心拿到的公钥吗
CA机构你可以理解为派出所(有权威性),你去办理证书的时候除了提供自己的公钥还要提供身份证原件。办理完成后,最终生成的证书里面包含:你的公钥+你的身份证号码。这样一来,道格是不可能伪造bob的证书的:首先他拿不到bob的身份证,其次就算他拿到了bob的身份证,然后去自己的公钥去办理也会失败。因为bob之前已经办理过了,不能重复再办理。或者你说bob就直接用他自己的身份证去办理。但是这样得到的证书里面绑定的是bob的身份证号码。我们的一切讨论的前提是苏珊是知道bob的身份证号码的。这样苏珊只要一看这个身份证号码就知道这个证书是不是bob的。
dd115942说:
山先生说:
LiuMeng说:
CA机构的公钥是全世界公开的,浏览器本身可以验证其真伪。数字证书是服务器向CA发送自己的公钥和省份信息,让CA机构拿它的私钥对这些信息进行加密。
jc说:
lwh说:
原文是:8苏珊收信后,取下数字签名,用鲍勃的公钥解密,得到信件的摘要。由此证明,这封信确实是鲍勃发出的。
这样说得更合适:8苏珊收信后,取下数字签名,用鲍勃的公钥解密,得到信件的摘要。这可以证明,这个签名确实是鲍勃签发的。
Rhodi说:
CA并不能伪造。CA颁发机构就是系统开发商和其认证的次级颁发机构。微软苹果会在自己的浏览器/系统中保存自己的CA认证公钥,其他次级颁发机构的公钥也归根结底也是由上一级签名认证的,因此任何一个可信的CA证书都有一个认证链条,只要链条上任何一个出现问题,浏览器/系统就会提示错误。
比如华为从微软获取了CA颁发权,那么他的公钥就首先是被微软CA认证的。那么其他人找华为认证的证书,就会形成微软-华为-自己的证书链条。如果有人冒充华为公钥,那么这个冒充证书就无法通过微软CA认证,因为微软的公钥是保存在系统中的,是一定会被发现的。
这也是为什么不要使用盗版系统的原因。
当然根证书可以手动添加,但是如果网页/软件要求你添加根证书,这个行为本身就很可疑,如果是组织内部,那这个根证书也是可以的,比如我们软件公司给企业内部部署WebApp,可以生成一个只用于内网的CA根证书,并且windowsServer还提供批量添加根证书的功能,为的就是解决内网认证的问题。
如果是互联网上的服务,那么通过添加根证书来达成恶意目标,效率太低,而且本身这个行为就可疑。因此只有网银这种需要更严格的安全保证的网络服务,才会让你添加根证书来执行他们自己的安全方案。
引用lwh的发言:这样说得更合适:8苏珊收信后,取下数字签名,用鲍勃的公钥解密,得到信件的摘要。这可以证明,这个签名确实是鲍勃签发的。其实你的表述也不准确。文中关于私钥加密的描述,其实是“签名”。签名保证的是“内容不被篡改”。而且原文的例子里,鲍勃的回信并不是加密的,而是明文传递的。只是说,即便明文传递,“签名”这个行为可以保证在传输过程中,信息不被篡改。
其实真实的传输是“加密和签名”结合。也就是鲍勃在签名摘要之后,将签名和信息一起用苏珊的公钥加密,在进行传输。这样整个信息包括签名都是密文。
是的,原文的例子里,只是说明了签名的作用。签名可保证信息不被篡改。而加密则是保证信息不泄漏。
所以总结来说就是,公钥加密,私钥签名,加密不泄漏,签名不篡改。
签名的作用是信息不被篡改。原文中鲍勃甚至是明文传递了信息+签名。如果有人在送信过程中拆改信件内容,最后苏珊用公钥将签名解密,得到真实的摘要,在将收到的内容生成摘要,两个摘要对比就会发现内容已被篡改。
不是确定写信者是bob,而是确认信件内容不被篡改。因为篡改者并不知道bob的私钥,因此它无法篡改签名。如果篡改者将签名去掉,那信件本身就不可信了。如果保留签名,那么苏珊会从签名中获得原始信息的摘要,进而与收到的信息摘要对比,就能得知信件的真伪。
Ansel说:
引用lwh的发言:原文是:8苏珊收信后,取下数字签名,用鲍勃的公钥解密,得到信件的摘要。由此证明,这封信确实是鲍勃发出的。
其实是道斯可以伪造自己的签名的,他换了鲍勃的公钥用自己的公钥,然后用自己的私钥伪造签名,这个时候就无法证明了
晴椒闪闪说:
公钥的作用只能对发出的信件进行加密吗?如果道格要盗取苏珊通过公钥加密发送给鲍勃的信件,是否可以通过自己持有的公钥对信件进行解密呢?“这里要强调的是,只要鲍勃的私钥不泄露,这封信就是安全的,即使落在别人手里,也无法解密。”