总体来说,MIME消息由消息头和消息体两大部分组成。现在我们关注的是MIME邮件,因此在以下的讨论中姑且称“消息”为“邮件”。在上面的例子中,例1的1-6行,例2的1—8行,例3的1-18行,是邮件头;例1的8—9行,例2的10—82行,例3的20—3128行,是邮件体。邮件头与邮件体之间以空行进行分隔,如例1的第7行,例2的第9行,例3的第19行。邮件头中不允许出现空行。有一些邮件不能被邮件客户端软件识别,显示的是原始码,就是因为首行是空行。
邮件头包含了发件人、收件人、主题、时间、MIME版本、邮件内容的类型等重要信息。每条信息称为一个域,由域名后加“: ”和信息内容构成,可以是一行,较长的也可以占用多行。域的首行必须“顶头”写,即左边不能有空白字符(空格和制表符);续行则必须以空白字符打头,且第一个空白字符不是信息本身固有的,解码时要过滤掉。如例2的7-8行,例3的4-5行,13-14行,分别属于一个域。
邮件体包含邮件的内容,它的类型由邮件头的“Content-Type”域指出。常见的简单类型有text/plain(纯文本)和text/html(超文本)。
例2和例3中出现的multipart类型,是MIME邮件的精髓。邮件体被分为多个段,每个段又包含段头和段体两部分,这两部分之间也以空行分隔。常见的multipart类型有三种:multipart/mixed, multipart/related和multipart/alternative。从它们的名称,不难推知这些类型各自的含义和用处。它们之间的层次关系可归纳为下图所示:
+------------------------- multipart/mixed ----------------------------+
| |
| +----------------- multipart/related ------------------+ |
| | | |
| | +----- multipart/alternative ------+ +----------+ | +------+ |
| | | | | 内嵌资源 | | | 附件 | |
| | | +------------+ +------------+ | +----------+ | +------+ |
| | | | 纯文本正文 | | 超文本正文 | | | |
| | | +------------+ +------------+ | +----------+ | +------+ |
| | | | | 内嵌资源 | | | 附件 | |
| | +----------------------------------+ +----------+ | +------+ |
| | | |
| +------------------------------------------------------+ |
| |
+----------------------------------------------------------------------+
可以看出,如果在邮件中要添加附件,必须定义multipart/mixed段;如果存在内嵌资源,至少要定义multipart/related段;如果纯文本与超文本共存,至少要定义multipart/alternative段。什么是“至少”?举个例子说,如果只有纯文本与超文本正文,那么在邮件头中将类型扩大化,定义为multipart/related,甚至multipart/mixed,都是允许的。
multipart诸类型的共同特征是,在段头指定“boundary”参数字符串,段体内的每个子段以此串定界。所有的子段都以“--”+boundary行开始,父段则以“--”+boundary+“--”行结束。段与段之间也以空行分隔。在邮件体是multipart类型的情况下,邮件体的开始部分(第一个“--”+boundary行之前)可以有一些附加的文本行,相当于注释,解码时应忽略。段间也可以有一些附加的文本行,不会显示出来,如果有兴趣,不妨验证一下。
结合boundary定界和multipart层次关系图,我们分析一下例2和例3的邮件体层次与段嵌套关系。
在例2中,10-12行是附加文本行,13-82行是multipart/alternative型的段,包含两个子段:13-30行是纯文本正文,32-79行是超文本正文。
在例3中,20-21行是附加文本行,22-3127行是multipart/mixed型的段,包含3个子段:22-171行是multipart/related段,173-1688行与1690-3125行是两个附件。multipart/related段又包含两个子段:27-61行是multipart/alternative段,63-169行是一个内嵌资源(图片)。multipart/alternative段又包含两个子段:31-48行是纯文本正文,40-59行是超文本正文。
例1只有纯文本正文,实际上属于multipart层次关系图中的一个特殊情况。如果非要避简就繁,写成下面的形式,也是完全符合MIME精神的。
Date: Thu, 18 Apr 2002 09:32:45 +0800
From: <bhw98@sina.com>
To: <bhwang@jlonline.com>
Subject: Test
Mime-Version: 1.0
Content-Type: multipart/alternative; boundary="{[(^_^)]}"
--{[(^_^)]}
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
This is a simple mail.
--{[(^_^)]}--
总体来说,MIME消息由消息头和消息体两大部分组成。现在我们关注的是MIME邮件,因此在以下的讨论中姑且称“消息”为“邮件”。在上面的例子中,例1的1-6行,例2的1—8行,例3的1-18行,是邮件头;例1的8—9行,例2的10—82行,例3的20—3128行,是邮件体。邮件头与
6.1 PGP
PGP是美国菲利普·齐默曼(Philip R. Zimmermann)提出来的。他创造性地把RSA公钥体系的方便和传统加密体系的高速度结合起来,并且在数字签名和密钥认证管理机制上进行巧妙的设计,从而使PGP成为流行的公钥加密软件包。PGP是一个基于RSA公钥加密体系的邮件加密软件,可以用于邮件保密,防止非授权者阅读,还能对邮件加上数字签名,从而使收信人可以确信邮件是谁发来的。它让用户可以安全地和用户从未见过的人通信,事先并不需要任何保密的渠道来传递密钥。
PGP加密由一系列散列、数据压缩、对称密钥加密,以及公钥加密的算法组合而成。每个步骤支持几种算法,可以选择其
中
一种使用。基本上包含了4个密码单元:单钥密码IDEA、双钥密码RSA、单向散列算法MD5、一个随机数生成算法。这些密码单元在本书第2章
中
都有相关介绍。
需要注意的是,随机数生成是指PGP提供两个伪随机数发生器(PRNG):一个是ANSI X9.17发生器,采用IDEA算法,以CFB(密码反馈模式)生成;另一个是从用户击键的时间和序列
中
计算熵值,从而引入随机性。
PGP在安全上的业务有:认证、加密、压缩、Base-64变换、分段和重组。
6.2 S/
MIME
6.3 Secure Shell
6.4 SFTP
MIME
Multipart
类型
MIME
邮件
中
各种不同类型的内容是分段存储的,各个段的排列方式、位置信息都通过Content-Type域的
multipart
类型来定义。
multipart
类型主要有三种子类型:
mixed
、alternative、related。
(1)
MIME
Multipart
类型基本格式
●
MIME
Multipart
(‘
mixed
’)类型
如果一封邮件
中
含有附件,那邮件的...