使用 WebSphere Message Broker 集成安全的 ATM 银行系统

银行 ATM 卡数据需要极高的安全性,并且需要使用特殊的安全设备和软件协议进行处理。本文向您展示了如何通过集成两个众所周知的安全系统(主机安全模块 (HSM) 和 IST/Switch),使用 WebSphere Message Broker 来处理安全的银行 ATM 卡数据。

Hesham Soultan 博士, IT 架构师,开罗技术开发中心, IBM

Hesham Soultan 博士的照片Hesham Soultan 博士是埃及开罗技术开发中心的 IT 架构师。他的开发专业知识包括汽车嵌入式软件、机器视觉、机器学习和业务集成。加入 IBM Business Integration 团队后,他从事过 WebSphere DataPower、WebSphere Message Broker 和 WebSphere MQ 方面的工作。



2012 年 7 月 23 日

免费下载:IBM® WebSphere® Message Broker 试用版
下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。

简介

银行 ATM 借方交易是任何需要客户输入个人识别码 (PIN) 的交易。为了安全起见,在开始任何卡或事务身份验证过程之前,ATM 服务器通常要求通过双级别加密过程对 PIN 代码进行加密。加密过程通常由一个安全设备来完成。在本文中,使用了 IST/Switch 作为 ATM 系统,并使用一个主机安全模块 (HSM) 设备作为加密设备。

HSM 通常为实现密钥管理、PIN 管理与验证以及消息验证码 (MAC) 处理提供了各种功能。在基础应用程序中,IBM® WebSphere® Message Broker(后面简称为 Message Broker)调用了两个 HSM 命令来加密 PIN,并生成一个 16 数位的 PIN 块。然后再将此 PIN 块用作运行于 ATM 系统之上的任何借记过程的输入。图 1 显示了面向安全的 ATM 系统的集成架构:

图 1. 面向安全的 ATM 系统的集成架构
面向安全的 ATM 系统的集成架构

第 1 部分 “集成 HSM” 向您展示了如何使用 HSM Appliance 来集成 Message Broker,并描述了处理 HSM 时的一些问题与建议。第 2 部分 “集成 IST/Switch” 描述了 ATM 系统 (IST/Switch) 的集成,并提供了一些故障排除信息。

1. 集成 HSM

本文中使用的 HSM 设备是 Thales HSM 8000。通常,HSM 充当一个主计的外围设备,并在代表主机的物理安全环境中执行加密处理。处理过程由 HSM 执行,是为了响应其通过 TCP/IP 连接而接收的命令。在这个场景中,HSM 设备用来执行 PIN 加密。

这一小节向您展示了如何与设备进行通信,从而运行 Message Broker 内部的命令。您需要运行两条命令来获取一个 16 个十六进制数字组成的加密 PIN 块,该数字在两个步骤中使用了一个 4 个数字组成的明文 PIN 代码。图 2 显示了调用单个 HSM 命令的 Message Broker 子流程 (subflow):

图 2. 用于执行 HSM 命令的 Message Broker 子流程
用于执行 HSM 命令的 Message Broker 子流程

流程中的第一个计算节点准备了 HSM 命令请求消息,并将其格式化为某种 BLOB 类型的位流格式,以便将该格式输出到 HSM 节点的 TCPIP Client Output 中。下列清单 1 显示了请求消息的表达式的嵌入式 SQL (ESQL) 语句:

清单 1. 第一个 HSM 命令的请求代码
CREATE LASTCHILD OF OutputLocalEnvironment DOMAIN('MRM'); 
SET OutputLocalEnvironment.MRM.MsgLength = X'0017'; --23 chars Length
SET OutputLocalEnvironment.MRM.HSMMessageHeader = SUBSTRING(rEnv.MsgUId FROM 1 FOR 4);
SET OutputLocalEnvironment.MRM.HSMCommandCode = 'BA';
SET OutputLocalEnvironment.MRM.HSMInputPIN = rEnv.CardPIN;

DECLARE Len INT LENGTH(rEnv.CardNum);
-- <<<<<<<< Take the 12 digits before rightmost digit (the check digit) >>>>>>>>>>>
SET OutputLocalEnvironment.MRM.HSMAccountNum = 
    SUBSTRING(rEnv.CardNum From(Len - 12) FOR 12); 

SET BlobBitstream = ASBITSTREAM(OutputLocalEnvironment.MRM 
    OPTIONS options 
    SET 'ISO_ATM_HSM_MsgSt'
    TYPE 'HSMMessage_Request1'
    FORMAT 'Text1');

如上面所示,该命令使用了代码 BA,该代码相当于 Encrypt a Clear PIN 命令。该命令代码后的第一个参数是明文 PIN,它是向左对齐的,并对加密的 PIN 长度使用了十六进制 F。第二个参数是帐号或卡号的最右边的 12 位数字,不包括校验码(最右边的数字)。

