谈谈网银和USB Key

 (一)

写下这个题目,一时间又不知道从何说起了。事实上,对于网银和USB Key,有些东西不吐不快,特别是有时在网上的一些论坛里看到有人“分析/评论”使用USB Key的网银的安全性时,对于一些“不懂装懂”的行为,有一种莫名的悲哀感。于是乎写下此文,希望能够起到一点科普的作用。

基础知识

我们常见的加密,使用的是“对称加密算法”,也就是说,用一个密码加密的东东,同样可以用这个密码来解密。我们称这样的加密算法为“对称加密算 法”,用于对称加密算法中的密码,我们称之为“对称密钥”。一旦别人知道了你的密钥,那么他就可以任意的解密你的秘密数据了。这样的算法很多,常见的有 DES,3DES,AES,Blowfish等等。

使用USB Key来保证网银的安全,实际上是利用了PKI(公开密钥体系)技术中的数字证书应用,而PKI技术中至关重要的一点就是“保证私钥的安全”。为了理解所 谓的“保证私钥的安全”,我们先举一个简单的例子:假定有这样一种计算方法,可以将一篇文章用一个密钥A加密,要想解密的话,必须用另一个密钥B来解密, 反过来也一样,用密钥B加密之后得到的密文只能用密钥A来解密。这里的密钥A和密钥B一定是成对出现的,一一对应,绝对不会出现用密钥A加密的东西可以用 密钥C、密钥D…等等来解密。这样的算法我们称之为“非对称加密算法”,相对应的,这里的密钥A和密钥B我们称之为“密钥对”,因为它们是成对出现的。密 钥对中的一部分可以随意公开,例如其中的密钥A,我们称之为“公开密钥”,简称公钥。而另外一半是自己持有的,需要保密,我们称之为“私有密钥”,简称私 钥。所谓“公开密钥体系”,就是指这里的公钥了。我们常听到的RSA,就是这样一种算法。此外还有DSA、ECC(椭圆曲线算法)等等。

使用公开密钥体系,不仅仅可以用来对数据加密,还可以用来确定身份。试想一下:你有一对密钥对(A和B),其中A是公钥,被放在网上,任何人都可以 取得。现在有人(比如张三)想给你发送一份邮件,于是张三在网上找到你的公钥,然后将邮件用你的公钥加密并传送给你。那么,只要你的私钥没有泄露出去,就 只有你能够解密这封邮件(使用和A相对应的私钥B来解密)。即使邮件在网络上传输的过程中被黑客获取了,没有私钥B,他也无可奈何。这就意味着,使用公开 密钥技术,可以保证只有指定的人(其实就是指定的私钥啦)才可以阅读私密信息。

 

反过来,如果张三先用他自己的私钥对邮件加密,然后再用你的公钥对密文再次加密,那么不但只有你能够阅读这封邮件,而且还可以确认这封邮件一定是张 三发出来的。这是因为你在收取到邮件之后,首先用自己的私钥解密,得到的还是一堆密文,然后你必须用张三的公钥再次解密,才能得到邮件的原文。既然是使用 张三的公钥才能解密,那么这封邮件一定是用张三的私钥加密过的。

此外,还有一种用法:例如你的老板(或者干脆你就是老板)要发布一份公告,内容为“给所有员工补助500元”,要求每个员工都能够看到,不用加密。 但是这封邮件在网络上传输的时候,被有心人篡改了,变成了“给所有员工补助5000元”,喔,老板亏大了~~~为了防止这种事情的发生,老板将公告用自己 的私钥加密并附加在公告的后面,然后一起发送。这样每个员工都能够用老板的公钥解密附加的密文,并与公告原文对比,于是就能够知道邮件在传输的过程中是否 被篡改了。

高级阅读

除了对称算法和非对称算法之外,还需要了解一种加密算法,称之为“散列”(也有人称之为“杂凑”、“哈希”等,英文名为Hash),与对称/非对称 算法不同的是,散列算法是不可逆的,也就是说,加密后的数据是无法再解密了,常见的散列算法有MD5、SHA1等。散列算法还有一个特性就是无论原文有多 长,散列之后的结果总是固定长度。例如MD5散列的结果总是16字节,SHA1散列的结果总是20字节。

非对称加密算法的加解密速度要远远低于对称加密算法,所以在实际应用中,往往会将对称、非对称及散列算法混合使用,以提升性能。例如,张三给你发邮 件的时候,先产生一个随机数,用这个随机数来做对称算法的密钥并对邮件加密,随后用你的公钥对这个随机数加密,然后将邮件的密文和随机数的密文一起发给 你。你收到邮件之后,先用自己的私钥解密随机数,然后用随机数作为对称算法的密钥解密邮件。

