随着互联网的普及和电子商务的兴起,金融支付手段已成为制约经济发展的瓶颈,移动支付在这样的背景下应运而生。近年来,移动互联网为各行各业带来了巨大的革新机遇[1],根据艾瑞预测,2018年移动支付的市场交易规模或将超过18万亿元。
如此大的交易规模,其中最核心的问题就是移动支付的安全问题[2]。在移动安全支付中,移动支付的关键问题是确立安全的支付认证模式[3]。对于很多重要的支付系统而言,如果只有支付密码作为唯一的认证手段,从安全层面上看存在着很大的风险[4]。因此为了增强网站的安全性,大多数网上支付平台或者网上银行都会采用双因素认证或多因素认证[5]。这些不同的认证手段可以相互结合,使得认证的过程更加安全。因此密码不再是唯一的认证手段,在客户密码丢失的情况下,也可以有效地保护客户的账户安全。
当前,各金融机构如商业银行采取的一些通用的安全认证手段有短信密码验证、动态口令、数字证书或者以上这些方式的组合[6],而短信验证是目前二次身份验证中成本最低、最容易实现也最便捷的身份验证方案,客户的绑定性较强,不需要额外设备,校验成本极低,是通过率最高、操作性最好的验证手段。然而,在目前已有的方案里,短信验证码必须绝对保密,一旦短信验证码由于各种原因泄露,仍然会造成资金失窃。近年来屡屡发生的电信诈骗案中,骗取短信验证码往往是犯罪嫌疑人欺诈得逞的主要手段和关键环节。
基于对以上问题的考虑,本文提出了一种基于“客户口令+加密验证短信”的双因素认证模式,在身份认证过程中使用安全性更好的混合加密机制,同时在验证码传输过程中对验证码进行二次加密,以保障在验证码泄露的情况下移动支付过程的安全性[7],降低客户财产损失的风险。
1 相关知识 1.1 身份验证网络信息安全的五个功能包括身份认证、授权、保密性、完整性和不可否认,其中身份认证是最基本最重要的环节。身份认证的作用是保证在具体的决策环节,体现客户的真实意愿[8]。
通常,身份认证有三个要素:
1) 所知:things only the user knows,如密码、安保问题;
2) 所有:things only the user has,如手机校验码、U盾;
3) 所是:things only the user is,如指纹、虹膜。
从密码学角度上来说,使用上面两者完成的验证称为双因素验证(Two Factor Authentication)[9]。在目前的网络环境下,单独使用以上单一认证因素都会存在其问题和风险:
1) 所知:容易被遗忘、猜取以及信息泄露导致的碰撞;
2) 所有:容易被钓鱼、丢失;
3) 所是:认证成本过高,本体容易受到攻击。
这些认证因素本身的安全性也有高低之分,由于获取以及伪造的难度不同,一般认为第一类的安全性比第二类差,第二类又比第三类差;但需要明确的是,如果只有其中一种都算是弱认证,必须独立使用两种甚至三种才算是强认证。二次认证就是使用三类认证中两种以上的认证方式,它能够保证我们的支付认证是安全有效的。
1.2 公共基础设施公钥基础设施(Public Key Infrastructure, PKI)是由公开密钥密码技术、数字证书、证书认证机构(Certification Authority, CA)和关于公开密钥的安全策略等基本成分共同组成的比较成熟、完善的网络安全方案解决技术。其用公钥的概念与技术来实现,提供安全服务的具有普遍适用性的安全基础设施,是一种遵循标准的密钥管理平台,能够为所有网络应用透明地提供采用加密和数字签名等密码服务所必需的密钥和证书管理[10]。公钥基础设施在实际应用上是一套软硬件系统和安全策略的集合,它提供了一整套安全机制,使用户在不知道对方身份或分布地很广的情况下,以证书为基础,通过一系列的信任关系进行安全的通信,如网络通信、网上交易等都利用它来保证安全。
为了确保用户的身份及他所持有密钥的正确匹配,PKI/CA充当了公开密钥系统所需要的一个权威的、可信赖的、公正的第三方机构的认证中心。CA认证系统是PKI的核心组成部件,CA架构包括PKI结构、强度抗攻击的公开加解密算法、数字签名技术、身份认证技术、运行安全管理技术、可靠的信任责任体系等。主要工具是CA中心为网上作业主体颁发的数字证书,作用是检查PKI体系中所有证书持有者身份的合法性,并签发证书、更新证书和废除发放的证书,具有机密性、身份验证特性和不可否认性,为信息安全提供了有效、可靠的保护机制。
1.3 加密算法MD5是在MD4单向散列(Hash)函数基础上更趋成熟的算法,MD表示消息摘要(Message Digest)[11]。整个散列算法的输出结果由四个分组构成,这四个分组的每一个分组都是32比特,并且这四分组级联后将会产生一个散列值,这个散列值的长度就是四个分组级联后的长度,即128比特,这个128比特的散列值被称作消息摘要。
AES算法的加密与解密过程都有以下四种具体的操作:字节替代(SubBytes)、行移位(ShiftRow)、列混淆(MixColumns)和轮密钥加(AddRoundKey)。在Rijdaeld加密过程中[12],每一轮进行的处理都是从字节替代开始,然后进行行移位,接着进行列混淆,最后是轮密钥加的运算;而解密过程分别为对应的逆操作,即首先进行轮密钥加的运算,然后是列混淆,接着是行移位,最后一步是字节替代。
RSA公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制[13]。加密公式如下:
$ C = {P^E}\bmod N $ | (1) |
其中: C表示密文;P表示明文;E与N的组合就是公钥,一般用(E, N)来表示,RSA的加密就是求“E次方的mod N”,也就是说RSA的密文是对代表明文的数字的E次方求mod N的结果。解密公式如下:
$ P = {C^D}\bmod N $ | (2) |
其中D与N的组合就是私钥,一般用(D, N)来表示,RSA的解密过程就是求“D次方的mod N”,也即对表示密文的数字的D次方求mod N就可以得到明文。
在RSA密码体制中通常是先生成一对密钥,其中的私有密钥由客户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。
2 基于短信验证的移动安全支付方案要保证支付的安全性就要建立安全的会话机制,然后在此基础上完成支付过程。整个支付过程分为两个阶段:第一个阶段是服务器与客户端的相互认证阶段,这个阶段使用的认证方法是基于PKI的CA认证;第二阶段是支付阶段, 主要进行相关的支付操作。需要说明的是:本文方案中的密钥对分别由客户端与服务器端产生,因此CA证书的生成是分布式生产,客户端或服务器把各自公钥传给CA提出证书请求,如果请求通过,CA生成证书,并将证书公布在CA中心数据库中[14]。客户端与服务器从CA数据库中下载证书,并在认证阶段通过验证数字证书来确认对方身份的合法性,认证工作完成以后就可以进行相关的支付操作。本文方案中使用的符号定义如表 1所示。
CA系统包括用户的证书提交请求、证书申请审核、证书生成、证书发布与证书使用等流程。
本文方案中的密钥对分别由客户端与服务器端产生,具体过程如下:
1) 证书申请:客户端连接到CA服务器,并把客户的证书申请信息PKCS#10传送给CA,CA把申请信息放到CA中心数据库中,提交的申请中包含用户公钥和用户标识信息。
2) 证书申请审核:CA管理员从CA数据库中提取申请信息,然后进行相应操作(批准或拒绝)。
3) 证书生成:申请批准后,CA服务器端则生成证书,并且对证书进行签名后存储到数据库中,以便用户下载。
4) 证书发布:客户端从证书数据库获得发布的证书并将它安装在自己的本地证书存储区中。
数字签名验证的原理是对原文作数字摘要和签名并传输原文,然而传输的原文一般要求保密,这就要求用数字信封的方法对原文进行加密。数字签名验证的基本工作原理是用对称密钥加密传输,而将对称密钥用接收方公钥加密发送给对方;接收方收到数字信封后用自己的私钥解密信封,并取出对称密钥解密得原文。传统的数字认证过程使用的混合加密机制是MD5、3DES、RSA[15],本文方案认证过程使用的混合加密机制为MD5、AES、RSA。具体过程如下:
1) 客户端将从CA中心下载的X.509标准数字证书作为传输信息(包含用户名、证书序列号、有效期以及用户的身份标识),经过MD5运算得到一个128比特的散列值,即为信息摘要MD。
2) 客户端通过RSA算法使用客户私钥CSK加密信息摘要MD得到数字签名DS;把信息的明文、数字签名DS以及客户公钥CPK三项内容利用密钥SK通过对称加密算法AES加密得到密文信息E;使用在CA中心下载的服务器公钥SPK加密对称算法加密密钥SK,形成数字信封DE;最后把加密后的密文信息E与数字信封DE一同发送给接收方服务器端。
3) 服务器端接收到信息后首先使用服务器自身的服务器私钥SSK解密数字信封DE得到对称算法加密密钥SK;接着使用密钥SK解密接收到的加密信息E,解密后得到的是信息明文、数字签名和用户公钥CPK;然后使用客户公钥CPK进一步解密得到的数字签名获取信息摘要MD;同时将经过解密的信息明文再用MD5函数进行运算,重新计算得到一个信息摘要MD′。比较MD与MD′是否相同,如果相同则表明传送的信息没有被篡改过,通过提取证书信息可以进行用户身份确认,表明由此验证服务器和客户终端之间建立了安全通道;否则拒绝确认,拒绝进行相应服务。
在整个认证的过程中,用户与服务器都分别持有自己的私钥;而公钥是公开的,在认证过程中可以在客户端和服务器之间进行传输,密钥由加密算法函数分别生成。因此,攻击者无法伪造和篡改经过CA进行认证以后的数字签名,进而能够建立高可信度的网络安全保障体系,保证网络不同实体之间传输信息的真实性、可靠性、保密性与不可否定性。在线认证过程如图 2所示。
1) 在支付业务服务器和客户终端进行确认建立安全通道后,登录客户端APP主界面,在主界面中选择进入支付页面后客户端的支付请求信息REQ调用服务器公钥SPK加密,加密后的信息SPK(REQ)向支付业务服务器发送支付请求。
2) 支付业务服务器接收到支付请求后,用服务器私钥SSK解密提取支付请求中的支付信息,在确认支付请求后,支付业务服务器生成验证码VC,先用服务器端私钥SSK加密验证码得到一次密文验证码SSK(VC),然后再用客户端APP公钥CPK加密得到二次密文验证码CPK{SSK(VC)}。服务器将此二次密文验证码通过短信发送给客户端APP。
3) 客户从手机短信中得到二次密文验证码CPK{SSK(VC)}之后,将它输入客户端APP。客户端APP用客户端私钥CSK解密二次密文验证码CPK{SSK(VC)}得到一次密文验证码SSK(VC),再用服务器端公钥SPK解密得到原始验证码VC。
4) 客户端APP用客户私钥CSK加密原始验证码得到一次验证码密文CSK(VC),然后用服务器端公钥SPK加密一次密文得到二次密文SPK{CSK(VC)},最后将二次密文发送给服务器端。
5) 支付业务服务器端用服务器私钥解密二次密文SPK{CSK(VC)}得到一次验证码密文CSK(VC),然后用客户公钥解密得到原始明文验证码VC,服务器在对验证信息与服务器中存储的原始验证码匹配后,支付可以进行。
需要指出:服务器端和客户端APP的密钥需要定期更新,也即CA中心的证书是有实效期的。服务器并不能获取客户的私有密钥,这是为了保证数字签名的安全性,否则服务器就可以伪造客户签名,导致支付出现问题。支付阶段验证码加密过程如图 3所示。
为了保证在更换移动设备时依然能够实现安全验证,该方案需要在客户注册时进行预留安全问题设置。
1) 在移动设备第一次使用时,应用会获取移动设备信息发送给服务器,服务器将登记保存客户的设备信息和客户公钥CPK。
2) 用户登录账号时客户端APP会将获取的当前设备的设备信息和之前保存在服务器上的设备信息进行比对,如果相同则表明用户没有更换移动设备,验证登录信息后直接进入应用操作界面;如果比对结果不同,客户端APP将转向预留安全问题页面,预留安全问题回答正确时确认用户合法,则重新生成客户公钥CPK与私钥CSK并发送给服务器端进行更新保存,客户端APP可以正常使用。用户如果在已安装过客户端APP的设备上重新安装或者升级客户端APP时,会检测当前设备是否已安装过此客户端APP,如果已安装过,那么当前安装的客户端APP将不再调用密钥生成器重新生成客户公钥CPK与私钥CSK。
3) 如果是攻击者窃取了密钥,就会在自己的设备上登录APP,无法正确回答预留安全问题,身份验证失败,客户端APP默认用户非法,则无法使用客户端APP。此时服务器端保存的客户端公钥维持不变,并记录“密码已泄漏”,当合法用户登录客户端后系统会提醒用户有非法用户已窃取了密码,建议用户修改密码,从而使非法获取用户名、密码的攻击者无法再登录,从而避免设备丢失造成损失问题的发生。
3 安全性分析本文提出的基于短信验证码的移动支付解决方案,首先能够有效防止非法客户的欺骗,具体体现在:
1) 在用户身份验证方面,除了用户要自身持有用户名和密码之外,在登录客户端时服务器端会和客户端进行在线数字验证,通过验证后会建立安全通道,保证支付的顺利进行。在验证的过程中服务器会保存客户端传递的客户公钥,并且服务器会通过数字签名验证客户的可信度,从而使非法客户无法通过验证,进而无法继续支付操作。同时本文方案采取了预留信息验证的方式,用户在第一次使用客户端进行信息注册时,系统会要求用户填写并提交验证信息,同时获取移动端设备的相关信息,这些验证信息会在服务器上进行保存。当用户使用的通信手机卡被发动了补卡攻击,造成当前使用的手机卡失效,非法用户使用另外的移动设备安装客户端APP并与验证服务器进行验证时,服务器发现客户端的移动设备信息比对错误,就需要进一步验证用户的安全信息,通过安全验证信息之后用户才能正常使用客户端,避免了补卡攻击导致财产损失情况的发生。
2) 在数据通信方面,本文方案的数字认证阶段采用MD5的散列函数算法获取信息摘要,保证了传输信息的完整性;并且对要传输的信息使用的是对称加密算法AES,降低了信息被窃取破解的风险;而在此过程中对称密钥的传输则使用公开密钥算法RSA进行加密,使得对称密钥在传输过程中有了更加安全的防护,从而保证了在整个认证过程中重要信息的安全。而在第二阶段的支付过程对支付业务处理服务器和移动客户端之间的支付通信信息加入的公开密钥算法的两次加密防护,又保证了支付验证的相关信息不被轻易泄露或盗取,有效杜绝了传统短信消息在传送和接收过程中未加密而出现的各种潜在风险,对于无线监听等攻击行为起到了相应的防护作用。本文方案的验证码在服务器和客户端直接进行传递时,都需要经过两次加密,首先使用对方的公钥加密验证码,接着使用自身的私钥对加密信息进行签名,这样服务器或客户端接收到验证码以后需要使用对方的公钥进行签名验证,之后再用自身的私钥解密信息来得到原始验证码。这样以密文方式传递,即使在信道内被窃取或是被伪基站截获也无法识别内容,必须要使用私钥解密后才能转换成明文。但是客户私钥与服务器私钥都由其自身保管,并不公开,是严格保密的,攻击者无法获取。因此即使由短信木马病毒造成验证码密文泄漏,攻击者也不能获取验证码,更不可能完成支付,从而保证了资金的安全。
4 实验结果与分析该实验服务器端的处理器采用AMD AthlonTM X4 750 Processor 3.40 GHz,4 GB内存;操作系统为64位Windows 7;编程基于Eclipse Mars(JDK1.7开发包)平台,并配置Android SDK开发包,客户端性能测试工具HyperPacer。
图 4表示的是不同用户访问情况下,客户端登录账户后与服务器之间进行认证的响应时间情况。其中:横坐标表示的是用户访问数(即移动终端数);纵坐标表示的是数字认证方案加密主要信息使用不同加密算法后,用户登录认证系统的平均响应时间。由对比结果可以看出,虽然两种方案的响应时间整体增长趋势是相似的,但使用AES加密的方案整体时间要比3DES加密的方案短。这表明AES算法在整体安全性及时间效率上均优于3DES算法,因此本文认证方案中选择使用AES算法是具有一定的优势的。
图 5表示的是加密不同位数验证码的平均加密时间。根据日常使用的习惯,实验分别使用的是:2位、4位、6字以及8位数字的长度。其中:横坐标表示的是用户使用移动端的并发访问数量(即移动终端数量),纵坐标表示的是实验中用RSA加密所花费的平均反应时间。从图中可以看出,RSA算法加密这些数字的时间随着并发请求的增多呈线性增长趋势,但由于被加密文件的信息容量比较小,所以平均加密时间的整个增长趋势并不明显。由此表明使用本文选定长度的密钥进行RSA算法加密用在短信息加密上并不会影响系统效率。而解密时间比加密的平均时间略低,解密这四种不同位数验证码的图形走势与加密整体上没有太大的差别,都是呈线性关系。
图 6表示的是使用商用短信发送接口从系统响应支付请求后生成验证码到调用短信发送接口发送验证码直至用户收到验证码的等待平均时间。其中:横坐标表示的是用户使用移动端的并发用户的访问量,纵坐标表示的是服务器响应客户端支付请求到客户端接收信息的总时间。图中3条曲线分别代表的是服务器未加密验证码调用Mob接口(记为Mob)、服务器未加密验证码调用Juhe接口(记为Juhe)以及服务器加密验证码调用Mob接口(记为Eycrypted Mob)的用户响应总时间,之所以在加密后调用Mob接口发送短信,是因为Mob接口的整体表现要优于Juhe接口。从图可以看出,随着用户访问量的增加,使用不同接口的系统平均响应时间也在逐渐增加,并随着并发访问量的增加而相应增大,但是整个增长过程是线性的,其增长速度也不快,因此不会出现系统性能随着用户数量的增长而急剧下降的现象,这表明系统在大量用户同时进行访问时,系统的健壮性表现较好。
针对使用短信验证码作为支付验证方式的解决方案在验证码传输过程中以及在运营商的服务器上没有经过加密,容易被盗取等问题,本文把加密算法引入到了短信传输的全过程。本文方案是对传统的PKI验证使用的混合加密机制进行改进,其中的对称密钥算法用AES替换3DES,可以保证更好的安全性和更高的效率。另外对于短信验证码进行二次加密,验证码以密文方式传递,必须使用客户私钥解密后才能转换成明文,这使得即使验证码密文泄露,也能够较好地保护用户资金的安全。仿真实验结果表明,本文提出的基于加密短信验证码的移动安全支付方案能够保证短信验证码的加密传输,同时在性能上与未加密验证码验证的支付方案无明显差异,很好地解决了短信验证码明文传输存在的问题。
本文方案中的双因素身份验证是加密的短信验证码和用户账户密码,如果用户的手机丢失,那么用户手机的获取者在没有获取用户支付账号和密码的情况下无法完成系统登录进而也无法向服务器提交支付请求以及获取验证码。同样,如果非法用户获取了用户的支付账户密码,在没有获取用户手机的情况下,一旦向服务器提交支付请求,支付验证码就会发送到用户手机上,使用户意识到账户被盗的可能。但如果同时获取到用户的支付账号、密码和用户手机,也即两种验证因素都泄露的情况下,非法用户获取了所有用户的身份验证因素,那么非法用户就可以完全冒充用户进行支付操作,这种方案的安全性防护就会失效。同样地,对于使用多因素身份验证方案来说,如果用户多种验证因素都泄露,也无法起到保护用户账户安全的作用。因此除了技术手段保证用户账户安全以外,用户自身也要养成保护重要隐私信息的意识。
本文提出的基于加密短信验证码的移动安全支付方案还可以更加完善,而且其他更多关于移动支付多因素认证的关键技术也可以运用到支付验证过程中,如生物信息验证和脸部识别等。此外采取多因素验证能在原有验证基础上对重要信息起到更好的防护,但当验证因素比较多时对保管验证信息也将是巨大的挑战,因此,对于验证安全信息的管理优化问题也需要进行深入的研究。
[1] | 中国互联网络信息中心. 第37次中国互联网络发展状况统计报告报告[R]. 北京: 中国互联网络信息中心, 2016. (China Internet Network Information Center. The 37th China Internet Development Statistics Report[R]. Beijing:CNNIC, 2016.) |
[2] | 李海飞. 移动支付中的安全协议研究[D]. 西安: 西安电子科技大学, 2014: 7-13. (LI H F. Research on security protocol in mobile payment[D]. Xi'an:Xidian University, 2014:7-13.) http://cdmd.cnki.com.cn/article/cdmd-10701-1014327978.htm |
[3] | DAHLBERG T, GUO J, ONDRUS J. A critical review of mobile payment research[J]. Journal of Electronic Commerce Research and Applications, 2015, 14(5): 265-284. DOI:10.1016/j.elerap.2015.07.006 |
[4] | 杨晨, 杨建军. 移动支付安全保障技术体系研究[J]. 信息技术与标准化, 2010(7): 17-20. (YANG C, YANG J J. Research on the technical system and standardization of security assurance for mobile payment[J]. Information Technology & Standardization, 2010(7): 17-20.) |
[5] | XU Z, ZHANG T, ZENG Y, et al. A secure mobile payment framework based on face authentication[C]//IMECS2015:Proceedings of the 2015 International MultiConference of Engineers and Computer Scientists, LNCS 2215. Berlin:Springer-Verlag, 2015, 1:495-501. |
[6] | 白璐. 信息技术对我国商业银行创新的影响研究[D]. 长春: 吉林大学, 2013: 13-17. (BAI L. Research on the influence of information technology on the innovation of China's commercial banks[D]. Changchun:Jilin University, 2013:13-17.) http://cdmd.cnki.com.cn/Article/CDMD-10183-1013187981.htm |
[7] | 周晓谊, 姚孝明, 李益红. 互联网金融存在的安全问题亟待解决——以移动远程支付APP为例[J]. 信息安全与技术, 2014, 5(10): 8-12. (ZHOU X Y, YAO X M, LI Y H. Security problems of Internet finance urge solutions-an example of remote payment APPs on mobile devices[J]. Information Security and Technology, 2014, 5(10): 8-12. DOI:10.3969/j.issn.1674-9456.2014.10.002) |
[8] | 冯韵. 移动支付中身份认证分析与研究[J]. 信息通信, 2012(3): 107-109. (FENG Y. Analysis and research of identity authentication in mobile payment[J]. Journal of Information Communication, 2012(3): 107-109.) |
[9] | 曹巍, 赵滟. 一种基于双因素认证的移动支付安全技术研究[J]. 信息安全与技术, 2014, 5(2): 10-12, 15. (CAO W, ZHAO Y. Research on the technology of mobile payment security based on two-factor authentication[J]. Information Security and Technology, 2014, 5(2): 10-12, 15.) |
[10] | WARD H, GREENWALD G E, SHANAHAN F A. Systems and methods for remote authorization of financial transactions using Public Key Infrastructure (PKI):US, 9462473[P]. 2016-10-04. |
[11] | 张裔智, 赵毅, 汤小斌. MD5算法研究[J]. 计算机科学, 2008, 35(7): 295-297. (ZHANG Y Z, ZHAO Y, TANG X B. Research on MD5 algorithm[J]. Computer Science, 2008, 35(7): 295-297.) |
[12] | DAEMEN J, RIJMEN V. 高级加密标准(AES)算法: Rijndael的设计[M]. 谷大武, 徐胜波, 译. 北京: 清华大学出版社, 2003: 9-52. (DAEMEN J, RIJMEN V. The Design of Rijndael AES:The Advanced Encryption Standard[M].GU D W, XU S B, translated. Beijing:Tsinghua University Press, 2003:9-52.) |
[13] | 王茜, 倪建伟. 一种基于RSA的加密算法[J]. 重庆大学学报(自然科学版), 2005, 28(1): 68-72. (WANG Q, NI J W. An RSA based encryption algorithm[J]. Journal of Chongqing University (Natural Science Edition), 2005, 28(1): 68-72.) |
[14] | 周晓斌, 许勇, 张凌. 一种开放式PKI身份认证模型的研究[J]. 国防科技大学学报, 2013, 35(1): 169-174. (ZHOU X B, XU Y, ZHANG L. Research on an open PKI identity authentication model[J]. Journal of National University of Defense Technology, 2013, 35(1): 169-174.) |
[15] | 肖振久, 胡驰, 姜正涛, 等. AES与RSA算法优化及其混合加密体制[J]. 计算机应用研究, 2014, 31(4): 1189-1194. (XIAO Z J, HU C, JIANG Z T, et al. AES and RSA algorithm optimization and its hybrid encryption system[J]. Application Research of Computers, 2014, 31(4): 1189-1194.) |