开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第32天,点击查看活动详情
S/MIME安全服务
- 基于RSA密码体制,在MIME框架下对电子邮件安全进行提升
- 对MIME消息主体进行加密、签名
- 数字签名 当产生MD时,发送方代理和接受方代理都必须支持SHA-1算法。为了兼容以前版本S/MIME,接收方代理还应支持MD5.当产生数字签名时,发送方代理和接收方代理都必须支持DSS算法,且该算法不带任何参数。同样,为了兼容以前版本的S/MIME,接收方代理和发送方代理都应支持RSA,能够使用户用私钥对所发消息签名。
DSS签名标准
- DSS是NIST提出的一个基于ELGamal的数值签名算法,该算法本来称为DSA(Digital Signature Algorithm,数字签名算法),于1994年12月1日被正式采用为美国联邦信息处理标准,故称DSS(Digital Signature Standard)。
- 签名计算能力较低且计算时间短。
- DSS安全性表现: 对报文的签名不会引起密钥的泄露 若不知系统的私钥S,无人能够对给定的报文产生签名; 无人能够产生匹配给定签名的报文 无人能够修改报文而还使原来的签名有效。
DSS算法
- 选择p与q. q是160位质数,p是512位质数。且p=kq+1
- 产生g(公开的信息)。寻找整数g,使得gq=1 mod p.
- 选择长期使用的公开/私钥对<T,S> 随机选取S<q; 令T=gs mod p.
- 选择每个报文使用的公开/私钥密钥对<Tm,Sm> 随机选取Sm < q; 计算 Tm =((gSm mod p) mod q) 计算Sm-1 mod q
- 计算报文的信息摘录dm(SHA-1 160位长)
- 计算报文的签名 X= Sm-1(dm+STm) mod q
- 向接收方传送报文m、Tm和X
- 验证签名 计算模q下的签名逆元X-1 计算dm 计算x= dmX-1 mod q 计算y= TmX-1 mod q 计算z= (gx * Ty mod p) mod q 若 z= Tm, 则签名得到确认 签名方知道S和T,验证方只知道T.每次签名时动态产生Sm和Tm,并将Tm通知验证方. 在密钥生成方面,DSS(160/512)比RSA(512/1024)快,在签名验证上RSA要比DSS快100倍.
DSS缺陷
- DSS标准不能用于加密。DSS不是一个双射函数,不能用于加密与密钥分配。
- DSS算法的速度比RSA算法慢,其签名产生约慢40%,签名验证约慢100倍
- DSS算法的密钥长度太短。由于算法安全性来自于计算模数的离散对数的困难性,而在有些域内计算离散对数的问题已有较大进展,所以NIST把最大模数长度番了一倍。
MIME保密性
当对会话密钥进行加密时,发送方代理和接收方代理都必须支持DH。接收方代理应当支持RSA解密这样就能够使用私钥解密收到的消息以获取会话密钥,同时从兼容性考虑,发送方代理也应当支持RSA加密。当对消息内容进行加密时,发送方代理和接收方代理都必须支持三重DES加解密。
S/MIME消息
S/MIME的消息是由MIME实体和CMS(加密消息语法)对象组合而成,其中使用了一些MIME类型和CMS对象。一个重要的类型为application/pkcs7-mime,它用来封装加密和签名所使用的CMS对象,以保证MIME实体的安全性。 首先需要保护的数据通常根据MIME进行规范化。而其他的一些信息,如证书、算法标识符等则用于产生CMS对象。最后CMS对象也用MIME结构进行封装。
规范化三个描述性步骤:
- 根据本地格式准备MIME实体消息
- 将MIME实体的每一部分转换为规范的形式
- 对MIME实体的每一部分使用合适的传输编码 接收到S/MIME消息后,对其中的安全内容进行处理就可以得到封装后的MIME实体,然后再由能够处理MIME结构的程序作进一步解析,最后得到原始数据。
加密消息.使用S/MIME加密消息的步骤如下:
- 根据MIME规范准备要加密的MIME实体
- 用MIME实体和其它必须的信息产生类型为envelopedData的CMS对象,另外为每个接收方产生加密的会话密钥副本,并一起放入该CMS对象中。
- 将此CMS对象封装在类型为application/pkcs7-mime的MIME实体中,该类型中的smime-type参数的值为enveloped-data,消息文件的扩展名为.p7m.
签名信息 S/MIME为消息签名定义了两种格式:一种使用application/pkcs7-mime类型的SignedData,另外一种是Multipart/signed。发送消息时,通常使用后一种,但接收消息时,接收方代理应当支持全部两种格式。 对于使用SignedData格式进行签名的信息,如果接收方不支持S/MIME,则不能查看原始消息。只有当接收方具备S/MIME功能的时候,才能查看并验证消息。使用该格式对消息进行签名的步骤:
根据MIME规范准备要签名的MIME实体 用MIME实体和其他必需的信息产生类型为SignedData的CMS对象 将此CMS对象封装在类型为application/pkcs7-mime的MIME实体中,该类型中smime-type参数值为Signed-data,消息文件扩展名为.p7m
对于使用multipart/Signed格式进行签名的信息,无论接收方是否支持S/MIME,原始消息均能够被查看。这种格式包括两个部分:第一部分是用于签名的MIME实体,第二部分为数字签名。使用该格式对消息进行签名的步骤:
- 根据MIME规范准备要签名的MIME实体
- 用MIME实体产生类型为SignnedData的CMS对象,该对象不包括涉及信息内容的部分
- 将MIME实体放入multipart/signed的第一部分中;
- 对第(2)步中signedData类型的CMS对象(签名)进行编码,并将其封装在类型为
- application/pkcs7-signature的MIME实体中。
- 将类型为application/pkcs7-signature 的MIME实体放入multipart/signed 的第二部分中。
multipart/signed类型必须有两个参数:protocol和micalg.其中protocol参数的值必须为application/pkcs7-signature,micalg参数的值为消息完整性验证中所使用的摘要算法。如果使用了多个摘要算法,则这些值必须以逗号分隔的形式逐一给出。
加密和签名
S/MIME实现者必须能够处理任意层次嵌套的消息格式 先加密而后签名,接收者能够验证加密块是否被修改,但是不能够确定原始信息是否由签名者所发。 先签名后加密,接收者能够确定原始信息是否被修改,但却不能保证加密块的不被修改。
S/MIME证书处理过程
-
S/MIME使用的公钥证书与X.509 V3一致
-
S/MIME使用的密管理模式是严格的X.509证书层次结构和PGP的基于WEB信任方式的一种混合方式。
-
S/MIME管理者and/or配置每个客户端的信任密钥表和证书撤销表。签名的验证以及签名工作都是通过本地维护证书实现的。
-
用户代理职责:
- 密钥生成: 生成单独的DH、DSS密钥对,且应该能够生成RSA密钥对(密钥长度768-1024)
- 注册: 用户公钥必须到认证机构注册
- 证书存储和检索 用户访问本地的证书列表,以完成签名及签名验证工作。
增强的安全性服务
互联网草案中提出了三种增强的安全性服务: 签收(Signed receipt):对SignedData对象要求进行签收。接收方将对整个原始消息和发送方的原始签名进行签名,并将此签名与消息一起形成新的S/MIME消息。 安全标签(Security label):在SignedData对象中可以包括安全标签。安全标签是描述S/MIME封装信息敏感度的安全信息集合。可用于访问控制,还可以描述优先级(秘密、机密、受限等)或基础角色,即哪些人可以查看信息。 安全邮件列表(Security mailing list)。用户可以通过邮件列表代理(MLA)向多个接收方发送消息。MLA对一个输入消息为各接收方进行相应的加密处理,而后自动发送消息。