利用 Windows CryptoAPI 实现 WPKI 的方法 黄渌郑晓军须文波 摘要 WPKI 1 是一种利用公开密钥技术和数字证书保证无线通信安全的机制 本文介绍了 WPKI 的基本概 念, 智能手机中采用 Windows CryptoAPI 实现 WPKI 的方法, 并重点介绍了采用此方法实现 WPKI 的模块划分和部分类的实现 关键词无线安全 ; WPKI; CryptoAPI; 面向对象 目前, 随着移动通信技术的飞速发展和基础设施的不断完善, 基于移动通信的电子商务也随之兴起 移动电子商务具备许多传统电子商务所不具备的独特优势, 人们可以利用移动手持设备, 在任何时间和地点通过无线网络获取信息, 随时随地进行商品交易和货币支付 然而所有移动电子商务服务都必须建立在一个安全可靠的平台上 解决安全问题必须保证移动电子商务的保密性 完整性 真实性和不可否认性 最简便和高效的方法就是把在因特网上已经得到广泛认同和应用的 PKI(Public Key Infrastructure) 技术移植到无线领域, 形成 WPKI 技术体系 1 WPKI 介绍 PKI 是通过使用公开密钥技术和数字证书来确保系统信息安全并负责验证数字证书持有者身份的一种体系 然而无线通信终端设备, 如手机 PDA 等在计算能力 频宽 内存能力等指标上都远低于有线网络中的计算机,WPKI 体系必须根据以上特点做出适当的补充和合理的优化 比如缩减证书格式 引入 WIM 2 模块 采用数据传输量少的 WAP 3 上网方式, 将加密解密模块植入带有密码运算功能的智能卡等 与 PKI 系统类似,WPKI 系统也大致由认证中心 CA 4 注册中心 RA 5 证书目录数据库和终端实体组成 WPKI 和 PKI 的区别仅在于终端实体用 WAP 手机代替了普通固定联网客户机, RA 功能则由 PKI Portal 替代完成类似功能, 而 WAP 网关则是用于连接无线网络和有线网络的接口 结构和流程如图 1 所示 : 1 Wireless Public Key Infrastructure 2 WAP Identity Module 3 Wireless Application Protocol 4 Certificate Authority 5 Registration Authority
1 移动终端 申请数字证 移动终端 2 RA 接受证书申请, 发往 (RA) 3 CA 颁发 5 RA 将证书数字证书 URL 返回给终 4 CA 将数字证书存入数据证书数据库 Directory 7 与 WAP 网 关之间安全 的 WTLS 会 WAP 网关 8 安全的 SSL/TLS 会 源服务器 ( 银行 证券公司等 ) 6 源服务器获 得证书和撤消 证书信息 图 1 WPKI 体系结构和流程移动终端 : 是具有 WAP 浏览功能的移动设备, 包含 WIM 卡 WIM 卡的目的是将安全功能从手机转移到抗篡改的设备中 这种设备可以是智能卡或者 SIM 卡 WIM 卡有自己的处理器, 可以在卡上的芯片中实现加解密算法和哈希功能 CA: 同 PKI 中的 CA 一样, 主要执行证书颁发 更新 撤消和验证,CA 的核心功能就是颁发和管理数字证书 证书数据库 : 存放证书和证书失效清单 CRL 表 (Certificate revocation list), 以便证书的存取和查询 PKI Portal: 与 WAP 网关一样, 都是运行在有线网络上的服务器 它能执行类似于有线 PKI 中的 RA 功能, 一般作为手机终端和现行 PKI 之间的连接桥梁 它不仅接受直接的 OTA(on the air) 注册, 还能在无线客户设备和有线的服务器中转换 PKI 消息格式 按功能而言可以说是 RA CA 及 OCSP 6 响应端的综合体 WAP 网关 : 用于连接无线和有线网络, 以及实现 WTLS 7 /WAP 和 SSL 8 /HTTP 9 协议间的转化 源服务器 : 向用户提供内容服务 这六部分之间的关系在图 1 中表明 它们构成了 WPKI 体系, 能够为无线用户和服务提供者提供类似于 PKI 的安全服务 2 利用 Windows CryptoAPI 实现 WPKI 智能手机与普通手机不同, 它是手机与 PDA 功能的结合, 带有通用的操作系统 现在主流的智能手机操作系统有基于 Windows CE 的 SmartPhone 2003 Symbain Palm OS 和 Linux 智能手机支持加密算法供应商把加密算法内建在操作系统中, 通过应用程序编程接口便可访问该加密算法 本文主要介绍基于 Windows CE 的 SmartPhone 2003 环境下的内建加密系统 Window CE 操作系统内建了 CryptoAPI V2.0 函数库, 这使得基于 SmartPhone 2003 操作系统的手机实现 WPKI 有了新的方法 CryptoAPI 是一组数目众多的安全函数, 这些安全函数是 Windows 操作系统的一部分 6 Online Certificate Status Protocol 7 Wireless Transport Layer Security protocol 8 Secure Sockets Layer 9 Hyper Text Transfer Protocol
通过 CryptoAPI 提供的服务, 应用程序开发人员可以添加数据加密 / 解密方案 使用数字证书进行身份验证 应用程序开发人员无需了解内部的实现细节, 即可使用 CryptoAPI 中的函数 Microsoft 加密系统包含三个要素 : 操作系统 应用程序和 CSP(Cryptographic Service Provider) 应用程序通过 CryptoAPI 层与操作系统通信, 操作系统则通过加密服务提供者接口 (CryptoSPI 10 ) 与 CSP 通信, 如图 2 所示 应用程序层 应用程序 A 应用程序 B 应用程序 C CryptoAPI 系统层 操作系统 CryptoSPI 服务提供者层 微软 RSA Base Provider CSP #1 智能卡 Service Provider CSP #2 其它合法的 CSP Service Provider CSP #3 密钥库 密钥库 密钥库 图 2 Microsoft Windows 加密系统 CSP 是实现所有加密操作的独立模块, 通常是一个 DLL, 它实现了那些可以通过 CryptoAPI 公共接口访问的密码函数 换句话说 CSP 隐藏封装了密码算法的具体实现, 微软提供了一个基本 CSP 其它商家也可以提供自己的 CSP, 包含他们实现的全部或者部分 CryptoAPI 函数, 有的 CSP 包含了硬件模块 CryptoAPI 提供了如下通用函数 : 基本密码函数, 包括初始化和终止 CSP, 生成 交换和存储密钥的密钥操作函数, 以及对象编码解码 数据加密解密 生成摘要 生成和验证数字签名等函数 证书处理和证书存储函数, 管理证书集合 证书撤消列表和证书信任列表 证书验证函数, 支持证书信任列表 (CTL 11 ) 和证书链的处理, 如将 CTL 放入签名消息和验证证书链中 消息函数处理 PKCS#7 消息, 消息函数的功能包括加密或解密消息及消息数据, 签名消息和消息数据, 还有验证消息签名 辅助函数包括其他不便归类的函数, 有处理证书扩展 比较证书属性以及对象 ID 操作函数等 3 Windows CryptoAPI 实现 WPKI 的模块划分 由于我们采用的是基于 Windows CE 的 SmartPhone 操作系统, 开发语言选择微软提 10 Cryptographic System Program Interface 11 Certificate Trust List
供的 EVC 12 或.Net FrameWork, 所以可以完全用面向对象的开发方法来开发 WPKI 系统 我们 对移动终端部分采用模块化的设计 下面是构成系统的移动终端部分的主要模块划分, 见图 3: 移动终端部分 交互层 逻辑层 通讯层 应用程序模块 界面模块 数据处理模块 通信模块 加密模块 图 3 WPKI 移动终端部分模块划分 WPKI 移动终端部分的结构总共分为三层 : 交互层 逻辑层和通讯层, 每层之间都是相对独立的, 每个模块都可以以类的方式实现, 只对外界提供函数接口, 比如加密模块可以用一个 CMyCrypto 类实现, 下面简单介绍一下各模块的功能 : 界面模块 : 处理和用户的交互, 接受用户输入, 并将结果反馈给用户 应用程序模块 : WPKI 可以保证多种应用的安全, 比如可以保证银行转账 货币支付 证券交易 集团用户无线接入集团数据库等应用的安全, 把这些不同的应用在系统中的实现封装在这个模块中 数据处理模块 : 应用程序模块产生的数据在进入不同的加密系统之前可能要经过一些特殊处理, 这个模块可以完成这些处理 加密模块 : 可以用不同的加密规范实现这一模块 比如 GSS-API V2.0 GCS-API CDSA RSA PKCS#11 Cryptographic Token Interface Standard V2.01 RSA BSAFE API 微软 CryptoAPI V2.0 等, 我们这里采用的是 Windows CE 自带的 CryptoAPI 函数族, 并采用一个 CMyCrypto 对象将其封装 下面是该对象的简单实现 : // crypto.h class CMyCrypto public: CMyCrypto(LPTSTR lppassword, ALG_ID algorithm); // 构造函数 ~CMyCrypto(); BOOL Encrypt(LPBYTE pdata, LPDWORD pdwdatasize, // 加密函数 DWORD dwbuffersize, BOOL bfinal); BOOL Decrypt(LPBYTE pdata, LPDWORD dwdatasize, // 解密函数 BOOL bfinal); 12 embedded Visual C++
private: HCRYPTPROV m_hprov; // CSP 句柄 HCRYPTKEY m_hkey; // 会话密钥句柄 ; //crypto.cpp #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0400 #endif #include <windows.h> #include <wincrypt.h> #include "crypto.h" CMyCrypto::CMyCrypto(LPTSTR pszpassword, ALG_ID algorithm) m_hprov = NULL; m_hkey = NULL; // 取得默认 CSP 的默认容器的句柄 if (CryptAcquireContext(&m_hProv, // 得到的 CSP 句柄 NULL, // 默认容器 MS_DEF_PROV, // 默认 CSP PROV_RSA_FULL,// CSP 类型 0)) HCRYPTHASH hhash; // 产生一个哈希对象的句柄 if (CryptCreateHash(m_hProv, // CSP 句柄 CALG_MD5, // 指定哈希算法 &hhash)) // 哈希对象 // 对密码进行哈希处理 if (CryptHashData(hHash, // 哈希对象的句柄 (LPBYTE)pszPassword,// 指定的密码 lstrlen(pszpassword)*sizeof(tchar),
0)) // 用经过哈希的密码句柄产生会话密钥 CryptDeriveKey(m_hProv, // CSP 句柄 algorithm, // 加密算法 hhash, // 哈希句柄 CRYPT_EXPORTABLE 0x0028000 &m_hkey); // 会话密钥 CryptDestroyHash(hHash); CMyCrypto::~CMyCrypto() if (m_hkey!= NULL) CryptDestroyKey(m_hKey); if (m_hprov!= NULL) CryptReleaseContext(m_hProv, 0); BOOL CMyCrypto::Encrypt(LPBYTE pdata, LPDWORD pdwdatasize, DWORD dwbuffersize, BOOL bfinal) return CryptEncrypt(m_hKey, // 加密密钥句柄 bfinal, // 如果是最后数据块, 则为 True pdata, // 要加密的数据 pdwdatasize, // 数据大小 ( 字节 ) dwbuffersize); // 缓冲区大小 ( 字节 )
BOOL CMyCrypto::Decrypt(LPBYTE pdata, LPDWORD pdwdatasize, BOOL bfinal) return CryptDecrypt(m_hKey, // 解密密钥句柄 bfinal, // 如果是最后数据块, 则为 True pdata, // 需要解密的数据 pdwdatasize); // 数据大小 ( 字节 ) 通信模块 : 封装通信功能, 负责将数据传送给远端服务器, 并接受远端服务器传来的数据 根据不同的承载网络和应用有不同的实现, 无线网应用层的承载方式有 WAP Winsock 等, 如果是 imode 网则还有 chtml 4 总结 本文介绍了一种用 Windows CryptoAPI 实现 WPKI 的方法 使用智能手机中的 CryptoAPI 实现 WPKI 有很多优点, 比如使用通用操作系统, 可以提高系统的可移植性, 用 EVC 或.Net framework 开发可使系统完全采用面向对象的开发方法, 采用 CryptoAPI 函数族可以简化密码函数的实现 随着 3G 4G 技术的不断发展, 基于无线网的应用将迅速增加 智能手机的出现为实现无线安全认证 WPKI 提供了新的方法, 使得 WPKI 的实现有了新的选择 参考文献 [1] Andrew Nash William Duane Celia Joseph Derek Brink. 公钥基础设施 (PKI) 实现和管理电子安全清华大学出版社 2002 年 12 月 [2] 公钥基础设施 PKI 及其应用关振胜 计算机安全 2003 年 02 期 [3] 移动互联网安全加密技术谢胜落 计算机安全 2001 年 04 期 [4] 对电子商务安全控制技术的探讨吴明玮 计算机安全 2002 年 07 期 [5] 无线公开密钥基础设施 (WPKI) 的构建许剑永等 网络安全技术与应用 2003 年 03 期 作者简介 : 黄渌中国科学院计算技术研究所硕士生, 研究方向为无线网络安全 ; 郑晓军中国科学院计算技术研究所研究员 博导, 研究方向为移动通信和无线网络须文波教授 博导, 江南大学信息工程学院, 研究方向为计算机控制与网络安全