又如,老板发布公告的时候,将公告进行散列,然后用老板的私钥对散列后的结果加密(这个加密结果,就是通常所说的“数字签名”),而员工收到公告的 时候,只需要再次对公告进行散列,并用老板的公钥对数字签名进行解密,然后将解密结果和公告的散列结果做对比,就能了解公告是否被篡改了。这个对比的过 程,就是通常所说的“验证签名”。

由此可见,公开密钥体系能够做到:1. 数据加密; 2. 不可抵赖(就是发送者无法否认); 3. 防止数据被篡改。

有了这样的基础知识,就容易理解“保证私钥的安全”是多么重要了。

在“谈谈网银和USB Key (一)”中我们已经了解了公开密钥体系的作用:数据加密、防止抵赖、防止篡改。但是这一切的前提就是保证私钥的安全

绝对不要泄露你的私钥。否则的话,黑客可以:

  • 偷看你给美眉写的肉麻情书;
  • 冒充你的身份给老板发邮件,然后你被叫到老板办公室谈心;
  • 在网上购物,花的却是你的血汗钱;

等等等等,啊呀,实在是太糟糕了。

 

刚开始的时候,网银系统颁发给用户的数字证书(其中包含私钥),是存放在硬盘上的,当然,对于普通用户来说,这些证书啊、公钥啊、私钥啊什么的,都 不知道放在什么地方,只是当要用到的时候它就自己跑出来了。但是黑客可不这么简单,他们能够在你的计算机里面放置病毒、木马什么的,悄悄的就把你的证书、 私钥全部偷走了。有些朋友会说,嗯,我记得证书存放到硬盘上的时候(就是备份证书),需要设置密码的,这样黑客不就没办法了么?没有这么简单。你早晚会用 到你的私钥的。一旦你使用私钥,操作系统就必须从硬盘中读取,还可能会询问你密码,然后在内存中就是私钥的明文了。计算机的内存,天哪,对于黑客来说,简 直就是自己的后花园一样。且不说层出不穷的木马,玩游戏的朋友应该知道一些游戏修改软件如“游戏修改大师”、“金山游侠”,或者早期的FPE等等,这些大 众化的工具就能在整个内存中搜索自己感兴趣的内容。所以说,如果某个东西可能会出现在内存中,就意味着可能被黑客偷走。

因此,出现了USB Key。

一定一定一定要澄清一个观点:USB Key不是U盘。

USB Key是这样的一个东东:首先它的外观和U盘很像,所以常常被误认为U盘。其实USB Key内部确实有一点点存储空间,能够存放你的证书、私钥等数据。但最关键的是它有一块智能卡芯片,可以完成私钥的相关运算,例如加密、解密等。而且,这 块智能卡芯片保证了像私钥这样的秘密数据不能被外部访问,如果你要使用私钥干点什么,你只能把原始数据交给USB Key,然后USB Key内部完成各种运算,再将结果吐出来给你。任何人,包括USB Key的制造商在内,是不能将私钥读取出来的。而且,在你使用私钥之前,还需要通过USB Key的一个身份验证手续,也就是输入一个密码,这样可以防止USB Key丢失后被别人利用。啊,你说制造商可能留下后门,可以通过特别的方式读取私钥?天,哪个制造商敢冒这样的大不韪,给自己找麻烦~~~除非这个制造商 不想混下去了,呵呵~~~

更进一步的是,USB Key本身可以产生非对称加密算法要用到的密钥对,这样,私钥从出生开始就一直呆在USB Key内部,不见天日,终其一生不得离开USB Key。为你默哀一秒钟,可怜的孩子…

所以,只要你保管好自己的USB Key,并且不要把USB Key的密码泄露,你的网银基本上就是安全的了。此时黑客再想花你的钱在网上购物,就必须知道你的银行帐号、网银登录密码、取款密码、拿到你的USB Key、从你脑子里找到USB Key的密码。

上面说到“基本安全”,是有原因的。具体如何,且听第三回分解。

前面[谈谈网银和USB Key (二)]已经谈到,有了USB Key,我们的网银就“基本安全”了,那么,使用了USB Key还会有什么安全性的隐患,我们又该如何应对呢?

在进一步阅读之前,请先明确一个事实:一切安全性都是相对的越是安全的系统,对用户的要求就越高,使用起来就越繁琐。我们只能在安全性与易用性之间找一个平衡点,而这个平衡点也会随着技术的发展朝不同的方向偏移。


安全隐患!

首先我们来看看进行一次利用网银进行网上支付的全过程:

  • 將USB Key连接到计算机上,并打开网银网站;
  • 输入帐号、密码等信息登录网银;
  • 输入转帐的目标账户和金额;
  • 要进行网上支付时,需要输入USB Key的PIN码(即个人识别码);
  • 网上支付完成。

其中,有可能在打开网银网站的时候就需要输入USB Key的PIN码,这是由网银系统设计决定的。

好了,让我们转变一下思维方式,假定我们现在来扮演海盗,呃,不,扮演黑客吧,我们来看看有什么地方可以侵入这个网银交易系统呢?嗯,我们已知的是,用户的私钥是无法得到的,但是看看,这里有好几个安全隐患:

  • 1. 输入帐号、密码信息;
  • 2. 输入USB Key的PIN码;
  • 3. 通常,在没有关闭浏览器之前,一般不用再次输入USB Key的PIN码。

那么,只要我能够植入一个键盘钩子类型的木马程序,监控用户的键盘输入,就可以得到他的帐号和密码了,同样的,也可以得到USB Key的PIN码了。植入木马的手段很多,例如诱惑用户访问一个嵌入木马的网站,或者发送一封具有诱惑力的邮件(其中嵌入木马),或者做一些工具软件帮助 用户清除病毒(但实际上悄悄的嵌入了自己的木马),或者將一些软件破解版重新打包供下载,只不过在安装包中加入了木马,甚至可以出一款“Windows XP SP3无限激活版”,让用户下载,结果安装好的系统中就已经具有木马了,嘿嘿,黑客的手段太多了。

好了,假定我们的木马已经进驻用户的电脑了。拿到帐号、密码以及USB Key的PIN码有什么用呢?毕竟我们无法拿到他的USB Key啊,也就没有办法使用他的私钥了。不要着急,让我们守株待兔吧。一旦用户將USB Key插入到电脑中,我们的木马程序第二部分就可以开始工作了,第二部分是以隐藏方式开启一个浏览器,模拟网上交易的全过程,包括填写帐号、密码、转帐金 额、提供USB Key的PIN码、确认转帐等等,对于网银服务端来说,根本没有办法区分这是用户的正常操作,还是木马的行为。

当然,编写这样的木马程序需要极高的反向工程能力、系统分析能力以及编程造诣,但既然有这种可能,那么在某个时刻这个可能就会变成现实。啊,我听见 你说,我们可以防止键盘钩子,让木马无法获取键盘信息。但是我可以负责任的告诉你,键盘监控是无法彻底免除的,即使你使用驱动层次来首先截取输入,但是木 马也可以,甚至木马可以使用网银不能使用的技术:rootkit。可以预见,在终极PK的时候,木马是占上风的

再看看上述第三点漏洞,这就是一个典型的“安全性与易用性”取平衡点的结果。一旦打开浏览器,输入一次PIN码之后,后续的操作就无需再次输入了, 这样可以给用户一个比较好的使用体验。然而,倘若黑客在用户浏览器中嵌入一个BHO,一旦发觉用户成功完成一次转帐操作,就以黑客的帐号为目标帐号再次转 帐一笔,瞧,多简单,都不用费心去获取什么帐号密码了。

发觉了这样的潜在攻击方式,大部分网银不得不降低易用性,要求每次转帐操作前,强制进行一次USB Key的PIN码验证,这样虽然增加了用户操作量,但可以有效防止因为转帐完成后忘记关闭浏览器而导致的隐藏攻击。

但无论如何,因为键盘木马的存在,普通的USB Key最终会败下阵来,只不过是时间问题。对了,这里请不要考虑杀毒软件,毕竟目前的杀毒软件都是“后知后觉”的,等一个木马被列入杀软的黑名单时,可能 损失已经造成了。我们要讨论的是如何在不安全的环境下安全的完成网上交易。

注,上述攻击方式是理想化的分析,说起来简单,但是实现起来却是非常困难的,所以目前看来,普通的USB Key在一定时间内是可以为网银系统提供必要的安全性的。所以,目前各大银行采用的USB Key完全可以满足普通用户对于电子支付的安全要求,使用USB Key比使用纯文件类型的数字证书在安全性上有本质的提升。

如何应对?

啊,已经写了这么多了,休息,休息一会儿~~~

四、

好了,各位同学,现在我们已经知道黑客无所不在,无所不用其极,目标就是我们网上银行的存款,或者信用卡里的额度。前文《谈谈网银和USB Key (三)》已经简要描述了目前的USB Key的潜在不安全因素,现在我们就来看看如何应对。

