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

安全基础
IE浏览器防黑十大秘籍,黑客也没招
网络工程师讲解系统安全漏洞的形成和防治
清除导致XP系统反复重启的新网银木马
识破QQ欺骗网络地址的几种方法汇总
安全基础知识 细说暴库的原理与方法
排除无线突然中断故障实例
强搜天线 搜出WiFi世界的安全漏洞
网管应用技巧 内网安全十大策略说明
如何修改局域网内部打印机的IP地址
如何找出IIS中隐藏的网站
EFS加密技术的概念分析及一次解密经过
提高Windows XP系统安全性要关闭的10种服务
PHPBB 2.0.22 MOD版最新注入漏洞
修复Windows系统忘记密码的9个高招
用SockOnline软件轻松突破端口限制
安全基础知识 最强0到33600端口详解
执行文件方式加密FLASH文件的解密方法
网吧被入侵后的应对解决方法
网页“黑手”如何攻击你的Windows系统
不要让别人读了你的信 谈私密数据保护

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-28   浏览: 35 ::
收藏到网摘: 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