最近,参与了一个涉及希腊、塞浦路斯和罗马尼亚证券交易所(www.greekmarkets.com, http://reporter.fasma.ro)的金融项目。该项目主要使用ASP和VB COM进行编码,并在SQL数据库之上使用少量ATL组件作为中间层。编写的中间层组件是使用ATL构建的,并使用了Crypto API。这个组件的目的是为HTTP提供加密数据,这些数据对ASP页面非常有用。由于HTTP传输,数据以十六进制格式编码。
首先,将向展示如何使用ATL控件以及如何提供方法来查询组件。
创建一个新的ATL COM AppWizard项目。在服务器类型中选择动态链接库(DLL),并勾选支持MFC和MTS。向类中添加一个新的ATL对象。从ATL对象向导中选择对象->简单对象。在属性标签页中选择线程模型的Free选项。
现在有一个非常好的组件。更重要的是通过方法或属性向其他程序提供数据。不幸的是,微软的向导有点不足,用户必须手动输入每个参数及其类型。
使用加密API并加密消息的最简单方法是:
CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0);
CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash);
CryptHashData(hHash, (BYTE *)szLocalPassword, dwLength, 0);
CryptDeriveKey(hProv, CALG_RC4, hHash, CRYPT_EXPORTABLE, &hKey);
CryptEncrypt(hKey, 0, TRUE, 0, pbBuffer, &dwLength, dwLength);
HtoA(dest, szPassword, sizeof(TCHAR)*_tcslen(dest));
在ASP页面中使用该组件(在Visual Basic、Access或Microsoft SQL中相同)非常简单:
dim myOEncrypt
dim src, dest
set myOEncrypt = Server.CreateObject("EncryptionATL.Encryption.1")
src = "CryptoAPI"
Response.Write "src: " & src
Response.Write "Crypt: "
dest = myOEncrypt.Crypt(src)
Response.Write dest
Response.Write "LastError: " & myOEncrypt.LastError
Response.Write "Decrypt: "
src = myOEncrypt.Decrypt(dest)
Response.Write src
Response.Write "LastError: " & myOEncrypt.LastError
set myOEncrypt = nothing
安装:将DLL复制到具有系统执行权限的目录,并使用regsvr32命令注册,或者将其放在MTS上。这种方式更好,因为如果想要修改组件并再次注册,这是可能的,而无需重启计算机 - 就像使用regsvr32命令那样会"阻塞"dll文件。
打开MTS控制台(如果使用的是NT4)或组件服务(Windows 2000)。在计算机->电脑->COM+应用程序中选择NewApplication。给它起一个名字,例如"Crypt";在新的Crypt COM+应用程序中创建一个新组件,并选择加密dll文件。