加载中…
个人资料
边界
边界
  • 博客等级:
  • 博客积分:0
  • 博客访问:50,268
  • 关注人气:42
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

用PHP实现SSHA加密和LDAP密码验证

(2009-12-25 16:08:00)
标签:

ldap

ssha

php

分类: 技术实践

    目前流行的加密算法有很多种,SSHA是其中常用的一种,我的邮件服务器使用OpenLDAP,用户信息就存放在LDAP服务器上,用户密码就是使用SSHA算实现加密。

    随着信息化的进展,现在几乎每个人都要访问很多系统,每个人都有很多服务的账号密码,从去年就开始考虑把整个网络的账号密码整合在一起。邮件系统也早就换成了Zimbra Opensource,主要原因是因为LDAP,Zimbra比较简单,有Web Mail 管理界面,登录后可以自己新增或变更账号密码,这样一次就可以维护好几种系统的账号密码。

    最近又准备整合HRM系统,HRM用PHP开发,我使用PHP连接到LDAP服务器去查找用户密码做用户验证,但是只是查到的是经过编码的字符串:

    {SSHA}SaltPasswordString;

    我查了很多资料,费了不少脑筋,总算找到了解决使用PHP连接到LDAP服务器并进行密码验证的方案。PHP连接到LDAP的例子可以看这里:http://www.php.net/manual/en/function.ldap-connect.php,下面是我的一个包含密码验证例子:


 <?php
 define('ROOT_PATH', dirname(__FILE__));
 echo " ---- Test by Bianjie. ---- <br>";
 
 // LDAP variables
 $ldaphost = "mail.bianjie.com.cn";  // your ldap server
 $ldapport = 389;                    // your ldap server's port number
 // Connecting to LDAP
 $ldapconn = ldap_connect($ldaphost, $ldapport);
 $saltpassword;
 if($ldapconn) {
  echo "[info]: Connect to LDAP server successful.<br>";
  if (ldap_set_option($ldapconn,LDAP_OPT_PROTOCOL_VERSION,3)){
   echo "[info]: Using LDAP v3.<br>";
  }
  else{
   echo "[info]: Failed to set version to protocol 3.<br>";
  }
  
  $ldapbind = ldap_bind($ldapconn,"uid=zimbra,cn=admins,cn=zimbra","bianjie1234");
  if ($ldapbind){
   echo "[info]: LDAP bind successful.<br>";
   $result = ldap_search($ldapconn,"uid=test,ou=people,dc=bianjie,dc=com,dc=cn",'objectClass=zimbraAccount');
   
   if($result){
    $info = ldap_get_entries($ldapconn,$result);
    for ($i=0; $i<$info["count"]; $i++)   
     echo "[info]: dn=   " . $info[$i]["dn"] . "<br>";  
     echo "[info]: cn=   " . $info[$i]["cn"][0] . "<br>";
     $saltpassword = $info[$i]["userpassword"][0];
     echo "[info]: userPassword=   " . $saltpassword . "<br>";  
     echo "[info]: mail=   " . $info[$i]["mail"][0] . "<br>";  
     
   } else {
    echo "[info]: LDAP bind failed.<br>";
   }
 
  } else {
   echo "[info]: <font color=red>LDAP bind failed.</font><br>";
   echo "[info]: " . ldap_error($ldapconn);
  }
 } else {
  echo "[info]: <font color=red>Could not connect to LDAP server.</font><br>";
 }
   
 $str = '1234a?';
 
 if (ssha_check($str, $saltpassword)) {
  echo "[info]: verify successful.<br>";
 } else {
  echo "[info]: verify failed.<br>";
 }
 
 $saltpassword = ssha_encode($str);
 
 echo "[info]: " . $saltpassword . "<br>";
 
 $check = ssha_check($str, $saltpassword);
 if($check){
  echo "[info]: verify successful.<br>";
 } else {
  echo "[info]: verify failed.<br>";
 }
 
 echo "<br> ---- ---- ---- ---- <br>";
 
 ldap_unbind($ldapconn);
 ldap_close($ldapconn);
 
 function ssha_check($text, $hash) {
  $ohash = base64_decode(substr($hash,6));
  $osalt = substr($ohash,20);
  $ohash = substr($ohash,0,20);
  $nhash = pack("H*",sha1($text.$osalt));
  return $ohash == $nhash;
 }
 
 function ssha_encode($text) {
  for ($i=1; $i<=10; $i++) {
   $salt .= substr('0123456789abcdef',rand(0,15),1);
  }
  $hash = "{SSHA}" . base64_encode(pack("H*",sha1($text.$salt)).$salt);
  return $hash;
 }
 
 ?>

    以上代码测试保存到/var/www/html/bianjie/test.php,在浏览器输入:

    http://localhost/bianjie/test.php

    显示结果:

    

---- Test by Bianjie. ----
[info]: Connect to LDAP server successful.
[info]: Using LDAP v3.
[info]: LDAP bind successful.
[info]: dn= uid=test,ou=people,dc=bianjie,dc=com,dc=cn
[info]: cn= 测试用户
[info]: userPassword= {SSHA}UtWdSs8j+cqoe4czAjhaui2ZEHgAqeYX
[info]: mail= test@bianjie.com.cn
[info]: verify successful.
[info]: {SSHA}ubFEgY0OCOS2+Vc3K5X2qngIJBs5YWRmNWYwMWM0
[info]: verify successful.

---- ---- ---- ----

 

    以上注意两点:

    1. Java代码对大小写不敏感,在PHP代码从LDAP获取密码时,userpassword一定要小写;

    2. 如果系统没有安装php-ldap需要先安装,否则会出错。

    CentOS 下安装:yum intall php-ldap

    Ubuntu 下安装:apt-get install php5-ldap

    然后重新启动 apache 即可。

    

    

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有