关于键盘木马,有一些“软”的方法可以在一定程度上进行遏止。例如“软键盘”,就是不再让用户通过键盘来输入USB Key的个人识别码(PIN码),而是在屏幕上显示一个虚拟键盘,用户需要通过鼠标点击虚拟按键来输入PIN码。事实上不仅仅是USB Key的PIN码输入采用这种方式,一些网银在不使用USB Key的,但是又需要更高级别安全性的一些地方,也采用“页面虚拟键盘”的方式,例如建行网银的登录页面就是这样的设计。还有一些USB Key的提供商也在键盘驱动上做文章:黑客不是想截取我的输入吗?好,我让你截个够!当进入PIN码输入状态的时候,底层键盘过滤驱动就自动产生无数的按 键信息发送给上层软件,將真正的用户输入淹没在极大量的随机击键事件中,让键盘木马难以得知哪些是真的用户输入,哪些是假的。当然,上层软件知道其中的猫 腻,可以从杂乱的数据中滤出真正的用户输入。

然而,这些方法都是治标不治本的,因为要完成持有者身份验证,就要將PIN码发送给USB Key,这PIN码总归会出现在电脑的内存中,这些方法只能够在一定程度上增加黑客破解的难度而已。

好了,我们不说这些小儿科的应对方法了,要真正提高USB Key的安全程度,就需要从USB Key的硬件使用方式上入手。

对付键盘木马这种攻击方式,根本的解决方法就是根本不用输入PIN码。嗯,不输入PIN码,那么USB Key怎么知道我就是合法持有者呢?别着急,我们有生物识别技术啊,说白了,最常见的就是指纹识别了。在USB Key上集成一块指纹扫描装置,当需要验证持有者身份的时候,就刷一下指纹,OK,验证通过,可以转帐了,这比记一个USB Key的PIN码还方便,不是吗。而且,指纹的扫描、特征比对都是在USB Key内部完成,根本不与电脑发生任何关系,这就让黑客无计可施了。这样的“指纹USB Key”已经出现在市场上了,北京农村商业银行的“金凤凰网银”就采用了这样的指纹USB Key。

不过并非只要是指纹USB Key就一定安全,如果USB Key上的指纹扫描与识别没有很好的有机结合的话,其中仍然是有漏洞的,例如,如果把指纹扫描的数据传回电脑,由电脑进行指纹特征信息的比对,或者再由电 脑將扫描的数据或者特征信息送回USB Key进行处理,黑客就有可能截取到指纹扫描得到的数据,进行“数据重放式攻击”。所以,安全的USB Key一定是由USB Key自己完成整个指纹扫描、特征值提取与比对的全过程的。

然而,指纹USB Key也有其缺点,就是技术含量高,但是成本也高。就目前为止,国内唯一一家能够提供指纹USB Key的厂商是北京飞天诚信科技有限公司。要想指纹USB Key能够广泛的应用起来,还需要时间。

那么,將键盘和USB Key结合起来,使得PIN码不用通过电脑传到USB Key,不也一样安全吗?是的,带键盘输入的USB Key也比较安全,但是请低头看看你的键盘右侧的数字键区域,只是加入0~9这几个数字键,就需要增加不少的体积,这对于需要满足“随身携带”这一特点的 USB Key来说,体积实在是大了些,不够实用。不过我想,随着技术的发展,超薄键盘、折叠式键盘、投影式虚拟键盘可能会改变这一状况。嘿嘿,想想投影式虚拟键 盘,有点科幻的味道,不过这一天的到来应该不远了~~~

好了,成本高不合适,体积大也不合适,既然目前没有从根本上解决问题的合适的方法,我们就换个思路吧,不要忘了,一切安全性都是相对的~~~

既然黑客总是能够通过各种手段得到USB Key的PIN码,然后在用户没有发觉的情况下完成网上交易,那么,如果我们能够在每次需要USB Key来证明自己身份的时候,需要用户手工干预一下才能完成验证过程,是不是就能够解决这个“不知不觉中” 账户里的钱就不翼而飞的问题呢?事实上这样的USB Key已经出现了,国内的几家主要的USB Key厂商都纷纷推出了这种“按钮USB Key”。这种类型的USB Key比普通USB Key多了一个按键,当需要转帐的时候,就需要用户按一下按键,否则USB Key拒绝使用内置的密钥来证明你的身份(进行数字签名),也就无法完成网上交易。有了这个按钮式USB Key,你的每一次网上交易就明明白白了:只要有网上交易,一定是有人明确的按了这个按钮,而只要这个USB Key没有丢失,那就一定是你自己干的了。即使黑客得到你的PIN码,他也无法通过网络伸手到你的电脑前按一下这个按钮吧!!