清单 1 中的最后一个语句在将要发送到 HSM 的最后一个格式化命令中生成了请求消息。该语句包含命令消息的位流。此位流的生成使长度能够以二进制十六进制的格式保留(第一个消息元素),而其他一些消息元素则位于字符的 ASCII 代码中 (CCSID 1208)。

对于此场景,您必须在消息集中创建一个数据模型,依次处理数据类型、数据长度和消息元素的填充。MRM 解析器用来以物理文本格式生成一个定长消息。

此命令的响应消息的长度因成功或失败状态的不同而有所不同,所以 Message Broker 分两步来读取该消息。在第一步中,Message Broker 只读取包含消息的十六进制长度的前四个字符。然后 Get Length 计算节点会在适当的环境变量中设置此长度,从而动态定义由第二个 TCP/IP Client Input 节点 ReceiveFromHSM2 读取的记录的长度。关于如何对接收 TCP/IP 节点的可变长度进行编程的详细信息,以及有关处理 TCP/IP 连接和 ISO 8583 的信息,请参阅 developerWorks 文章 Integrating with TCP/IP using WebSphere Message Broker

最后,可以根据消息集中的数据模型,使用 PARSE 函数来读取和解析记录,如清单 2 中所示:

清单 2:解析 HSM 响应
CREATE LASTCHILD OF Environment.Variables.CIB.HSMResponse DOMAIN('MRM')
    PARSE(InMessageBlob 	
    SET 'ISO_ATM_HSM_MsgSt'
    TYPE Environment.Variables.CIB.HSMResponseMsgName
    FORMAT 'Text1');

该命令的结果是一个由五个字符组成的加密的 PIN,它使用了四位数字的输入,您可以将这个加密的 PIN 用作第二个命令的输入。您可以使用 JG 的命令代码运行第二个命令,运行方式与第一个命令相同。该命令返回了一个 16 进制字符的加密 PIN 块,IST/Switch 的请求消息中会用到它。

处理 HSM 时的问题和建议

以下是一个开发团队在集成 HSM 时会遇到的一些问题:

  • 在安装 HSM 时会定义许多参数,因此您应当从 HSM 所有者处获得这些参数,以便在开发期间使用它们。例如,在几乎所有的命令中,加密 PIN 的长度和消息头的长度都是两个关键的参数,而且 HSM 所有者在安装 HSM 时定义了这两个参数。
  • 文档中没有明确提及部分请求和响应消息的格式,还需花费很长的时间甚至是采用试错法来检测这些格式。
  • 例如,消息的关键部分之一就是消息的长度和格式。在任何配套源代码 (supporting source) 中,关于消息元素的信息都是不明确的。据调查结果显示,除了知道此元素是否存在之外,用户还可以知道该元素的长度是二进制十六进制格式中的两个字节,而且那两个字节是通过 TCP/IPF 以十六进制二进制格式发送的,而不是像其他参数一样以 ASCII 编码字符的形式发送的。

2. 集成 IST/Switch

来自 eFunds Canada Corporation 的 IST/Switch 是一个系统,它支持实现 Electronic Funds Transfer / Point of Sale (EFT/POS) 网络所需的大多数事务。有关 IST/Switch 的更多信息,请参阅 EFunds OASIS Host Formatter Subsystem Guide。IST/Switch 使用 ISO 8583 标准通过 TCP/IP 与主机进行通信。关于 ISO 8583 以及使用 Message Broker 实现此类 TCP/IP 通信的更多信息,请参阅 developerWorks 文章 Integrating with TCP/IP using WebSphere Message Broker

ISO 8583 标准定义了多个消息类,这些消息类确定了正被请求的事务类型。在本文中,使用了一个金融消息类,该消息的 Message Type Identifier (MTI) 值为 0200。该消息请求用于请求一个事务的金融授权。0210 消息是 0200 消息的响应消息的 MTI。下方的图 3 显示了为整个金融事务授权过程而开发的 Message Broker 流程。该流程两次调用了 HSM 子流程来运行两个加密命令,然后利用此结果为 IST/switch ISO 8583 请求消息做准备:

