荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: jjk (Linux Device Driver), 信区: InstallBBS
标  题: SSL是怎样工作的[转载]
发信站: 荔园晨风BBS站 (Wed May 15 13:20:25 2002), 转信

【 以下文字转载自 jjk 的信箱 】
【 原文由 jjk.bbs@bbs.sdu.edu.cn 所发表 】
发信人: skiper (雾中诤友@随风而逝...), 看版: BBS
标  题: SSL是怎样工作的
发信站: 泉韵心声 (Tue Aug  7 21:47:39 2001),


                            *****************
                             SSL是怎样工作的
                            *****************

/翻译:beetle(小甲虫)<beetle@Yidoo.com>  2001.6.14于武汉


密匙加密算法介绍
================

  该文档解释Netscape是怎样利用RSA公共密匙加密算法来保障因特网安全
的。Netscape实现安全套接字层(SSL)所使用的技术将在本文档中讨论。

  RSA公共密匙加密算法在计算机工业中被广泛用于认证和加密。Netscape
拥有RSA数据安全公司许可的RSA公共密匙算法,它被用于其产品中,特别是
那些用来认证的产品。

  公共密匙加密是一种使用一对非对称密匙来加密和解密的技术。每一对
密匙由一个公共密匙和一个私有密匙组成。公共密匙被广泛发布而成为公
共的。私有密匙则永远不会发布,而从头到尾是保密的。

  用公共密匙加密的数据只能使用私有密匙来解密。反过来,用私有密匙
加密的数据也只有利用公共密匙才能解密。公共密匙加密算法这么有用,
全归功于它这种不对称的特性。


利用公共密匙加密算法进行认证
============================

  所谓认证,就是进行身份校验以使一个实体确信另一实体是它所要求的
对象的过程。在下面的例子中,Alice和Bob是互相通讯的双方,公共密匙
算法很容易用于身份校验。记法"{数据}密匙"表示数据已用密匙加密或解
密。

  假设Alice想要认证Bob。Bob已有一对密匙,一为公共密匙一为私有密匙
。Bob向Alice提供他的公共密匙(提供的方式后面将会谈到)。然后Alice
生成一条随机消息并且把它发送给Bob:

+---------+---------+----------------+
|  A->B   |         |    随机消息    |
+---------+---------+----------------+

  Bob使用他的私有密匙加密这条消息并且把该消息的加密版本返回给
Alice:

+---------+---------+------------------------------+
|  B->A   |         |   {随机消息}Bob的私有密匙    |
+---------+---------+------------------------------+

  Alice收到这条消息后用Bob的先前公布的公共密匙来解密它。她把解
密得到的消息与她原来发送给Bob的消息相比较;如果它们是相同的,
她就知道她正在和Bob对话。假设有某个冒充者,他并不知道Bob的私有
密匙,那么他就不能正确加密该随机消息给Alice核查。

等一下,还有更多的工作
======================

  除非你确实知道你正在加密的东西,否则使用你的私有密匙加密某些
东西并且把它发送给其他人永远不会是一个好主意。这是因为加密后的
数值可以用来对付你(记住,只有你能够进行该加密——因为只有你有
该加密的私有密匙)。因此,与直接加密Alice原来发送的消息的做法相
反,Bob生成一条消息摘要并将将它加密。消息摘要是由随机消息得到的,
它的生成方式有以下性质:

  * 该摘要很难逆转。试图冒充Bob的人不可能从摘要得到原来的消息。
  * 一个冒充者要花费漫长的时间才能找到另外一条能生成同样摘要的
    消息。

  通过使用摘要,Bob能够保护自己。他计算出Alice发送的随机消息的
摘要,然后加密该结果。他把加密的摘要发回给Alice。Alice可以算出
同样的摘要并通过解密、比较Bob的消息来认证Bob。

再接近些
========

  刚才描述的技术叫数字签名。Bob已经签署了Alice生成的一条消息,
而在这个过程中他已经踏出了和加密Alice源随机值同样危险的一步。
因此,我们的认证协议还需要多一个花样:数据中的一些(或者全部)
必须是Bob的。

+----------+-----+------------------------------------------+
|  A->B    |     |你好,你是Bob么?                         |
|  B->A    |     |Alice,我是Bob。                          |
|          |     |{ 摘要[Alice,我是Bob] } Bob的私有密匙    |
+----------+-----+------------------------------------------+

  当他使用该协议的时候,Bob知道他发送了什么消息给Alice,并且他
并不介意签署它。他先发送该消息的未加密版本,“Alice,我是Bob。”
然后他发送加密的摘要版本。Alice很容易就可以验证Bob确实是Bob,而Bob还没签署他
不想签的任何东西。

