加强用户密码保存及检验的安全性

作者: goseaside

  1<[email protected]>   
  2版权: 遵循 CC 协议  http://creativecommons.org/licenses.../2.0/deed.zh_TW    
  3发布日期: 2005-08-25   
  4  
  5  
  6以下 $username, $password 分别指用户名和密码,   
  7$sitekey 为站点扰码。   
  8  
  9  
 10密码设置   
 11
 12
 13&gt; 
 14&gt;     代码:
 15&gt;     
 16&gt;     * * *
 17&gt;     
 18&gt;     
 19&gt;     	<input name="passwd" type="password"/>
 20&gt;     	<input name="t_code0" type="hidden"/>
 21&gt;     	
 22&gt;     
 23&gt;     * * *
 24
 25  
 26  
 27提交的时候,使用 javascript 处理   
 28
 29
 30&gt; 
 31&gt;     代码:
 32&gt;     
 33&gt;     * * *
 34&gt;     
 35&gt;     
 36&gt;     		t_code0.value = md5 (username.value + "|" + passwd.value);
 37&gt;     		passwd.value = '';
 38&gt;     		
 39&gt;     
 40&gt;     * * *
 41
 42  
 43  
 44如果提交的 passwd 有值或 t_code0 为空,设置密码失败;   
 45  
 46t_code0 的值保存到数据库的 save_pwd 字段中;   
 47  
 48  
 49密码校验   
 501\. 用户端申请登录   
 51服务器生成随机码 $sid,保存到 $_SESSION[sid] 中,同时传递给用户;   
 52  
 53表单   
 54
 55
 56&gt; 
 57&gt;     代码:
 58&gt;     
 59&gt;     * * *
 60&gt;     
 61&gt;     
 62&gt;     			<input name="sid" type="hidden" value="..."/>
 63&gt;     			<input name="username"/>
 64&gt;     			<input name="passwd" type="password"/>
 65&gt;     			<input name="t_code" type="hidden"/>
 66&gt;     			
 67&gt;     
 68&gt;     * * *
 69
 70  
 71  
 722\. 用户输入用户名和密码,提交的时候,使用 javascript 处理   
 73
 74
 75&gt; 
 76&gt;     代码:
 77&gt;     
 78&gt;     * * *
 79&gt;     
 80&gt;     
 81&gt;     		var t = md5 (username.value + "|" + passwd.value);
 82&gt;     		t_code.value = md5 (sid + "|" + t);
 83&gt;     		passwd.value = '';
 84&gt;     		
 85&gt;     
 86&gt;     * * *
 87
 88  
 89  
 903\. 服务器端判断   
 91如果 username 为空 或 passwd 非空 或 t_code 为空,返回登录页;   
 92如没有 $_SESSION[sid],返回登录页;   
 93
 94
 95&gt; 
 96&gt;     PHP代码:
 97&gt;     
 98&gt;     * * *
 99&gt;     
100&gt;     
101&gt;       
102&gt;     &gt;  $sid0 =  $_SESSION[sid];  
103&gt;     &gt; 
104&gt;     
105&gt;     
106&gt;     
107&gt;     * * *
108
109  
110  
111根据用户名从数据库取 save_pwd,   
112
113
114&gt; 
115&gt;     PHP代码:
116&gt;     
117&gt;     * * *
118&gt;     
119&gt;     
120&gt;       
121&gt;     &gt;  $pwd_right = md5(" $sid0| $save_pwd");  
122&gt;     &gt; 
123&gt;     
124&gt;     
125&gt;     
126&gt;     * * *
127
128  
129  
130如果 $pwd_right 和 $t_code 不等,则登录失败;   
131  
132清空 sid 值   
133
134
135&gt; 
136&gt;     PHP代码:
137&gt;     
138&gt;     * * *
139&gt;     
140&gt;     
141&gt;       
142&gt;     &gt;  $_SESSION[sid] = '';  
143&gt;     &gt; 
144&gt;     
145&gt;     
146&gt;     
147&gt;     * * *
148
149  
150  
151登录失败,则返回登录页;   
152  
153优点   
1541\. 服务器端不保存用户密码明文,避免来自各方面的密码泄漏;   
1552\. 避免因密码一致,结果一致的情况;   
1563\. 不传递密码明文,且所有登录过程均使用一次性密码;   
1574\. 避免字典法登录攻击;   
158  
1595\. 密码保存使用的是单向 HASH 算法,无法通过解密得到原来的密码。   
160  
161此方法自 2002 年应用至今,效果良好。   
162  
163  
164传统直接以明文保存密码的缺点   
1651\. 网站管理员或程序员等可以随时收集用户密码,用以以后的字典攻击;   
1662\. 数据库被攻破情况下,黑客获取大量的密码;   
167  
1683\. 这些对应于用户名的密码,可以被用来从事有针对性的攻击。   
169想想看,有多少人在不同站点使用同一套密码?   
170  
171所有以明文保存密码的网站都需要注意了。   
172  
173  
174如何初步判断网站是否明文保存密码   
175使用网站的“找回密码”功能,如果你可以得到自己原来的密码,   
176网站就是以明文保存的,你危险了。以单向 HASH 算法保存密码的网站,   
177只能在确认用户身份后,设置一个新的密码。</[email protected]>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus