找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 2782|回复: 2

【PHP】一个看起来比较安全的登录方式的PHP实现

[复制链接]
发表于 2014-11-6 17:00:28 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
所谓“安全”指的是:
1、服务器不直接存储密码。因此当有人要黑服务器的时候,他只能看到一个用户名和一串MD5的字符串。
2、POST的过程中,不直接传输密码到服务器。这样免得有人用抓包软件,抓取你的POST包,然后看到密码。

之所以用MD5是因为MD5是不可逆的算法(就目前而言),因此当密码被转换成MD5字符串的时候,就不能再转换回来。

思路:
1、用户注册的时候,服务器存储用户名密码的md5值。注册的页面调用JavaScript将密码处理为MD5字符串,然后Post给服务器。

2、用户登录的时候(访问login.php),服务器生成一个随机字符串,然后把随机字符串发给用户的浏览器(用户看不到)。

3、用户输入了用户名和密码的时候,点“提交”,然后用户的浏览器将密码处理为MD5字符串,再把这个MD5字符串和服务器发来的随机字符串以一种特定的算法进行混合、加密,再POST发给服务器。

4、服务器收到POST包后,从POST包中取得先前发送给用户的随机字符串,然后再根据服务器数据库存储的用户的密码的MD5值与刚才取得的随机字符串进行相同的算法的混合、加密,对比用户POST包中提交的已加密的字符串,来判断用户是否正确输入了密码。是,则判定用户已经登录。

PHP代码如下:
  1. <?php
  2. //测试用的用户名:0xAA55
  3. $UserName="0xAA55";//用户名存储在数据库

  4. //测试用的密码:abcd1234,注意区分大小写
  5. $Password="abcd1234";//密码不存储在数据库中
  6. $LogKey=md5($Password);//数据库存储的是密码的MD5值

  7. ?>

  8. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  9. <html>
  10.         <head>
  11.                 <meta http-equiv="Content-Type"content="text/html;charset=gb2312"/>
  12.                 <title>登录</title>
  13.                 <!-- JavaScript的MD5算法需要自己实现,因此需要一个md5.js的文件。 -->
  14.                 <script type="text/javascript" src="js/md5.js"></script>
  15.                 <script type="text/javascript">
  16.                 function SubmitLoginForm()//这是用户点提交按钮时执行的程序
  17.                 {
  18.                         var PW=document.getElementById("password");//取得用户输入的密码
  19.                         var Key=document.getElementById("speckey");//服务器提供的随机字符串
  20.                         PW.value=StringMD5(StringMD5(PW.value) + Key.value);//混合、加密
  21.                         document.getElementById("LoginForm").submit();//提交给服务器
  22.                 }
  23.                 </script>
  24.         </head>
  25.         <body>
  26. <?php

  27. //如果浏览器没有POST用户名,则产生一个登录的表单
  28. if(empty($_POST["Username"]))
  29. {//产生一个登录页面
  30.         $Seed=md5(date("YmdHis") . rand(100,199));//生成随机字符串
  31.        
  32.         //表单
  33.         echo'<form id="LoginForm" action="login.php" method="post">';
  34.        
  35.         //经典的“用户名”“密码”表单
  36.         echo'        用户名:<br/>';
  37.         echo'        <input type="text" name="Username"/><br/>';
  38.         echo'        密码:<br/>';
  39.         echo'        <input type="password" id="password" name="Password"/><br/>';
  40.        
  41.         //服务器发送随机字符串给用户的浏览器
  42.         echo'        <input type="hidden" id="speckey" name="speckey" value="' . $Seed . '"/><br/>';
  43.        
  44.         //提交按钮
  45.         echo'        <input type="button" value="登录" onclick="SubmitLoginForm()"/>';
  46.         echo'</form>';
  47. }
  48. else//浏览器POST用户名,那么检测用户输入的密码是否正确
  49. {
  50.         //验证登录
  51.         if(        $_POST["Username"] == $UserName && //如果用户名正确
  52.                 $_POST["Password"] == md5($LogKey . $_POST["speckey"]))//密码也匹配
  53.         {
  54.                 echo"登录成功!<br/>";
  55.         }
  56.         else
  57.         {
  58.                 echo"登录失败!<br/>";
  59.         }
  60. }
  61. ?>
  62.         </body>
  63. </html>
复制代码
MD5的JavaScript代码,请看此贴:http://www.0xaa55.com/thread-984-1-1.html
回复

使用道具 举报

发表于 2014-12-31 18:09:16 | 显示全部楼层
感觉客户端进行JS加密很容易破解
MD5破解目前来说很容易
感觉比较安全就HTTPS和浏览器插件了
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2014-12-31 18:19:53 | 显示全部楼层
アンディ 发表于 2014-12-31 18:09
感觉客户端进行JS加密很容易破解
MD5破解目前来说很容易
感觉比较安全就HTTPS和浏览器插件了

嗯……
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-22 02:58 , Processed in 0.038830 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表