传播我们的公共密匙
==================

  Bob怎么通过一个可信赖的方式传播他的公共密匙呢?让我们看看类似
以下的认证协议:

+---------+-----+---------------------------------------------+
|  A->B   |     |你好                                         |
|  B->A   |     |Hi,我是Bob,Bob的公共密匙                   |
|  A->B   |     |请证明                                       |
|  B->A   |     |Alice,我是Bob                               |
|         |     |{ 摘要[Alice, 我是Bob] } Bob的私有密匙       |
+---------+-----+---------------------------------------------+

  如果使用这个协议,那么任何人都可以是Bob。你所需要一切就是一个公
共密匙和一个私有密匙。你骗Alice说你是Bob,然后你向她提供你的公共
密匙——而不是Bob的。接下来你就可以通过使用你的私有密匙加密某些东
西来证明你是Bob了——Alice根本就不知道你到底是不是Bob。

  为了解决这个问题,标准社团已经发明了一个叫证书的对象。一个证书
有以下内容:

  * 证书发行者名称
  * 证书发给的实体(又叫主体)
  * 该主体的公共密匙
  * 某些时间戳

  证书用证书发行者的私有密匙来签署。每个人都知道证书发行者的公共
密匙(这就是说,证书发行者也有一个证书,如此类推.....)。证书是绑
定公共密匙和名称的标准方式。

  通过使用该证书技术,所有人都可以检查Bob的证书是不是伪造的的。
假设Bob对其密匙进行紧密控制并且拥有该证书的确是Bob其人,那么一
切正常。下面是修改后的协议:

+---------+-----+----------------------------------------------+
|  A->B   |     |你好                                          |
|  B->A   |     |Hi,我是Bob,Bob的证书                        |
|  A->B   |     |请证明                                        |
|  B->A   |     |Alice,我是Bob                                |
|         |     |{ 摘要[Alice, 我是Bob] } Bob的私有密匙        |
+---------+-----+----------------------------------------------+

  现在一旦Alice接收到Bob的第一个消息,她就可以检查证书,检验签名
(如上所述,使用摘要和公共密匙解密),然后检查主体(这就是说,Bob
的名称),确认他就是Bob。这样,她就可以相信该公共密匙就是Bob的公
共密匙了。这时,她要求Bob证明他的身份。Bob象前面一样执行同样的步
骤:生成一个消息摘要,然后使用它的签署版本回复Alice。这样,Alice
就可以利用证书里面的公共密匙来验证Bob的消息摘要了。

  一个坏蛋——我们把他叫Mallet——采取了以下行径:

+---------+-----+----------------------------------------------+
|  A->M   |     |你好                                          |
|  M->A   |     |Hi,我是Bob,Bob的证书                        |
|  A->M   |     |请证明                                        |
|  M->A   |     |?????                                         |
+---------+-----+----------------------------------------------+

  可是Mallet最后的消息不能Alice满意。Mallet没有Bob的私有密匙,因
此他不能伪造一条消息,使Alice相信它是Bob发出的。

交换秘密内容
============

  一旦Alice已经认证了Bob,她就可以做另外的事情了——她可以发给Bob
一条消息,该消息只有Bob才能解码:

+---------+---------+------------------------------+
|  A->B   |         |   {秘密内容}Bob的公共密匙    |
+---------+---------+------------------------------+

  得到该秘密内容的唯一方法是使用Bob的私有密匙来解密以上消息。交换
秘密是利用公共密匙加密算法的另外一个有效方式。即使Alice和Bob之间的
通讯被监听了,也只有Bob才能得到该秘密内容。

  这个技术通过利用秘密内容和另外一个密匙来加强了因特网安全,但是这
次它是对称加密算法的一个密匙(例如DES,RC4或IDEA)。Alice是知道该
秘密内容的,因为她是生成秘密内容后在发送给Bob的。Bob也知道该秘密内
容,因为他有私有密匙,能对Alice的消息解密。因为他们都知道该秘密内
容,因此他们两都能初始化一种对称加密算法,然后开始用它来加密消息,
并且发送它。下面是修改后的协议:

+---------+---+--------------------------------------------------+
|  A->B   |   | 你好                                             |
|  B->A   |   | Hi,我是Bob,Bob的证书                           |
|  A->B   |   | 请证明                                           |
|  B->A   |   | Alice,我是Bob                                   |
|         |   | { 摘要[Alice,我是Bob] } Bob的私有密匙           |
|  A->B   |   | 好的,Bob。 这是秘密内容 {秘密内容} Bob的公共密匙|
|  B->A   |   | {某些消息}秘密密匙                               |
+---------+---+--------------------------------------------------+

  秘密密匙怎么计算,和所定义的协议有关,不过也有可能只是简单的拷贝
