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) |