前段时间在虎嗅上看到一篇文章,说微信的移动支付既简单又安全。这一点,老李颇不赞同。刚好曾搞过两年的手机动态令牌的研究,这里也来说两句。
在安全领域有两个基本的原则:
1、 没有绝对安全,安全是相对的;
2、 所有的简单、方便都是以牺牲安全程度为代价的,只是看你如何权衡罢了。
个人认为,在手机上支付,各种条件尚有欠缺,环境尚不成熟,为时过早。(钱袋、盒子支付、拉卡拉推广的卡槽式手机支付理论上属于传统的POS机支付,不属于严格意义上的手机支付,不属于这里涵盖的范围)
移动支付的密钥在哪儿?
简单的用户名和静态密码都是容易被破解或窃取的(无论如何组合数字和字母,多少位),已经不能满足今天电子支付的安全要求了。所以,银行目前普遍采用“用户名+密码+密钥”三合一的方式来实现用户身份的认证。“用户名和密码”就是你在银行开户时设定的,而“密钥”是你下载到U盾保存(也由银行发放)的数字证书或者银行发放的带有显示屏的六位到八位的动态令牌。
无论是数字证书还是动态令牌,都是代表你身份的唯一象征,就好比你的指纹是你的唯一标识。对于银行而言,每一个用户都具有唯一的数字证书或者动态令牌,反之亦然。
用户的“密钥”和PC机独立是电子支付的最基本的要求。如果早期使用过网银的客户一定记得,最初数字证书是备份在PC机的硬盘里的,之所以现在要备份到一个独立的U盾里,就是为了将你的“密钥”与PC分离。这样,即使有黑客能够侵入你的电脑,没有数字证书或者动态令牌显示的数字也无法完成资金的转移。
前几年有一些用户在电脑支付完忘记拔U盾而被黑客将银行账户的资金转走,所以,现在的网银在你退出的时候都会提醒你,“你的U盾还未拔掉,建议您拔掉U盾“(动态令牌不存在这个问题)。
U盾的操作系统是专有的,很少有人会破解U盾,所以,只要U盾不在PC机上,该PC也就无法与银行建立一条加密的隧道,你就有了一层很坚固的保障。
动态令牌的工作原理是简单地来说就是一种密码算法。理论上来讲,只要有足够长的时间和良好的设备,任何密码都可通过穷举法加以破解,即把所有的密码组合全试一次。但对于动态令牌的一些算法(如MD5、SHA-1),使用穷举法寻找它的冲突至少需要进行2^80次运算,这对于我们来说近乎不可能。试想我们使用一台每秒运算30亿次的计算机,运用穷举法去寻找一个冲突,到找到为止需要花费多少时间呢?大概需要1200万年以上!
目前微信使用的,据我观察(没有看到任何介绍),有点类似短信动态令牌方式,即用户方无需一个动态令牌的实体,服务器端通过短信网关将动态令牌发送下来。所谓动态令牌,就是不断变动的六位或者八位数字。数字一旦出现,永不重复,这就保证了即使黑客窃取你的密码,过了密码的存活周期后,也无法进入系统进行身份认证,所以,动态令牌有时也叫一次性口令,One Time Password,简称OTP。动态令牌的存活时间从几秒钟到几个小时可调,根据你实际的应用场景设定,一般为30-60秒更换一次。
动态令牌的显示数字是依靠某种算法运算所得。服务器端运算出来一个结果,并通过短信发送给手机端,然后用户将这六位数字录入,传递到服务器端进行对比,验证用户的身份。这里先不去考虑密码编制算法的可靠性(是否真的有MD5等那样坚固,我没有看到任何资料说微支付密码采用何种算法,不好评价),仅就短信传递密码,就存在可达性和安全性的问题。
根据目前运营商的平均水平,短信的到达率大约在95%左右,但遇到一些特殊情况,如节假日,有可能会发生延迟、丢失的现象。比方说,刚刚过去的双十一。短信一般不用于关键信息(对丢失、时延敏感)的传递,也属于“best effort”尽力而为范畴。
(责任编辑:安博涛)