Chinaunix首页 | 论坛 | 博客
  • 博客访问: 596934
  • 博文数量: 40
  • 博客积分: 7274
  • 博客等级: 少将
  • 技术积分: 410
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-20 15:00
个人简介

Expired

文章分类
文章存档

2011年(1)

2008年(3)

2007年(17)

2006年(10)

2005年(9)

分类: LINUX

2006-04-19 11:23:13

OpenLDAP 支持 CRYPT, MD5, SSHA 和 SHA 四种加密算法保存密码,默认使用 SSHA。

OpenLDAP 中的 MD5 不是一般的 MD5 算法,不能用普通的 MD5 函数来生成,好像经过 Base64 转换之类的,没有深究,不是很清楚,有谁知道的希望分享一下。

===================================================================
感谢 hzqbbc 兄的指点,算法:将密码经过 MD5 运算,得到 32 字节的字符串,然后每2个字节压缩成一个十六进制字符,这样得到16字节的字符串,最后经过Base64编码。


以下 3 种办法可以生成 MD5 散列字符串:

1.使用 OpenLDAP 自带命令

# slappasswd -h {md5} -s "secret"
{MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==
2. 使用 Perl 程序

#!/usr/bin/perl -w

use Digest::MD5 (md5_base64);

my $passwd = "secret";
my $md5hash = (md5_base64 "$passwd") . "==";

print "$md5hash\n";


##====================================================
## another way

use Digest::MD5 qw(md5_hex);
use MIME::Base64;

my $md5hash = encode_base64(pack('H*',md5_hex $passwd));
print "$md5hash\n";


##====================================================

## 据 hzqbbc 兄的意思,将md5后的字符串每2位(字符)作为一个块,转换成十六进制字符,然后再串接起来 base64 编码,结果是一样的(土了点,但是便于理解)

my $hex_md5;
my @octs = split(//,md5_hex $passwd);
for (my $i=0;$i<16;$i++) {
    my $double_byte = $octs[2*$i] . $octs[2*$i+1];
    $hex_md5 .= pack('H*',$double_byte);
}

# $hex_md5 的值和 pack('H*',md5_hex $passwd) 是一样的
print encode_base64($hex_md5) . "\n";
3. 使用 PHP 程序

$passwd = "secret";
$md5hash = base64_encode(pack( 'H*',md5("$passwd")));
printf("%s\n",$md5hash);
?>
可以看到生成的 MD5 字符串长度为 24 位,最后 2 位为 ==。

然后还需修改 OpenLDAP 配置文件 slapd.conf,更改默认密码存放方式:

password-hash {MD5}
在导入或改变用户信息时,将上述密码赋给 userPassword 属性即可改变用户的密码,如下:

## file data.ldif
dn: uid=muddyboot,ou=users,dc=test,dc=com
objectClass: posixAccount
uid: muddyboot
cn: muddyboot
homeDirectory: /home/muddyboot
uidNumber: 21
gidNumber: 21
loginShell: /bin/bash
userPassword: {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==

添加用户信息:
# ldapadd -x -D "cn=root,dc=test,dc=com" -w secret -f data.ldif
adding new entry "uid=muddyboot,ou=users,dc=test,dc=com"

修改用户信息:
# ldapmodify -x -D "cn=root,dc=test,dc=com" -w secret -f data.ldif
modifying entry "uid=muddyboot,ou=users,dc=test,dc=com"
以上仅提供生成密码的方法,代码比较简单,就不多说了,希望对大家有所帮助!^_^
阅读(11100) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~