当前位置: 首页 > 图文教程 > 网络安全 > 安全基础 > 用户口令保护新招(1)

安全基础
硬盘双击无法打开的问题该怎么办?
XP每次启动后都检测硬盘?
检查电脑是否中病毒和木马的顺序
机器中QQ木马病毒的异常现象
免费的P2P终结者对付无节制的P2P下载
有效控制局域网里的P2P下载
出游拍摄,MP4突然断电该怎么办?
IE浏览网页弹出窗口的应对办法
打开U盘最安全的操作
IE 浏览器被6700.cn强制设置主页的解决
狼牙抓鸡器(又称狼牙全自动抓鸡器)简介
禁用移动硬盘插到USB口自动播放功能
Wsyscheck进程工具清除IE截取器病毒
命令行法检测局域网ARP病毒电脑
Ping命令你真的知道怎么用吗?
无线网卡标准设置不当引起不能上网
不登录Hotmail接收Hotmail邮件到Gmail
清除病毒和木马之后Windows桌面找不到?
记事本也能杀毒,你相信吗?
为什么有时ADSL虚拟拨号时会失败

安全基础 中的 用户口令保护新招(1)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-28   浏览: 107 ::
收藏到网摘: n/a

   经常有读者询问,如何在其站点上使用JavaScript,以确保用户登录时的口令不会外泄。对于这样的问题,我的第一反应就是告诉他们使用SSL(安全套接字协议层)。如使用正确,SSL对于安全要求较高的Web应用是最佳的解决方案。但是,也有相当一部分开发者,他们的Web应用对安全性的要求并不高,因此他们并不希望访问者使用SSL 登录。

  Web应用一般使用一种叫做“会话状态管理”(Session State Management) 的技术来追踪和管理浏览器与服务器之间的相互活动。因为每个浏览器的浏览要求相对于其他浏览器都是独立的(正如超文本传输协议中定义的那样),所以Web 应用必然使用某些技巧,如Cookie、隐藏表格字段、或重写URL,它们可以识别出服务器与某个浏览器进行的独立会话。大多数的服务器端编程环境(如ASP、PHP、ColdFusion等)都使用Cookie。

  会话状态管理的问题在于从根本上讲它是不安全的。这些被用来管理会话状态的Cookie、表单值、或URL要在浏览器和服务器之间往来传送,黑客可以在途中拦截它们。一旦拦截成功,黑客就可以利用这些信息强行接管用户会话。

  在大多数服务器端脚本编写环境里,你都可以采取一些措施以减少此类泄密的发生。例如,你可以为Cookie设定很短的使用期限,应用“难预期会话状态”信息。然而,最安全的解决方案还是使用SSL。使用SSL,不论用户口令,还是会话状态信息都会受到保护。

  如果你不使用SSL,那么可以要求用户对你的应用中的每个敏感页进行重新认证。但是,从用户的角度来讲,这种方式未免太过麻烦。总之,你必须清楚你和你的用户究竟愿意承担多高的风险。如果口令泄露的风险过高,你就需要使用SSL建立应用。如果你不能使用SSL,可以采用基于MD5的登录方式作为代替。它至少可以保护你的用户的口令免于外泄。另外,再选用一种可以防止会话状态信息被窃的服务器端脚本编写技术。

  通常,如果一个用户不使用SSL登录(即原来的HTTP),那么从离开浏览器直到到达目标网络服务器的这段时间里,用户口令都处于无保护的暴露状态,正如下页中的图表所示。

  不过,我们可以利用一种不可逆的函数开发一种登录方案,利用这种方案就不会暴露用户的口令。函数是集合的元素之间的一种对应关系,在从集合A到集合B的函数中,A中每个元素在B中都有一个唯一的元素与之相对应。不可逆函数在计算上很难逆转——即给定集合B中的一个元素,很难确定在集合A中的哪个元素与之相对应。

  这好比是一台碎纸机。把文件放入碎纸机中销毁是很容易的。但是反之,如果要把销毁后的碎纸屑重新拼凑成原文可就难上加难了。

<B>采用MD5解决方案<B>

  当今最流行的不可逆函数应用程序之一就是由Ronald Rivest开发的MD5算法。Ronald Rivest还是著名的RSA(Rivest,Shamir,Adelman)加密算法的开发者之一。MD5算法能为任何长度的信息生成一个16字节大小的“数字指纹”。这个信息可以是一个字符串、一个文件、一个文本流或任何其它形式的字节序列。在RFC1321中有MD5算法的详细描述。

  我们要开发一种使用MD5算法的登录方式,用以保护从一个浏览器发送至网络服务器的用户口令。

  当一名用户对某个网络应用提出登录请求时,其网络服务器就会提供给用户一个登录表格。这是一个带有随机生成值的表格。其中的随机生成值由服务器端脚本从一个数亿记的取值空间中随机选取生成。
<img src="/upload/tech/20091028/20091028141537_cd00692c3bfe59267d5ecfac5310286c.gif">

  用户在登录表格中输入他或她的用户名和口令,用户端脚本给口令附加一个随机值,然后用MD5不可逆算法对结果进行计算。再用计算得出的值代替原口令。我把这个值称为MD5口令。

  最后,用户端脚本把用户名和这个MD5口令发送到网络服务器。因为在浏览器与服务器之间传送的是MD5的运算结果,所以任何人都无法通过计算得出用户所输入的原始口令。
<img src="/upload/tech/20091028/20091028141538_26e359e83860db1d11b6acca57d8ea88.gif">

  网络服务器在接收用户名和MD5口令后,会执行与用户浏览器相同的运算。它给用户口令(从服务器的被保护区域中提取)附加上随机值(即已发送给用户的随机值),并计算出正确的MD5口令值。然后网络应用程序把这个值和它从浏览器收取的值相比较。如果两值相等,网络应用程序就会生成一个服务器端会话变量,证明此用户身份正确。
<img src="/upload/tech/20091028/20091028141540_8cb22bdd0b7ba1ab13d742e22eed8da2.gif">

  说到这里,你也许会置疑使用随机值的必要性。其实,这个随机值是用来防止再度攻击的。如果只有原始用户口令通过MD5,那么相应得出的MD5口令就会总是同一个值。黑客只要截获MD5口令就同样可以登录进入网络应用。使用了随机值后,每次登录时生成的MD5口令都是唯一的,这样就避免了上述问题的出现。

<B>JavaScript实现</B>
  在JavaSc