图 3. 金融授权流程
金融授权流程
清单 3. 创建 IST/Switch ISO 8583 请求消息的 ESQL 代码
CREATE LASTCHILD OF OutputLocalEnvironment DOMAIN('MRM'); 
--<<<<<Generating the binary bitmap using the element number list. >>>>>>>
DECLARE Items ROW ;
CREATE LASTCHILD OF Items NAME 'a';
SET Items.a[] = LIST{3,4, 7, 11, 12, 13, 18, 22, 35, 37, 41, 43, 49, 52}; 
DECLARE MessageLength CHAR '168';
DECLARE MTI CHAR '0200';
DECLARE rItems REFERENCE TO Items;
DECLARE BitmapBit BIT CAST ('00000000' AS BIT); 
CREATE LASTCHILD OF OutputLocalEnvironment.MRM NAME 'PrimaryBitmap';
DECLARE rTargetMrm REFERENCE TO OutputLocalEnvironment.MRM.PrimaryBitmap;
CALL CreateBitMaps(rItems , rTargetMrm, BitmapBit);
DECLARE BitmapBlob BLOB CAST(BitmapBit AS BLOB);
DECLARE BitmapChar CHAR SUBSTRING(CAST (BitmapBlob AS CHAR) FROM 3 FOR 16);
SET OutputLocalEnvironment.MRM.MsgLen = MessageLength;
SET OutputLocalEnvironment.MRM.MTI = MTI;
SET OutputLocalEnvironment.MRM.BinaryBitmap = BitmapChar; --Set the right value.

SET OutputLocalEnvironment.MRM.ProcessingCode = '303000';
SET OutputLocalEnvironment.MRM.AmountTransaction = '000000000000';
SET OutputLocalEnvironment.MRM.TransmissionDateAndTime = 
    CAST(CURRENT_TIMESTAMP AS CHARACTER FORMAT 'MMddHHmmss');
DECLARE Len INT LENGTH(rEnvesbXML.MsgUId);
SET OutputLocalEnvironment.MRM.SystemsTraceAuditNumber = 
    SUBSTRING(rEnvesbXML.MsgUId From(Len - 5) FOR 6);
SET OutputLocalEnvironment.MRM.TimeLocalTransaction = 
    CAST(CURRENT_TIME AS CHARACTER FORMAT 'HHmmss'); 
SET OutputLocalEnvironment.MRM.DateLocalTransaction = 
    CAST(CURRENT_DATE AS CHARACTER FORMAT 'MMdd'); 
SET OutputLocalEnvironment.MRM.MerchantType = '6011'; 
SET OutputLocalEnvironment.MRM.PointOfServiceEntryMode = '901';
SET Len = LENGTH(rEnvesbXML.CardNum);
SET OutputLocalEnvironment.MRM.Track2Data.Length = Len; 
SET OutputLocalEnvironment.MRM.Track2Data.Track2Data = rEnvesbXML.CardNum; 
DECLARE text CHAR CAST(CURRENT_TIMESTAMP AS CHARACTER FORMAT 'yyDDDHH');
SET OutputLocalEnvironment.MRM.RetrievalReferenceNumber = 
    SUBSTRING(text FROM 2) || OutputLocalEnvironment.MRM.SystemsTraceAuditNumber;
SET OutputLocalEnvironment.MRM.CardAcceptorTerminalIdentification = '00000000';
SET OutputLocalEnvironment.MRM.CardAcceptorNameLocation = 
    '12345678901234567890123456123456789012eg'; 
SET OutputLocalEnvironment.MRM.CurrencyCodeTransaction = '818'; 
SET OutputLocalEnvironment.MRM.PersonalIdentificationNumberData = 
    Environment.Variables.CIB.HSMResponse.MRM.PINBlock;
SET BlobBitstream = ASBITSTREAM(OutputLocalEnvironment.MRM OPTIONS options 
    SET 'ISO_ATM_HSM_MsgSt' 
    TYPE 'ISO8583Message_64_Write' 
    FORMAT 'Text1');
SET BlobBitstream = SUBSTRING(BlobBitstream FROM 65);

处理 IST/Switch

根据上文对 HSM 的描述,从 IST/Switch 所有者处获得对 ISO 8583 定制标头的定义。对于基础情况,该定义由四个字节组成,这些字节包含字符中的整个消息长度。

ISO 8583 通信的关键成功参数是位图值的正确性,以便反映已启用的消息元素。这是在接收方进行正确解析所需的条件。为了实现这个目标,人们开发了一种电子表格工具,该工具可以为发送方自动将字段选择转换为 16 字符的十六进制位图。反之,接收方则将位图十六进制值转换为相应的 128 个元素的已启用元素(在使用主位图和副位图的情况下),以便在开发的时候用它来审查已解析的消息。这项技术减少了在调查阶段发送或解析错误位图值的可能性。

对于生产阶段,开发 ESQL 代码以便自动生成位图和 ISO 请求(除了解析已收到的消息以外)非常重要。在基础情况下,该代码使用了请求及其总长度中的 ISO 元素索引作为输入,并以正确的格式同时生成了相应的二进制位图和整个请求。上面的清单 3 显示了与请求消息有关的代码部分。函数 CreateBitMaps() 使用将在请求中用到的 ISO 字段元素创建了 64 整数元素 (64-integer-element) 的位图树和二进制 64 位位图元素。

