michihide's blog

技術メモおよび雑感

PHPでLM/NT Hash

Samba(+LDAP)でドメインログオンする場合、LDAP側にuserPassword以外にもNTPassowordとLMPasswordという属性を持たなければならない。
これらはmkntpwdというコマンドで生成することができるが、管理ツールを刷新する際、できればPHPで完結している方が望ましいので実装してみた。
環境設定

$ wget http://dist.justplayer.com/JPCRPM/CentOS/5/JPCRPM-php53.repo
$ sudo mv JPCRPM-php53.repo /etc/yum.repos.d
$ sudo yum install php-pear php-mcrypt
$ sudo pear install Crypt_CHAP

パスワードを生成するスクリプト

$ cat nthash.php
#!/usr/bin/php
<?php
require_once 'Crypt/CHAP.php';
$password = $argv[1];
$cr = new Crypt_CHAP_MSv1();
$nthash = strtoupper(bin2hex($cr->ntPasswordHash($password)));
printf("%s(NT Hash)\n", $nthash);
$lmhash = strtoupper(bin2hex($cr->lmPasswordHash($password)));
printf("%s(LM hash)\n", $lmhash);

mkntpwdコマンドの出力と合っていることを確認

$ ./mkntpwd -N test
0CB6948805F797BF2A82807973B89537
$ ./mkntpwd -L test
01FC5A6BE7BC6929AAD3B435B51404EE
$ ./nthash.php test
0CB6948805F797BF2A82807973B89537(NT Hash)
01FC5A6BE7BC6929AAD3B435B51404EE(LM hash)