好了,按钮式USB Key,这下安全了~~~

安全了?安全了?我带上黑客的帽子,在一边得意的笑,我得儿意的笑,我得儿意的笑~~~~

欲知“按钮USB Key”为何不安全,又如何应对其安全漏洞,请关注本文连载之五。

五、

好久没有写日志了,倒不是这段时间没有所思,而是思得太多,做的也更多,也就没有时间写了。好了,言归正传,下面我们接着说说《谈谈网银和USB Key (四)》中最后提到的“带确定按键的USB Key仍然不够安全”的原因。

是的,带确定按键的USB Key可以做到每次使用硬件内部的私有密钥时都是持有者明确授权的(即持有者做了按下确认键的操作),但是不要忘记,你能保证被签名的数据就一定是你想要签名的数据吗?这句话听起来有点绕口,那么我们来举一个例子:

特别注明:本文中所提到的商家、银行、地点、人物等均为举例方便而用,没有任何明确或隐含的意义。如有雷同,那一定是你踩到狗屎了~~~

假如你正在淘宝上买东西,购物车里塞满了满意的商品,终于,你决定购买了,于是开始下订单,但是发现你的淘宝账户上余额不足。这是个小问题,因为我们可以 立即使用网上银行转账到淘宝账户上。OK,你来到支付宝,选择已经开通了网上银行功能的银行,然后点击“现在就转账”,终于进入了网上银行转账的页面。

……其实,以上都是废话,因为我们不过是要提到网银转账的页面而已。不过,这可是我使用淘宝的真实流程哦……

在网银的转账页面上,一般需要提供三个信息:你的账户、对方账户以及转账金额。其中,你的账户是你在登陆网银时就隐含提供了,对方账户则需要你填写 (如果是向淘宝这样的商家转账,网上支付系统会自动填写),转账金额也要你填写(当然,如果是向一些商家转账,网上支付系统也会自动填写)。现在你小心翼 翼的填好了所有的内容,并仔细的检查了三遍,一切无误,可以转账了。于是你点下“转账”按钮,网页上提示:请按USB Key的确认键以继续转账操作。当然,因为一切无误,所以你按下了确认键,然后系统提示你:转账已成功!

好了,现在回到淘宝网站,下单吧~~~ :) 等等,为什么淘宝还是提示你余额不足?!无奈之下你只好给银行客服人员打电话,在核对了你的身份之后,你终于等来了一个噩耗,客服MM用甜美的声音告诉 你:对不起,我们的系统记录显示,您刚才确实有一次网上交易的操作,不过对方账号的开户行位于广州,是由一位名为“贺爱客”的先生持有的私人账号。[题外 话:招商银行信用卡部的客服MM服务真的是一流,业务熟练,声音甜美,而民生银行方面就稍微逊色一些,一个小问题也要等她跟技术方面确认才能回答,希望这 只是个例]

“贺爱客”?!鬼知道这是个什么人物,怎么你的钱就转给他了呢?现在你的脑袋里一片空白~~~~

……好了,不用空白了,让我来告诉你发生了什么事吧!通过远程注入、恶意浏览器插件、函数挂钩等诸多手段,你所填写的数据在准备送给USB Key进行数字签名之前的刹那,被修改了!对方账户不再是淘宝,而是“贺爱客”。然而USB Key本身并无法得知你要给谁转账,它只能机械的等待你确认,然后对传入的数据进行签名。从电脑屏幕上来看,数据一切正常,但是到了USB Key内部,就已经大不一样了。这正是三十六计之中的“偷梁换柱”。咳~~咳咳~~~不要把老祖宗留下来的好东西拿来干坏事啊!

偷梁换柱并不是什么困难的事情,最简单的就是使用浏览器插件。尤其是对于IE这种“公共厕所”级别的浏览器,随便谁都可以过来插一脚。曾经有朋友向 我抱怨电脑上网越来越慢了,我检查了一下他的系统,发现IE中加载了几十个插件:三个工具栏插件、十几个用于网上看电影的插件、两个网银用到的插件、四个 下载加速插件、PDF阅读插件、金山词霸插件、还有七八个不知道是什么东西的插件。我问他为什么装这么多插件,他还一头雾水的问我,插件是虾米东东??

难道说,在这样一个饿狼环伺,危险重重的恶劣网络环境下,我们就无法安全的使用网上银行,享受足不出户就能指点天下的便捷吗?

你可能感兴趣的:(PKI安全体系)