包含单个位图(64 消息元素)的消息集的一个 IBM 的可重用资产被用作这项工作的核心部分。这个消息集被用来解析已接收的 64 元素 ISO 8583 消息。对于任何应用程序而言,ATM 系统响应只要不超出主位图而到达副位图就足够了。否则,您必须使用消息集(包含两个位图和 128 元素消息)的扩展副本。如需了解有关 ISO 8583 消息的 128 元素的详细信息,请参阅 ISO 8583 数据元素

要发送 ISO 8583 消息,则必须向消息集添加另一个消息。应该在开始位置处包含 64 整数元素的主位图和副位图元素,这样就能够在发送消息之前轻松删除其位流部分,因为它们在创建的时候(上面的清单 3 删除了这部分)仅用作消息元素出现次数的引用。这两个元素之后是完整的实际消息,该消息会发送到 IST/Switch,如下文和图 4 中所示:

  • 四个字符组成的标头,包含字符中的整个消息长度 -- MsgLen
  • MTI(在这里为 0200)
  • 二进制位图,反映了不同消息元素的存在
  • ISO 消息元素
图 4. 用于编写 ISO 请求的 ISO 8583 消息模型
用于编写 ISO 请求的 ISO 8583 消息模型

如果使用双位图(128 个消息组成的字段)ISO 8583 消息类型来解析单位图响应消息,则无法正常工作。因为 MRM 解析器无法计算与副位图相关的元素的出现次数,该次数取决于与位图相关的位值,而位图本身(副位图)的出现次数为 0(禁用)。此问题的解决方案是使用 64 字段的消息类型来解析单位图的接收消息和 128 字段的消息,从而解析双位图的消息(参阅下面的清单 4 中的动态消息类型选择)。

在上面的清单 3 中,函数 stretchBitMap 检查了从 IST/Switch 接收的二进制位图中的每一个位,并填充了消息位图数据复杂类型的相应整数元素的值,其中本地位图对象中的每个整数元素对应于二进制位图中的一个位。二进制位图在整数元素中的反射 (reflection) 使您能够使用它们作为消息元素的出现次数的引用。

清单 4: 用于解析代码的 IST/Switch ISO 8583 响应
CREATE LASTCHILD OF OutputLocalEnvironment DOMAIN ('MRM');
DECLARE rTargetMrm REFERENCE TO OutputLocalEnvironment.MRM;
SET BlobBitstream = stretchBitMap(rTargetMrm, BitmapBit, 'PrimaryBitmapS');
DECLARE MsgType CHAR 'ISO8583Message_64'; --The 64 element Msg.
IF OutputLocalEnvironment.MRM.Bit1 = 1 THEN    -- If secondary bitmap is enabled
    SET MsgType = 'ISO8583Message_128';    -- The 128 element Msg.
    SET readLen =16; 
    SET tmpMap = CAST(CAST(SUBSTRING(InMessageBlob FROM readIndx FOR readLen) 
        AS CHAR CCSID 1208) AS BLOB);
    SET readIndx = readIndx + readLen;
    SET BitmapBit = CAST(tmpMap AS BIT);
    SET OutputLocalEnvironment.MRM = NULL;
    CREATE LASTCHILD OF OutputLocalEnvironment DOMAIN('MRM');
    DECLARE rTargetMrm REFERENCE TO OutputLocalEnvironment.MRM;
    SET BlobBitstream = BlobBitstream || stretchBitMap(rTargetMrm, BitmapBit, 
        'SecondaryBitmapS');
END IF;
SET BlobBitstream = BlobBitstream || SUBSTRING(InMessageBlob FROM readIndx);
CREATE LASTCHILD OF Environment DOMAIN('MRM') PARSE(BlobBitstream 
    SET 'ISO_ATM_HSM_MsgSt'  
    TYPE MsgType
    FORMAT 'Text1');

结束语

本文从业务整合角度描述了银行的 ATM 借记卡安全系统,并向您展示了如何通过集成 HSM 和 IST/Switch,使用 Message Broker 的强大功能来创建安全的 ATM 系统。本文描述了集成代码的重要 Message Broker 消息流,以及相关 ESQL 代码的重要部分。本文还介绍了基于现场试验的最佳实践,以避免出现潜在的问题,并促进集成类似的 ATM 安全系统所涉及的业务整合开发人员、技术领导、架构师和业务分析师的潜在调查。

参考资料

学习

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere
ArticleID=827269
ArticleTitle=使用 WebSphere Message Broker 集成安全的 ATM 银行系统
publish-date=07232012