在“谈谈网银和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,他也无可奈何。这就意味着,使用公开密钥技术,可以保证只有指定的人(其实就是指定的私钥啦)才可以阅读私密信息。
说实在话,本没有想到这个问题会困惑我长达两天的时间的,原本计划用一天时间就搞定的。 :(
因为要做一个使用智能卡证书登陆网站做交易的演示网站的,没成想,会卡在验证数据签名这个问题上。将过程写在这里,留作将来反思。
背景:
后台使用Apache2+PHP5+MySQL4,前端使用IE。运用JQuery来增强用户体验(Ajax的无刷新显示数据)。
实现过程:
后台其实是早就做好的,因为我经常需要测试一下Mantis、写点自动构建/测试系统什么的,APM经典系统已经是证实了没有问题的(郁闷的是后来发现是有问题的,而且折腾了我近一天时间)。而使用JQuery来做Ajax支撑是最近开始学习的,感觉那是相当的爽,但是因为是新学,所以信心不是特别足。
既然要使用数字证书进行网站登陆,那么后台Apache配置mod_ssl是少不了的。这不是什么难事,很快就搞定,而且也使用openssl.exe制作了根证书、服务器证书,以及两个客户端证书。测试了一下,https方式访问没有问题。于是就开始写代码。
第一个卡住我的问题是CAPICOM控件的问题。使用微软的PlatformSDK提供的示例是无法工作的。晕死!!!我改,我改改改~~~我用VBScript来调用CAPICOM控件,我再用JavaScript来调用VBScript写的函数!!!这也行,太有才了~~~居然可以直接在JScript和VBScript之间来回调用,传递参数和返回值,强啊。 (说我吗?不是的哈,是M$,太强了~~~)
![Apex[有所思,有所志]](http://apex.ncksoft.com/wp-content/themes/deepwater/images/dw_site_logo.png)