网上安全支付系统协议全文由三部分组成;第一部分是网上安全支付系统协议,即支付系统协议正文;第二部分是数据结构ASN.1描述,即网上安全支付系统协议附录一;第三部分是安全处理流程,即本附录;
本附录分为五部分: 第一部分是算法描述,第二部分是结构数据的类型,第三部分是结构数据的处理,第四部分是支付消息的处理流程,第五部分是传输协议。
一. 算法描述
1. 哈希算法 (摘要)
h = H(t).
操作流程:输入明文t, 经过Hash函数,产生摘要值h。
建议,在用到哈希值的地方使用sha1算法。
2. 对称加密算法
(1)加密
c = C(k, t)
操作流程:输入明文t, 经过C函数,用密钥k操作,产生密文c。
(2)解密
t = C(k, c)
操作流程:输入密文c, 经过C函数,用密钥k操作,产生明文t。
建议,在用到对称加密的地方使用sdbi算法。
3. 非对称加密算法
(1)加密
c = C(k1, t)
操作流程:输入明文t, 经过C函数,用密钥k1操作,产生密文c。
(2)解密
t = C(k2, c)
解密操作流程:输入密文c, 经过C函数,用密钥k2操作,产生明文t。
注,k1、k2是对应的公钥和私钥,(若k1为公钥则k2为私钥,反之亦然),即用其中的一个加密后,必须用另一个解密。
建议,在用到非对称加密的地方使用RSA算法。
4. 签名算法
s = S (k, h, t)
操作流程:输入明文t, 经过s函数,用密钥k和哈希算法h操作,产生签名s。
注,签名算法是1和3操作的组合,其过程是先用哈希算法对明文进行摘要运算,产生摘要值hv,然后用发送方的私钥对摘要值和哈希标识进行加密,结果是数字签名值。
建议,在用到签名的的地方使用sha1-with-rsa算法。
5. 验证签名算法
b = V (k, h, t, s)
操作流程:输入密文t, 经过v函数,用密钥k对签名值s进行解密,用哈希算法h对明文t进行哈希操作,然后对两个结果进行比较,相等既为验证通过,否则为验证失败。
注,签名算法是4操作的逆向操作。
建议,其验证算法与签名用到的算法是一致的。
二. 结构数据的类型
0.1内容信息结构
ContentInfo ::= SEQUENCE {
type ContentType,
content [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL
}
type说明内容的类型,其值为OBJECT IDENTIFEIR,如为一般数据、签名数据、信封数据、摘要数据、加密数据等。content为对应的数据的值。
0.2算法标识结构
AlgorithmIdentifier ::= SEQUENCE {
algorithm OBJECT IDENTIFIER,
parameters ANY DEFINED BY algorithm OPTIONAL
}
algorithm指定算法类型,如sha1、rsa算法等。parameters是指定的算法所需要的参数,如sha1不需要参数,而des需要参数。
1. 摘要数据结构DigestedData
DigestedData ::= SEQUENCE {
version INTEGER DEFAULT ver(0),
algorithm AlgorithmIdentifier,
contentInfo ContentInfo,
digest Digest
}
version指定结构的版本号,不同的版本号对应的结构可能不同;algorithm指定算法标识,如为sha1、md5等;contentInfo用于指定做摘要的原始数据,原始数据可编进也可以不编进DigestedData中。digest为摘要结果。
2. 签名数据结构SignedData
SignedData ::= SEQUENCE {
version INTEGER DEFAULT v1(1),
digestAlgorithms AlgorithmIdentifiers,
contentInfo ContentInfo,
certificates [0] IMPLICIT Certificates OPTIONAL,
signerInfos SignerInfos
}
version指定版本号,缺省版本号为1;digestAlgorithms指定摘要算法,有可能多个签名者,签名者使用的摘要算法可能不同,它指出使用了几种摘要算法;contentInfo用于指定做签名的原始数据,原始数据可编进也可以不编进SignedData中。certificates包含了要验证签名的证书,用这些证书完全可以验证这些签名,包含的证书可能多于需要的证书,即可能有冗余证书;signerInfos用于指定签名者信息;签名者的信息如下:
SingerInfos ::= SEQUENCE OF SignerInfo
SignerInfo ::= SEQUENCE {
version INTEGER,
issuerAndSerialNumber IssuerAndSerialNumber,
digestAlgorithm AlgorithmIdentifier,
digestEncryptionAlgorithm AlgorithmIdentifier,
encrptedDigest EncryptedDigest
}
version版本号;issuerAndSerialNumber发布机构和证书序列号的DER编码;digestAlgorithm摘要算法,是digestAlgorithms中的一种;digestEncryptionAlgorithm是摘要加密算法,digestAlgorithms和digestEncryptionAlgorithm确定了签名算法;encrptedDigest是签名结果。
3. 数字信封数据结构EnvelopedData
EnvelopedData ::= SEQUENCE {
version INTEGER,
recipientInfo RecipientInfo,
encryptedContentInfo EncryptedContentInfo
}
version版本号;recipientInfo指定接收者的信息;encrypted-ContentInfo指定了被加密的原始数据的结果。
下面说明接收者的信息:
RecipientInfo ::= SEQUENCE {
version INTEGER,
issuerAndSerialNumber IssuerAndSerialNumber,
keyEncryptionAlgorithm AlgorithmIdentifier,
encryptedKey EncryptedKey
}
version版本号;issuerAndSerialNumber发布机构和证书序列号的DER编码;keyEncryptionAlgorithm是秘密密钥加密算法,对应于非对称加密算法中的一种;encryptedKey是加密后的秘密密钥。
下面说明加密内容信息:
EncryptedContentInfo ::= SEQUENCE {
contentType ContentType,
algorithm AlgorithmIdentifier,
encryptedContent [0] IMPLICIT EncryptedContent OPTIONAL
}
contentType指定内容类型;algorithm指定内容加密算法,是对称密钥加密算法,如idea、des和sdbi等;encryptedContent是加密后的原始内容。是用algorithm算法加密后的结果,其加密密钥被加密后存放在接收者的信息结构中。
4. Linkage数据结构
Linkage ::= SEQUENCE {
t1 ANY,
t2 DigestedData
}
t1为任意编码后的数据;t2为某一原始数据的摘要结果。参考1对DigestedData的说明。t1和t2之间建立了一种连接关系,从而为t2的原始数据的完整性的保证提供了一种机制。
5. EncBData数据结构
EncBData ::= SEQUENCE {
enc EnvelopedData,
baggage Baggage
}
enc包含要做数字信封的原始数据,baggage是要携带的附加数据。enc的封装方式与EnvelopedData的制作方式稍微有点差别,它不是将原始数据直接做数字信封,而是将原始数据和baggage数据做Linkage连接后再做数字信封。
6. EX数据结构
EX ::= SEQUENCE {
enc EnvelopedData,
append OCTET STRING
}
enc包含要做数字信封的原始数据,append是要携带的附加数据。EX的封装方式与EncBData的制作方式稍微有点差别, 将原始数据和append的原始数据做Linkage连接后再做数字信封,将append的原始数据用接收方的公钥加密后做为append附在EX结构中。
三. 结构数据的处理
本单元主要说明如何封装和获取`二`中有关的数据。
1. DigestedData的处理
封装操作
(1) 赋版本号version,
(2) 赋算法信息到algorithm
(3) 若需要带原始数据,则将原始数据赋到contentInfo。
(4) 调用摘要算法,将原始数据、摘要算法(对应algorithm)作为参数,其结果即为摘要值,赋给digest。
(5) 调用编码函数,对DigestedData进行编码。
拆包操作
是封装操作的逆操作,先调用解码函数,对DigestedData进行解码,然后依次取数据即可。
2. SignedData的处理
封装操作
(1) 赋版本号version,
(2) 增加摘要算法信息到digestAlgorithms
(3) 若需要带原始数据,则将原始数据赋到contentInfo。
(4) 若需要带证书,则将要携带的证书追加到certificates链中。
(5) 追加签名者信息
(5.1)赋版本号version
(5.2)将签名者证书的发布机构名和证书序列号编码后赋值给issuerAndSerialNumber
(5.3)将摘要算法信息赋值给digestAlgorithm
(5.4)将摘要值的加密算法信息赋值给digestEncryptionAlgorithm
(5.5)计算签名值,将摘要算法(对应digestAlgorithm)、摘要加密算法(对应digestEncryptionAlgorithm)、私钥为参数调用签名函数,其结果即为签名值。将签名值赋值给encrptedDigest。
(6) 若有多个签名者,重复(5)即可。
(7) 调用编码函数,对SignedData进行编码。
拆包操作
拆包操作是封装操作的逆向操作。除了操作步骤相反外,还需要验证证书的有效性。
(1) 调用解码函数,对SignedData进行解码。
(2) 可以获取版本号、摘要算法信息。
(3) 如果存在原始数据,则可获得原始数据。
(4) 如果携带证书,则可暂时缓存证书用于进行下一步的验证。
(5) 对签名者信息进行验证
(5.1)获得版本号version
(5.2)根据签名者证书的发布机构名和序列号issuerAndSerialNumber找出签名者的证书(从本地缓存的证书链中或由第4步骤获得的证书),
(5.3)取出摘要算法信息digestAlgorithm
(5.4)取出摘要值的加密算法信息digestEncryptionAlgorithm
(5.5)从(5.2)获得的证书中获得公钥,验证签名:将原始数据、摘要算法、摘要加密算法、公钥、签名值encrptedDigest调用签名验证函数,其结果即为验证通过或不通过。
(6) 若有多个签名者,重复(5)即可。
(7) 若有一步骤不能通过则认为失败。
3. EnvelopedData的处理
封装操作
(1) 赋版本号version,
(2) 赋值加密内容信息encryptedContentInfo
(2.1) 对内容类型进行赋值contentType,
(2.2) 对对称加密的算法进行赋值algorithm,
(2.3) 产生一随机秘密密钥(对称密钥)mk,调用对称加密函数用密钥mk对原始数据进行加密,如果域encryptedContent存在,加密后的结果赋值给encryptedContent。建议此域存在,否则,加密后的数据如何传送,不做进一步的规定。
(3) 赋值接受者信息recipientInfo
(3.1) 赋版本号version,
(3.2) 将用来做信封的证书的发布机构名和证书序列号编码后赋值给issuerAndSerialNumber
(3.3) 将秘密密钥加密的算法信息赋值给keyEncryptionAlgorithm
(3.4) 从用来做信封的证书中获取公钥,调用非对称加密函数对秘密密钥mk(由2.3产生)进行加密,其结果赋值给encryptedKey。
(4) 调用编码函数,对EnvelopedData进行编码。
拆包操作
拆包操作是封装操作的逆向操作。
(1) 调用解码函数,对EnvelopedData进行解码。
(2) 可以获取版本号version。
(3) 获取接受者信息recipientInfo
(3.1) 获取版本号version,
(3.2) 根据信封的证书的发布机构名和序列号issuerAndSerialNumber获取与证书对应的私钥(用于解数字信封)。
(3.3) 获取秘密密钥加密的算法信息keyEncryptionAlgorithm
(3.4) 根据秘密密钥加密算法,调用非对称加密函数用私钥对秘密密钥的加密值encryptedKey进行解密,其解密结果即为对内容加密的秘密密钥mk。
(4) 解密原始数据encryptedContentInfo。
(4.1)获得内容类型
(4.2)获取对称加密算法信息algorithm
(4.3)取出被加密后的原始数据encryptedContent(如果此项不存在,则必须用其它方法获得),用3.4解密获得的秘密密钥mk,调用对称解密函数对encryptedContent进行解密,结果即为原始数据。
(5) 若有一步骤不能通过则认为失败。
4. Linkage的处理
Linkage的操作不牵扯到加密和解密的操作,它只是DigestedData和编码解码操作的组合。
5. EncBData的处理
对EncBData的处理,是EnvelopedData和编码解码操作的组合。对其中enc的操作和EnvelopedData的处理基本相同,只是对EnvelopedData中原始数据的处理不同:
(1) 封装信封时,将enc中的原始数据t和baggage做依次Linkage操作,操作的结果L(t, baggage)(参见4)作为信封的原始数据。
(2) 拆开信封时,要对enc中的数据做一次Linkage逆向操作,然后要检查其中的摘要数据是否和baggage的摘要数据匹配,若不匹配,则认为是错误的。
6. EX的处理
EX的处理与EncBData的处理步骤基本类似,特别是对enc的处理是一样的,即,
(1) 在做数字信封时,要对enc中的原始数据和append(baggage)做一次Lingage操作,其结果作为信封的原始数据。
(2) 在解数字信封时,要对enc中的数据做一次Linkage逆向操作,然后要检查其中的摘要数据是否和append(baggage)的摘要数据匹配,若不匹配,则认为是错误的。
但它们有一个不同点,
EncBData不对baggage进行任何操作,直接加到编码中,
而,
(1) EX在编码前要对append进行加密,用接受方的公钥对append进行加密,公钥加密的信息与enc中recipientInfo的信息一致。
(2) EX在解码后要对append进行解密,用接受方的私钥对append进行解密,私钥要用到的信息由enc中recipientInfo获取。
7. Enc和Env的处理
Enc和Env是对EnvelopedData的进一步的划分,
(1) 当EnvelopedData中的原始数据是签名操作的结果时,我们称此操作为Enc。
(2) 当EnvelopedData中的原始数据不是签名操作的结果时,我们称此操作为Env。
8. 其它相关操作的处理
(1)双重签名
把要做双签的两部分数据记为t1,t2,假定摘要算法为h,首先调用摘要函数,以h,t1为参数,得到哈希值h1,接着以h,t2为参数,得到哈希值h2,然后以h,(h1|h2)做参数,得到哈希值h3,用签名者的私钥将h3和摘要算法的编码进行加密,即得到双重签名。
说明:
(1) 在本小节中,我们对与原始数据的内容及格式没做具体限制,它可能是任何一种操作的结果。
(2) 为了说明与安全有关的数据的格式,我们对这些数据的封装和处理进行了叙述,从使用的角度来说,它们在应用中表现为一个函数调用,根据参数的不同来完成相应的功能。
四. 支付消息的处理流程
在以上的说明中,我们只是考虑了在支付过程中如何保护原始数据的安全性、完整性和不可篡改性。至于这些消息从哪里来,它们的格式是什么样子没做任何限制。
在此,我们认为在支付体系中,安全处理在支付过程的位置如下图所示:
处理的流程为:
(1) 应用层负责对支付数据进行与业务有关的处理,如验证密码的有效性、指定购买的商品、该付多少钱等;
(2) 然后将信息编码后送安全层进行处理,如做摘要、做签名、做信封等;
(3) 最后由通讯层发往接收方。
接收方的处理流程正好与发送方相反,它先由通讯层接收发送方的数据,然后由安全层进行安全认证处理,最后由应用层处理业务数据。
五. 传输协议
网上安全支付系统协议中没有明确定义具体的传输协议, 建议使用HTTP协议, 基本TCP/IP协议.
1. HTTP协议
HTTP-Header属性Content-Length表示需要发送的支付数据流长度, 即:
Content-Length : ddd
HTTP-Body由支付消息MessageWrapper编码后二进制结果组成.
2. 基本TCP/IP协议
实际传输的数据由两部分组成:
数据头(8 Bytes) 支付数据流(MessageWrapper编码结果)
数据头由8字节组成, 格式为数字字符串(该格式与操作系统无关), 右对齐, 不够时左补空格; 支付数据流是支付消息MessageWrapper编码后二进制结果.
|