12月 242009
 

前几天听 bugs 说,国内某C2C网站打算这个月开始禁止Firefox用户登录其网站,而说到原因,又是“出于用户安全考虑”,“Firefox无法支持其‘安全控件’”云云。

我没用过这家公司的服务,因此我也不想就这家公司发表什么评论。我觉得很有意思的一件事是,似乎大家都很信任所谓“安全控件”。

那么,什么是“安全”控件呢?简单地说,这类控件是由特定商家发布的,基于ActiveX技术实现的一种Internet Explorer插件。尽管不同的公司会以不同的方式进行实现,但这类插件通常会实现的功能,不外乎以下几种:

– 替代输入框,防止其他程序通过hook的方式得到输入框中的内容。
– 以更直接的方式从键盘读取数据,防止非本机键盘输入数据和其他程序监听键盘输入。
– 确保内存中没有某些应用程序正在运行。

很遗憾,“安全控件”往往并不能理想地达到上述目的。更有甚者,事实上这些控件几乎一定会破坏系统的安全性。

为什么这么说呢?我们人类有历史以来,从正确的假设或前提出发,都有可能会得出错误的结论;那么,从错误的假设出发,能够到达正确结论的可能性有多大呢?可想而知。

那么,回到我们刚才的话题,为什么说基于ActiveX的“安全”控件几乎一定会破坏你的系统安全呢?错误的假设又是什么呢?

首 先,在我们讨论安全系统的时候,人们往往会忽略这类系统中最重要的那个环节——用户。用户之所以是安全系统中最重要,同时也是最薄弱的环节的原因是,尽管 我们能够精确地预计机器的行为,却无法精确的估计人类的行为;我们见到抢劫银行的罪犯用枪指着工作人员或人质,却很少有人用枪指着银行使用的计算机系统 ——因为人,在一个安全系统中,也只有人是机器的最终主宰。

给用户一个保险柜,却完全不给他或她机会去了解这个保险柜的工作原理,谁又能 保证,这个用户不会把保险柜放在楼顶,任由风吹日晒雨淋,令其失去作用?这是所谓‘安全’控件的头号问题,即,它既没有真正加强用户的安全意识,也不给用 户了解它的工作原理的机会。对于用户来说,这个保险柜是个黑箱,它安全不安全,只有老天知道(为什么说它的作者也不知道呢?且看下文分解)。

“安全”控件危害安全的另一个原因是,它在鼓励不安全的用户习惯。

熟 悉Windows操作系统的朋友都知道,在Windows Vista之前,安装Active X控件是需要管理员权限的。也就是说,想要安装所谓的“安全”控件,其前提便是用户至少要以管理员身份打开1次用于安装该控件的软件,或者下载一个安装程 序,并以管理员的身份运行它。

有多少非专业用户会以非管理员身份上网呢?这个数字接近0,说接近0的原因是,有一些被他们认为很“变态” 的IT人员“挟持”的用户真的不是用管理员身份浏览网页的,为什么不能安装这个Active X控件?他们恨恨的想。随后,他们以各种方式得到了管理员权限,并安装了“安全”控件。

到现在为止,用户的安全还没有受到非常明显的伤害。但是,用户很快会发现,以管理员身份使用计算机很“方便”——没有了磁盘配额的限制,没有了各种各样让人讨厌的限制——凭什么不让我安装Active X?这个系统管理员真讨厌!

又过了一段时间,用户发现计算机越来越“好用”了。各种各样的工具条在系统中如雨后春笋一般出现,之后,打开浏览器时的首页也变得越来越“好看”,一些网页上还十分“贴心”地将关键词增加了连接指向不同的地方。“真不错”,用户想,“这才是我想要的电脑的样子”。

这并不可笑。

ActiveX无非是在诱惑用户使用管理员权限。它在破坏安全,而不是改进安全——因为写ActiveX“安全”控件的人,并不真的理解安全。

那么,话说回来,当用户改变了其良好的安全习惯之后,他得到的是什么呢?

