Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

HTTP下的密码传输安全

  一些需要高度通信安全的网站通常会采用HTTPS作为通信协议,但是HTTPS的部署与使用非常麻烦。如果只是一些没有过高通信安全需求的网站就没必要搞HTTPS。但是一些最基本的安全性还是需要保证的,比如用户登录时的密码数据传输。传统的Web对于这个环节没有太多的忌讳,都是直接使用明文传输的密码。但是对于现在这种网络环节如此复杂的现代网络,我们无法保证自己所处的网络环境的安全性。这样再使用明文传递密码就可以在传输过程中被截获。
  那么,不使用明文传递密码如何和服务器通信呢?这其实很简单,我们可以利用MD5的不可逆加密来传输密码。当然也不可能直接给密码加个MD5,因为那样生产的散列字符串没有时效性,只要密码没修改都有效。所以我们必须在这个字符串中加入一些时间元素来使这个这个密码变成一个临时密码,这样的临时密码即使被截获了也会因为时效性原因而无法利用。下面是一个简单的实现
<style>
table th {text-align:right;}
</style>
<table>
  <tr>
    <th><label>用户名</label></th>
    <td><input id="uid" /></td>
  </tr>
  <tr>
    <th><label>密码</label></th>
    <td><input id="pwd" type="password" /></td>
  </tr>
  <tr>
    <th></th>
    <td><input id="sbm" type="button" value="提交" /></td>
  </tr>
</table>
<script src="jquery-1.9.0.min.js"></script>
<script src="spark-md5.min.js"></script>
<script>
//为了方便这里使用了JQ,md5使用了spark-md5
$("#sbm").click(function(){
  var p,u,t,h;
  //获取基本信息
  //本来还应该做个表单验证,这里省略了
  p=$("#pwd").val();
  u=$("#uid").val();
  t=new Date().toGMTString();
  //先将密码MD5一次,因为密码在数据库中一般是MD5保存的
  //也许不是纯MD5,会附加一些什么信息也可以在这里完成
  p=SparkMD5.hash(p);
  //把密码和时间连接起来MD5,作为临时密码使用
  //为了安全性也可以在这里加入一些其它东西来提高混乱程度
  h=SparkMD5.hash(t+p);
  //返送Ajax请求,去服务器验证
  $.post("login.php",{
    uid:u,hash:h,time:t
  },function(e){
    e=$.parseJSON(e);
    alert(e.msg);
    //TODO
  });
});
</script>
//login.php
//只是演示就不连接数据库了
//这里的用户名和密码保存在常量中
define('uid','123456');
define('pwd',md5('abcdef'));
//验证时间,允许误差两分钟
time()-strtotime($_POST['time'])<120
  or die('{"err":1,"msg":"参数超时!"}');
//验证用户名
$_POST['uid']==uid
  or die('{"err":2,"msg":"用户名不存在!"}');
//验证密码
md5($_POST['time'].pwd)==$_POST['hash']
  or die('{"err":3,"msg":"密码错误!"}');
//TODO
die('{"err":0,"msg":"登录成功!"}');
  像这样做个简单的MD5就可以让登录密码明文不泄漏。但是这也有个缺陷,就是客户端时间必须准确,虽然服务器程序上设置允许两分钟的误差,但是如果客户端的时间差太多就无法登录。解决的方法可以使用临时token,就是让客户端不用时间作为凭证,而是登录前去服务器取个凭证然后用这个凭证做临时密码。这个方法虽然可以解决问题,但是需要消耗一次HTTP请求。目前最简单有效的方法就是这个,至于在项目中如何取舍就看开发者自己的意愿了。
  下面是这个例子的压缩包:
    HTTP下的密码传输安全.rar
网名:
54.161.8.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^