网络传输中 XML 敏感信息的加密
2010-10-22 17:18:25 来源:WEB开发网这样,经过加密机制的处理,敏感信息 password 的内容以加密后的形式呈现。 现在开始,将分步介绍本文对敏感信息的加密和解密机制,以了解上述 XML 文件中敏感信息 password 的加密值是如何得到的。主要步骤可分为数据对齐及初步保护,加密算法的密钥选取,加密内容的十六进制字符串呈现,以及相应的解密方法。下面以客户端加密、服务器端解密为例进行说明。因为加密和加密过程在客户端和服务器端是一致的 , 所以逆向加解密,即服务器端加密、客户端解密的过程与此类似。
加密过程
Step 1.1. 敏感信息的 Pack 操作,对齐字节并对数据进行初步保护
因为 AES 算法是一种分组算法,而且每个分组必须是 32 位的整数倍,并且最小值为 128 位,我们需要对加密的数据进行 数据对齐,这里采用 16 字节即 128 位对齐。并且,为了保证数据的完整性,对数据加入头部和尾部,其中头部和尾部都有 标识符来表征数据的完整性。以上整个过程我们称之为 Pack 操作。
一旦该数据被意外截断,就可以通过头尾部检测到,无论发送方还是接收方都会丢弃此类数据,以保证系统安全。以下是 Pack 操作的具体步骤:
读取用户提供的需要加密的内容,对 password 的实际值 PASSWORD 进行 Pack 操作,使用到的数据结构参见 清单 3中的示例。数据在 Pack 操作后呈现的结构如 图 1所示:
清单 3. 头部结构的定义
struct DataHeader {
#pragma pack(push, 1) // 使结构体 1 字节对齐
UINT32 canary1; // 标识,用于检测数据是否截断,设置值为 (0xDEADC0DE)
UINT8 version; // 头部版本(以 0 开始)
UINT8 reserved1; // 保留位
UINT16 offset; // 从开始到有效负载数据的偏移量(头部长度)
UINT32 size; // 有效负载数据的长度
UINT16 reserved2; // 保留位
UINT8 reserved3; // 保留位 .
UINT8 UIDsize; // UID 的长度
#pragma pack(pop)
} header;
// 备注 : 接下来的两个字段可以根据实际需要设置
// 文件的其余部分结构如下设置
// char[] UID; // UID 指每次会话的 SessionID(不含结尾的 NULL 符)
// UINT8[] payload; // 需要传输的数据,即有效负载数据
// UINT32 canary2; // 标识,用于检测数据是否截断,设置值为 (0xDEADC0DE)
更多精彩
赞助商链接