表 面上看,“安全”控件能够防止使用hook的程序获得用户输入的敏感数据,但是事实上这个没有任何作用。在用户的安全习惯改掉之后,最简单的办法,就是让 他访问不到真正的网站,并诱使其输入那些敏感数据。举个更通俗一些的例子,把家里大门上了三道防盗门,但是没关窗户,窃贼仍然可以进来。

很 遗憾,这很浅显的道理,应用到计算机上,往往就被人们遗忘。做安全的人,就像是人民警察,需要关注每一个细节;而想要破坏安全的人,就如同小偷,可能从任 何一个没有被看到的地方进来。安全是一件困难的工作,因为防守的一方,不应该采用任何可能导致问题的办法去防御;而攻击的一方,则可以采用任何手段。

安全靠的是智慧、汗水,向公众普及安全知识,以及与用户的合作,而不是ActiveX。我不相信缺少智慧的做法会改善安全,也不相信从错误的假设能够到达正确的彼岸。

 Posted by at 下午 8:05
11月 232009
 

原来以为OAuth是解决登录问题,初步了解了一下,感觉是在解决服务授权问题; 和openid不是一回事儿,他们解决的问题不同;
根据我的理解OAuth并不神秘,而且像这样的服务授权问题,SSO里面已经有这种功能了,Proxy ticket似乎就是解决这种问题的,我们的SSO很多情况下也是在做这样一件事情。至于为什么要有OAuth,还需要继续了解OAuth。

 Posted by at 上午 8:51
9月 162009
 

简单地说,登录就是输入用户名、密码,点击登录按钮就行了;但是到现在为止,我做登录已经两年了,如果真的这么简单,我这两年真就白活了;
其实,登录里面也有很多学问呢,做登录我们要考虑很多安全方面的问题,如:
一、防止扫密码
二、防止cookie被盗
三、防止密码被盗

每一个问题都很难做到像数学里描述一个逻辑那样的严谨,否则用户就必须符合很多条件才能上网了。

我们这里先讨论一下登录的问题,首先登录面临两个问题:
一、密码不能明文传输
二、登录使用的请求信息不能被截获,或者说即使被截获也不能使用

要解决这两个问题,下面给出几个解决方案:
一、使用https
登录

   优点: 只需要修改一下协议,就可以解决两个问题,做起来比较简单
   缺点:
         1. https 需要购买证书,是要花钱的,每年大概3000~10000不等
         2. 不是所有的客户端都只是https的
         3. 如果客户端的时间差的太多,也是无法访问https的
         4. 证书吊销列表的下载也影响登录的速度
         5. 浏览器对https有很多的安全限制,使得https和http之间的切换可能会有警告对话框
         6. 。。。

二、 使用login ticket的方式

   1. 提交用户名、密码之前先从服务器获取一个登录使用的票据lt,以lt为key存到mc里面吧
   2. 使用username=xxx&password=md5(password+lt)&lt=xxx 登录
   3. 根据lt查mc,如果存在,在根据username取password,做md5后比较;如果lt不存在,则该请求视为过期或重复请求

   优点:
      1. 不需要使用https
   缺点:
      1. 多一次请求
      2. 客户端需要做md5的代码,md5.js 压缩后也6k多了


三、 使用nonce的方式

   1. 使用username=xxx&password=md5(password+nonce)&nonce=yyyyy&timestamp=time_of_client_now 登录
   2. 服务器端的检查过程:
      if (timestamp + 5mins < server_time_now && md5(username+nonce) not in mc && 检查密码 && 将md5(username+nonce) 写入mc) 登录成功 else 登录失败
  
   优点:
      a. 一次请求就可以完成
      
   缺点:
      a. 对客户端的时间要求比较苛刻,不允许客户端时间比服务器快,不允许客户端比服务器时间慢超过5分钟

   该方式适用的情况: 客户端和服务器基本保证时钟同步


四、 该方式是二、三的结合

   1. 提交用户名、密码之前先获取一下服务器的时间timestamp
   2. 使用username=xxx&password_md5=md5(password+timestamp)&timestamp=time_of_server_now 登录
   3. 服务器端的检查过程同三、2.

  
优点:
1. 与二相比,第一次请求不需要写mc,实际登录成功之后才写mc

        


 Posted by at 上午 8:54