没有合适的资源?快使用搜索试试~ 我知道了~
SSL安全协议(中文版),非常详细,值得拜读。 SSL安全协议(中文版),非常详细,值得拜读。 SSL安全协议(中文版),非常详细,值得拜读。
资源推荐
资源详情
资源评论
SSL 协议 Version 3.0 3/4/96
翻译—隋立颖
一 本文件的地位
本文件是一个 Internet 草案。Internet 草案是 Internet 工程特遣组(ITEF)及其领域和工作组的
工作文件。请注意,其他团体也可以发布 Internet 草案。
Internet 草案自公布之日起至多六个月内有效。它可以随时被修改、被替换,或被其他文件所覆
盖。把 Internet 草案作为文献来引用,除说明是“正在进展中的工作”以外,是不合适的。
要 了解 任何一个 Internet 的 当前地位,请查阅 如 下 网址: ds.internic.net ( 美 国 东海岸),
nic.nordu.net(欧洲),ftp.isi.edu(美国东海岸)以及 munnari.oz.au(环太平洋地区)。其中
Internet Drafts Shadow Directories 目录下的 1id-abstract.txt 列表可提供这方面的信息。
二 摘要
本文制定了安全套接层协议第 3.0 版(SSL3.0)规范。SSL 是一个提供 Internet 上的通信隐私
性的安全协议。该协议允许客户端/服务器应用之间进行防窃听、消息篡改及消息伪造的安全的通
讯。
三 简介
制定 SSL 协议的初衷是为通讯双方提供安全可靠的通讯服务,协议包含两个层次:其较低的
SSL 记录层协议位于某一可靠的传输协议(例如 TCP[TCP]协议)之上;SSL 记录层协议用来对其
上层的协议进行封装。握手协议就在这些被封装的上层协议之中,它允许客户端和服务器彼此认
证对方;并且在应用协议发出或收到第一个数据之前协商加密算法和加密密钥。这样作的原因是
保证了应用协议的独立性,使低级协议对高级协议是透明的。
SSL 协议提供的连接安全性具有以下三条属性
连接是安全的。在初始化握手协议协商加密密钥之后传输的消息均为加密的消息。加密
的算法为单钥加密算法(例如 DES[DES], RC4[RC4]等)。
对方的身份是可以通过非对称加密算法-即公钥加密算法(例如 RSA[RSA], DSS[DSS]
等)来验证。
连接是可靠的。所传输的消息均包含一利用签名私钥加密的消息文摘(MAC),以保证消息
的完整性。安全杂凑(hash)函数(例如 SHA, MD5 等)被用来产生消息文摘(MAC)。
1
四 目标
按它们的优先级,SSL 协议 3.0 的目标是
在通讯双方之间利用加密的 SSL 消息建立安全的连接。
互操作性。通讯双方的程序是独立的,即一方可以在不知道对方程序编码的情况下利用 SSL
3.0 成功的交换加密参数。
注意:并不是所有的 SSL 的实例(甚至在同一应用程序内)都可以成功的连接。例如,如果
服务器支持一特定的硬件令牌(token),而客户端不能访问此令牌,则连接不会成功。
可扩展性。SSL 寻求提供一种框架结构,在此框架结构中,在不对协议进行大的修改的情况
下,新的公钥算法和单钥算法可以在必要时被加入。这样做还可以实现两个子目标
1. 避免产生新协议的需要,因而进一步避免了产生新的不足的可能性。
2. 避免了实现一完整的安全协议的需要。
相对的有效性。加密操作,尤其是公钥加密,对 CPU 来说是一种很耗时的事,因此 SSL 协议引入
一可选的对话缓存(CACHE)来减少从头开始的连接的数目。同时,它还注意减少网络的活动。
五 此文档的目的
SSL 协议版本 3.0 详细说明书的主要读者是要实现此协议的人和进行加密分析的人。此详细说
明书主要是为这两类人而写的,所以它时刻注意反映这两类人的需要。因此在本详细说明书中
(而不是写在附录中)以文本方式包含了许多与算法相关的数据结构和规则,使它们易于被访问 。
虽然本详细说明书包含了维护物理安全性所必须的策略,本详细说明书并不想提供关于服务和界
面的定义。
六 描述语言(Presentation language)
本文档主要是描述外部表示(external representation)的数据的格式,所以用到了下列简单、基
础而有点随意的定义的表示语法,这些语法在结构上来自不同的出处。虽然这些语法在结构上有
点象程序设计语言 C、在语法和目标上象 XDR[XDR],但过分的强调这种类似是有害的。本描述语
言的目的仅仅是描述 SSL。
6.1 基本块长(Basic block size)
所有的数据项的表示均是显式说明的,基本数据块的长度为一字节(也就是说 8 比特)多字节
的数据项是由从上至下、从左至右的多个字节连接组成。从字节流的角度来看,一多字节的数据
项(在本例中是一数字)是通过下述公式形成的:
value = (byte[0] << 8*(n-1)) | (byte[1] << 8*(n-2)) | ... | byte[n-1];
2
这种字节的顺序关系是网络中常用的顺序关系即大 endian 格式。
6.2 杂项
注释以“/*”开始,以“*/”结束。
可选的部分是由将其包含进斜体的括号“[ ]”中而指定的。
单字节的包含不可解释的数据的实体的类型为 opaque。
6.3 向量(Vectors)
向量(一维数组)是一同类型的数据元素的流,向量的规模可以在编写文档时说明,也可以留至
运行时才指明;不管在哪一种情况下,向量的规模(即大小)是由向量中字节的个数而不是向量中
元素的个数决定的。
说明一新类型 T’是一固定长度的类型 T 的向量的语法为:
T T'[n];
在这里,T’在数据流中占 n 比特,其中 n 是 T 的所占字节数的倍数。向量中包含数据元素的个数没
有包含在数据流之中。在下例中,Datum 被定义为三个连续的协议无法解释的字节的向量;而
Data 被定义为三个连续的 Datum,一共包含 9 个字节
opaque Datum[3]; /* 三个协议无法解释的字节 */
Datum Data[9]; /* 三个连续的包含三个字节的向量 */
可变长向量可以通过指明合法长度的范围,即形如<最小长度..最大长度>的形式来定义,在编码时,
在字节流中实际长度应在向量的内容之前,此实际长度是以数字的形式存储的,此数字应能表示
此向量的最大长度(ceiling length)。空向量指的是一实际长度为零的向量。
T T'<floor..ceiling>;
在下例中,mandatory 是一必须包含 300 到 400 字节的 opaque 类型数据的向量,它不能是空向量,
其实际长度域占有两个字节,即 uint16,足以表示 400(见 6.4 节),而 longer 最多能表示 800 个
字节,即 400 个 uint16 的数据元素,且<请合法使用软件>可以是空向量。它的编码包含一两字节
的实际长度域。
opaque mandatory<300..400>; /* 长度域为两个字节,不能为空向量 */
uint16 longer<0..800>; /* 零至 400 个 16 比特的无符号整数 */
6.4 数字(Numbers)
基本的数字的数据类型是无符号字节(uint8)。其他所有的大的数字均是由 6.1 节中描述的固定长
度的字节流连接而成,且它们均是无符号的。下列数字类型是预定义的:
uint8 uint16[2];
uint8 uint24[3];
uint8 uint32[4];
uint8 uint64[8];
3
6.5 枚举(Enumerate)
另一类稀疏的数据类型是枚举(enum),枚举类型的数据的取值范围只能是在其定义是声明的
值。每一次定义均定义了一不同的类型。只有相同类型的枚举数据才可以相互赋值和比较,枚举
类型的每个枚举元素均必须象下例中所示的那样,被赋一个值。由于枚举类型这的元素是没有顺
序的,所以它们可以取任意顺序的不同的值。
enum { e
1
(v
1
), e
2
(v
2
), ... , e
n
(v
n
), [(n)] } T
e
;
枚举类型的值在字节流中占据的空间的大小是其定义的取值范围中最大的可能值所占的空间大小 。
下列定义会使类型 Color 占有一个字节。
enum { red(3), blue(5), white(7) } Color;
你还可以通过指定一个无标签的值来强制枚举类型所占的字节数,这样就不需定义一冗余元素了 。
在下例中,类型 Taste 在字节流中占两个字节但只能在 1,2 或 4 中取值。
enum { sweet(1), sour(2), bitter(4), (32000) } Taste;
枚举类型的元素的名字只在定义的类型中是有效的。在第一个例子中,对类型 Color 中的第二个元
素的完全限定引用为 Color.blue。这样的限定当赋值的目标是被说明的时候时是可以忽略的。
Color color = Color.blue; /* 重复说明,但是合法的 */
Color color = blue; /* 正确,类型是隐含的 */
对于元素的值不会转化为外部表示的枚举类型,元素的取值信息是可以省略的。
enum { low, medium, high } Amount;
6.6 结构(Constructed type)
结构类型可以由基本的数据类型方便的建成,每一次说明均声明了一新的、唯一的类型,定义
的语法类似于 C 语言中结构的定义。
struct {
T
1
f
1
;
T
2
f
2
;
...
T
n
f
n
;
} [T];
在一结构中的各域可以象枚举中引用元素时的语法一样用类型名加域名引用,例如 T.f
2
引用的是上
例中的第二个域,结构的定义可以嵌套。
6.6.1 变体结构(Variant)
定义结构时可能根据环境的不同而有不同的变体,选择器必须为枚举类型的数据,以定义结构
中可能的变体,且必须用 case 语句将 select 中声明的每个枚举元素不会起来。变体结构的结构体
可以有一供其引用的标签。在运行时如何决定变体的机制并没有在描述语言中规定。
struct {
T
1
f
1
;
T
2
f
2
;
...
T
n
f
n
;
4
select (E) {
case e
1
: T
e1
;
case e
2
: T
e2
;
....
case e
n
: T
en
;
} [f
v
];
} [T
v
];
例如:
enum { apple, orange } VariantTag;
struct {
uint16 number;
opaque string<0..10>; /* 可变的长度 */
} V1;
struct {
uint32 number;
opaque string[10]; /* 固定的长度 */
} V2;
struct {
select (VariantTag) { /* 变体的选择器是隐含的 */
case apple: V1; /*VariantBody 的定义,标签= apple */
case orange: V2; /*VariantBody 的定义,标签= orange */
} variant_body; /* 可选的变体标签 */
} VariantRecord;
变体结构可以通过在类型前指定选择器的值来限定(narrowed),例如:
orange VariantRecord
是类型 VariantRecord 的一限定,它包含类型为 V2 的 variant_body。
6.7 加密属性(Cryptographic attribute)
数 字 签 名 、 流 加 密 、 块 加 密 和 公 钥 加 密 这 四 项 加 密 操 作 的 加 密 属 性 分 别 为 digitally-
signed,stream-ciphered,block-ciphered 和 public-key-encrypted。对一个域进行何种加密操作
是由在此域的类型说明前的合适的加密属性(关键字)决定的,加密的密钥是由当前对话状态字
隐含给出的(见 7.1 节)。
在数字签名中,输入为一单向哈希函数(one-way hash function)。当用 RSA 算法进行签名
时,用签名私钥对一 36 字节的结构进行签名,此 36 字节的结构是由两个哈希函数生成的,一个
为 SHA,另一个是 MD5。当用 DSS 算法进行签名时,可以直接对由 SHA 哈希函数生成的 20 字
节的结构进行签名。
在流加密中,明文的长度与由密钥产生的密文的长度是相同的。此密钥是由伪随机数发生器生
成的安全的密钥,是根据时间的变化而变化的。
5
剩余38页未读,继续阅读
资源评论
alertHello
- 粉丝: 1
- 资源: 30
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功