Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4595174
  • 博文数量: 671
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 7310
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-14 09:56
文章分类

全部博文(671)

文章存档

2011年(1)

2010年(2)

2009年(24)

2008年(271)

2007年(319)

2006年(54)

我的朋友

分类:

2008-05-23 10:34:12

好几个项目中要用到OPENLDAP,而OPENLDAP支持一个用户密码的加密算法MD5。我就是一直非常郁闷,文档说支持MD5,为什么不能直接将PHP脚本MD5生成的密码直接割接过去呢?仔细捣腾了一下,发现原来是这样的。
MD5这个函数后边有个参数:

string md5 ( string str [, bool raw_output])

Calculates the MD5 hash of str using the RSA Data Security, Inc. MD5 Message-Digest Algorithm, and returns that hash. The hash is a 32-character hexadecimal number. If the optional raw_output is set to TRUE, then the md5 digest is instead returned in raw binary format with a length of 16. 

通常情况下,我们生成的密码是32个字符的16进制字符。LDAP的MD5密码用PHP应该怎么生成呢?必须用下面的算法:

$ldap_passwd = "{md5}".base64_encode(pack("H*",md5($password)));

 

或者相当于

 

base64_encode(md5($password,true));

 

因此,如果要把数据倒过去,很简单,设定用户的密码的时候用这个算法就可以了。

 

$ldap_passwd = "{md5}".base64_encode(pack("H*",”我们已经MD5过后的密码”)));

仔细对比如下脚本的运行情况:

    $passwd = "haka";

 

    $str_md5 = md5($passwd,true);

 

    echo $str_md5;

 

    echo "
+---
";

 

    print_r($str_md5);

 

    echo "
+---
";

 

    $str_md5_default = md5($passwd);

 

    echo $str_md5_default;

 

    echo "
+---
";

 

    $str_pack = pack("H*",$str_md5_default);

 

    print_r($str_pack);

 

    echo "
+---
";

 

   

 

    $str_base64 = base64_encode ($str_md5);

 

    echo "
+---
";

 

    echo $str_base64;

 

    echo "
+---
";

 

    echo base64_decode("e01ENX1xVkZjVVM0a1B4Tk1pdzFIRUVBWG13PT0=");

 

   

 

运行结果:
©Q\Q.$?L‹ G@›
+---
©Q\Q.$?L‹ G@›
+---
a9515c512e243f134c8b0d471040179b
+---
©Q\Q.$?L‹ G@›
+---

+---
qVFcUS4kPxNMiw1HEEAXmw==
+---
{MD5}qVFcUS4kPxNMiw1HEEAXmw==
+---
{MD5}g+Spau2WQ2xiG5gJ4lizCQ==

阅读(2416) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~