假设有如下场景:XML 文件需要在客户端和服务器端进行传输,文件的内容分为两类:敏感信息 ( 如密码,证书内容 ) 和普通信息。客户端和服务器端都可以独立获得应用程序的 USERID 和 PASSWORD。传输方式不限 (SSL 通常建立在 TCP 之上 )。
AES 加密算法数据的安全性跟一个好的密码算法是紧密相连的。一般的,加密算法有两种:对称加密算法和非对称加密算法。前者使用同一个密钥进行加解密,而后者则使用不同的加解密钥。根据我们的场景,客户端和服务器端都可以获得类似的信息,再通过计算可以得到相同的加密密钥,而无需通过不安全的网络进行直接传输,这样入侵者就无法直接利用网络监听来破获加密密钥,所以本文使用对称加密算法。
在过去的 20 多年中,国际上最常用的对称加密算法是数据加密标准 (data encryption standard,DES), 该算法已经被美国国家标准和技术协会 (NIST) 采用。但是,到 2001 年 4 月为止,DES 在许多应用领域中被认为是不安全的,因为它采用的密钥长度为 56 位,许多拥有中等计算资源的计算机就可以用穷尽法搜索出正确的密钥。因此,NIST 采用了另一种新的加密算法来代替 DES,该算法被称为高级加密标准 (advanced encryption standard,AES)。AES 一般具有 128 位的分组长度,密钥长度可分别为 128,192,256 位, 单就安全性而言,AES 的 128 位密钥比 DES 的 56 位密钥强 1021 倍还多。AES 是基于代替 - 置换网络设计的,不管用软 件还是硬件实现都非常高效。AES 算法的具体实现并不是本文的重点,互联网上已经存在了很多用各种语言实现的可用代码。 关于各种对称加密算法的比较分析可以参见参考文献中秦志光教授的《密码算法的现状和发展研究》。
敏感信息的加密方案需要传输的 XML 文件如下,其中包含了敏感信息和普通信息。为了简单易懂,这里敏感信息仅以 password 为例。
清单 1. 需要传输的 XML 内容双击代码全选 123456789 <?xml version="1.0" encoding="UTF-8"?> <app> <!-- non sensitive data--> <userid>USERID</userid> <!-- sensitive data--> <password>PASSW0RD</password> </app>
清单 1是我们需要传输的原始数据。如果直接传输敏感信息,是非常危险的,所以需要采用加密机制。为了在客户端和服务器端达成统一,我们在 xml 文件中需要指定目前双方所采用的加密算法。同时,我们设计这样的加密密钥:其只在一次传输操作中有效,而一旦离开当前会话立即失效。这样保证了密钥的安全,使数据得到进一步保障。经过加密机制处理后,XML 将呈现为如 清单 2所示的形式。其中,SessionID 用于标识本次会话,cipher 属性表示客户端和服务器端一致认可的加密算法。
清单 2. 加密机制处理后的 XML 文件双击代码全选 1234567891011 <?xml version="1.0" encoding="UTF-8"?> <app SessionID="App-001e3751a6e6-00000d34-000000004ba7589e-0"> <!-- non sensitive data--> <userid>USERID</userid> <!-- sensitive data--> <password cipher="aes128">78DFC347E201F24742030E4E03B8A034C83A4F072EA78DF6C6 3A9AF8DF06E57D42D73DC00D3A01773D1AB8A9DBCE759CACC324BD23D141A0CE4F68FA E6332970FD272250014A1C1CC82EB1637487A430</password> </app>
这样,经过加密机制的处理,敏感信息 password 的内容以加密后的形式呈现。 现在开始,将分步介绍本文对敏感信息的加密和解密机制,以了解上述 XML 文件中敏感信息 password 的加密值是如何得到的。主要步骤可分为数据对齐及初步保护,加密算法的密钥选取,加密内容的十六进制字符串呈现,以及相应的解密方法。下面以客户端加密、服务器端解密为例进行说明。因为加密和加密过程在客户端和服务器端是一致的 , 所以逆向加解密,即服务器端加密、客户端解密的过程与此类似。