秘密内容。

你说什么?
=========

  Mallet的脑袋瓜里有不少的诡计。尽管Mallet不能得到Alice和Bob交换的
秘密,他能破坏他们的对话。例如,如果Mallet位于Alice和Bob之间,他可
以原封不动的来回传输绝大多数的信息,而只破坏某些消息(这对他来说很
简单——因为他知道Alice和Bob对话的协议):

+---------+---+--------------------------------------------------+
|  A->M   |   | 你好                                             |
|  M->B   |   | 你好                                             |
|  B->M   |   | Hi,我是Bob,Bob的证书                           |
|  M->A   |   | Hi,我是Bob,Bob的证书                           |
|  A->M   |   | 请证明                                           |
|  M->B   |   | 请证明                                           |
|  B->M   |   | Alice,我是Bob                                   |
|         |   | { 摘要[Alice,我是Bob] } Bob的私有密匙           |
|  M->A   |   | Alice,我是Bob                                   |
|         |   | { 摘要[Alice,我是Bob] } Bob的私有密匙           |
|  A->M   |   | 好的,Bob。 这是秘密内容 {秘密内容} Bob的公共密匙|
|  M->B   |   | 好的,Bob。 这是秘密内容 {秘密内容} Bob的公共密匙|
|  B->M   |   | {某些消息}秘密密匙                               |
|  M->A   |   | 生成垃圾信息[ {某些消息}秘密密匙 ]               |
+---------+---+--------------------------------------------------+

  一直到Alice和Bob共享秘密内容之前,Mallet都是原封不动的在他们两者
之间传送数据的。之后,Mallet对Bob的消息产生垃圾信息,然后把它传递
给Alice——从而达到阻挡通讯线路的目的。现在Alice已经相信了Bob,因
此她会相信该垃圾消息并且试图响应它。注意Mallet并不知道秘密内容——
他所能做的一切就是破坏秘密密匙加密的数据。根据协议,Mallet不可能产
生一条有效的消息。另外也许他碰运气做到了。

  为了避免这种情况,Alice和Bob可以把消息认证编码(MAC)引入到他们的
协议当中。所谓MAC,就是根据秘密内容和一些已传输的数据计算得出的数据。
前面介绍的摘要算法正好可以用来建立一个MAC函数以避免Mallet的干扰:

  +---------------------------------------------------+
  |      MAC := 摘要[ 某些消息, 秘密内容 ]           |
  +---------------------------------------------------+

  因为Mallet并不知道该秘密内容,因此他就不能算出正确的摘要值。甚至
当Mallet随机地对消息产生垃圾信息时,如果摘要数据足够大,他成功的机
会是十分渺茫的。比如,通过利用MD5(由RSA发明的一种很优秀的加密摘要
算法),Alice和Bob可以随同消息发送128位的MAC值。Mallet所能猜到正确
的MAC的几率大概是18,446,744,073,709,551,616分之一——从实际的应用来
看,这永远是不可能的。

  下面是再次修改过的协议范例:

+---------+---+-------------------------------------------------+
|  A->B   |   | 你好                                            |
|  B->A   |   | Hi,我是Bob,Bob的证书                          |
|  A->B   |   | 请证明                                          |
|  B->A   |   | Alice,我是Bob                                  |
|         |   | { 摘要[Alice,我是Bob] } Bob的私有密匙          |
|  A->B   |   | 好的,Bob,这是秘密数据 {秘密数据} Bob的公共密匙|
|  B->A   |   | {某些消息,MAC}秘密密匙                          |
+---------+---+-------------------------------------------------+

  现在Mallet有麻烦了。他可以对任何消息产生垃圾信息,但是MAC的计算
将显示出他是个骗子。Alice或Bob都可以发现伪造的MAC值并且停止对话。
Mallet再也欺骗不了Bob了。

这是什么时候说过的?
===================

  最后但不是最微不足道的一件事,就是防御Mallet鹦鹉学舌的行为。如果
Mallet正在对谈话进行“录音”,他也许并不理解,但是他可以重放它们。
事实上,Mallet真的可以在Alice和Bob之间做一些有恶意的事情。解决的办
法是从谈话的双方引入随机的因素。



附:中英术语对照表
certificate     证书
digital signature   数字签名
key         密匙
message         消息(也许译为“讯息”好一些)
private key     私有密匙
public key      公共密匙
sign            签署
subject         主体

--
                                                             skiper

※ 来源:* 泉韵心声 bbs.sdu.edu.cn *[FROM: 202.194.97.74]
--
※ 转寄:* 泉韵心声 bbs.sdu.edu.cn *[FROM: BBS.szu.edu.cn]
--
※ 转载:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.146]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店