网络传输中 XML 敏感信息的加密
2010-10-22 17:18:25 来源:WEB开发网这样的转化是可逆的。
敏感信息的解密方案
解密过程
由于对称加密算法的特性,解密过程基本上就是加密的逆过程。
Step 2.1 把加密后十六进制字符串形式转换为二进制形式
按照加密部分 Step 1.3 介绍的转换方法,我们就可以把需要解密的十六进制字符串值逆向转换到十六进制值。
Step 2.2 使用 AES 算法进行解密
同样的,跟 AES 的加密过程一样,在服务器端本身就保存着该用户的用户密码,并且可以获得客户端以明文形式传送过来的随机字符串即 SessionID, 由 此便可以以同样的 HMAC 计算方式得到 AES 算法的加密密钥。调用 AES 算法的标准解密过程便可以得到解密后的数据。
Step 2.3 对解密后的数据进行去头操作
解密后的数据还包含我们附加的头部结构,所以我们需要 unPack 操作,以便得到原始数据。具体操作如 清单 8所示。
清单 8. 对解密后的数据进行 unPack
// 获得解密后,数据体的头部结构 DataHeader header
// 从网络序转换到主机序
header.canary1 = ntohl(header.canary1);
header.offset = ntohs(header.offset);
header.size = ntohl(header.size);
canary2 = ntohl(canary2);
const UINT32 canary_constant = 0xDEADC0DE;
// 验证识别码和头部版本
if((header.canary1 != canary_constant) || (canary2 != canary_constant)){
// 标识位错误,直接丢弃或报错
LOG << "Header is invalid." << endl;
return;
}
if(header.version != 0){
// 检测版本,如果不是相应版本也做丢弃处理
LOG<< "Unrecognized header version : " << (unsigned) header.version << endl;
return;
}
// 验证 UID( 即随机字符串 ), 若不一致则报错
UINT32 UID_offset = sizeof(header);
UINT32 payload_offset = UID_offset + header.UIDsize;
UID.assign(data.begin()+UID_offset, data.begin()+payload_offset);
if (UID != SessionID){
LOG << "UID did not match the SessionID." << endl;
return;
}
// 抽取原始数据
UINT32 payload_end_offset = payload_offset + header.size;
payload.assign(data.begin()+payload_offset, data.begin()+payload_end_offset);
unPack 之后,我们得到的 payload 内容就是本次传输过程中真正的负载数据值。
小结
本文没有采用成本较高而且较复杂的 SSL (Secure Sockets Layer ) 协议进行加密通讯,而是介绍了一套针对敏感信息的加密机制,对数据进行了多重 安全考量。其中包括对数据的 Pack 操作保证数据的完整性;结合利用会话随机字符串 SessionID 和用户密码 password 的 HMAC 值做为加密算法的密钥大大增强了加密过程的安全性;利用目前最好的对称加密算法 AES 保证了加密数 据本身的安全性,三重保护为敏感数据提供了一个强大的安全保障。而且经实践证明,本方法性能良好。
更多精彩
赞助商链接