安全中国首页 > 文章中心 > 安全防护
 
安全中国网友投稿专用上传FTP空间:
Ftp服务器:download.anqn.com
Ftp端口:21
用户名:anqn
密 码:anqn.com
 

安全登录的跨平台解决方案V1.1

更新时间:2007-11-27 9:21:38
责任编辑:果果龙
热 点:
三. 跨平台的解决方案

1. 解决方案

我这里的方案是一个思路,不局限于语言。如果不想跨平台你可以使用ActiveX实现,如果需要跨平台可以使用java applet实现,甚至还可以使用flash来实现。利用的方法主要是随机键位的软键盘以及RSA非对成加密。RSA也是一个很有意思的东西,可以看看《RSA非对称加密的一些非常规应用》,地址为http://www.icylife.net/yunshu/show.php?id=471

目前常见的登陆都是html等语言作的,然后调用ActiveX控件或者java applet来输入密码。其实,最好的解决方案是直接使用java applet作一个form,用来接受用户名和密码,做出相应的处理后再登陆。

首先,在服务器端生成一对2048位的RSA密钥,私钥保存好,公钥则发布到网上,让客户端可以通过类似http://www.test.com/login/publickey.txt的域名来进行访问。

其次,在客户端用java applet作一个form来等待用户输入。用户名常规方法输入,而密码框得到焦点时,弹出虚拟键盘。键盘每个键的位置随机出现,防止别人记录。而在 java applet中,有一个变量real_pass,在用户点了一个键,比如说是点了a的时候,real_pass += ’a’,同时在密码输入框中随机输入一个字符,直到用户密码输入完成。这个时候,真实的密码记录在real_pass变量中,而密码输入框中是一个伪造的密码。

再次,用户点击提交按钮的时候,客户端从服务端获取RSA公钥,对real_pass进行RSA非对称加密,然后提交到服务端等待认证。

2. 优势

最明显的优势是使用了java applet来进行客户端操作,而java是可以跨平台,跨浏览器的。因此firefox用户,linux用户都可以成功的使用。其次,java是一种安全的语言,不会存在ActiveX自身容易出现的缓冲区溢出等安全问题。

3. 缺陷

使用java applet的缺陷主要有三点:第一,jre过于庞大,而且还没有普及到所有的用户当中;第二,jre也出现过一些溢出类的安全漏洞,因为jre本身是使用c写的;第三,java applet的运行速度不如ActiveX快。当然,可以使用ActiveX技术实现同样的思路,只是那样就不能跨平台了,违背了设计的初衷。

四. 总结

这个只是安全登陆的一个思路,和具体的语言以及平台都没有关系,可以用java applet实现,可以用ActiveX实现,甚至还可以使用js来实现,只要你能用js画出那个键位随机的键盘,后面的真假密码,以及RSA加密等js 实现起来就不难了。其实js也是个不错的选择,而且还没有客户端环境需求。关于钓鱼的内容,我们team的刺写过一些文章,我就不多说了。本文可以随意转载,但是请保留出处和版权,并且不得用于商业用途,谢谢。

五. 补充

下午写完这个方案后发布到了我们team的blog和邮件列表,算是1.0版本。后来和刺,螺螺做了一番讨论,还谈到了上面说过的《RSA非对称加密的一些非常规应用》中关于代替https的部分。这里确实存在一个安全缺陷,因此作了这个补充,算是这个方案的1.1版。

主要是因为用JS来实现RSA加密代替HTTPS,也存在中间人攻击的问题。明文传输的JS中保存了public key,攻击者可以作中间人,在客户端请求服务端的时候,替换掉这个public key,从而得到传输的密码。

在现在提出的这个解决方案的1.0版中,我提出"在服务器端生成一对2048位的RSA密钥,私钥保存好,公钥则发布到网上,让客户端可以通过类似安全的。这么作的原因是可以很方便的修改public href="http://www.test.com/login/publickey.txt的域名来进行访问。“这样其实是不够安全的。这么作的原因是可以很方便的修改public" target=_blank>http://www.test.com/login/publickey.txt的域名来进行访问。“这样其实是不够安全的。这么作的原因是可以很方便的修改public key而不用重新编译java applet或者flash程序,但是带来的后果是如果有人在传输这个public key的时候劫持了会话,可能会自己生成一对RSA密钥,将其中的公钥作为真实服务器的公钥传递给登陆用户,最终可获取传输的明文密码。

解决这个问题并不困难,有两个办法:第一,可以使用https的方式来传输这个public key,像https://www.test.com/login/publickey.txt这样来访问。在出现证书报警的时候提示用户不要进行下一步操作,终止整个登陆过程。这样public key依旧可以方便的修改而不用重新编译。如果要更高的安全性,可以整个过程都使用https来进行。第二,如果因为HTTPS会给服务器带来较大运算压力而又不想买硬件加密卡,也可以将public key直接写在java applet或者flash中。这样不用每次去抓取public key,只是定期更换public key会比较麻烦,需要重新编译java applet或者flash程序。

最后,说一下屏幕截取。刺提起过这个问题,其实我在构思这个解决方案的时候,就想到了这种攻击。不过屏幕截取来查看用户的鼠标点击,还是比较困难的,难以截取准确的时间段。防御的方法,或许就只能写驱动了。

关于刺的文章,可以在我们的blog查看,url为腾讯的注册那里,使用的js加密代替https的方法,可以看我以前写的文章。他们会不会买硬件加密卡了?呵呵。 href="http://pstgroup.blogspot.com/2007/11/tipsqqrsa.html。腾讯的注册那里,使用的js加密代替https的方法,可以看我以前写的文章。他们会不会买硬件加密卡了?呵呵。" target=_blank>http://pstgroup.blogspot.com/2007/11/tipsqqrsa.html。腾讯的注册那里,使用的js加密代替https的方法,可以看我以前写的文章。他们会不会买硬件加密卡了?呵呵。

上一页 1 2 

 
相关文章
一日一文章
 
一日一软件
一日一动画