スカイアークシステムさんの
「MovableType のパスワードは最初の8文字しか認識しません」
http://www.skyarc.co.jp/engineerblog/entry/password.html
で話題になっていますが
crypt関数で利用する暗号化のデフォルトがDES方式の環境の場合、パスワードに使用できるのは最初の8文字だけです。
ただデフォルトがMD5の場合はこの8文字の制限を受けません。
(私の環境ではMD5をデフォルトにしているので問題ありませんでした)
要望としてはパスワードをセットするときにMD5方式のcryptが利用できる環境ではMD5を利用するように改良して頂きたいと思います。
現状でも
lib/MT/Author.pm
のサブルーチンset_passwordで
my $salt = join '', map $alpha[rand @alpha], 1..2;
の後に
my $md5 = crypt $pass, '$1$' . $salt;
$salt = '$1$' . $salt if $md5 =~ /^\$1\$/;
とすればいけるとは思いますが既に運用していてパスワードを保存している場合はどうするか課題が残るとは思います。

ども(=゚ω゚)ノ
今回、この記事と併せてパスワードの符号化に Digest::MD5 を使うプラグインを作りましたが、DES cryptで保存されたパスワードとの下位互換が取れませんでした。
crypt($raw_passwd, $salt) eq $author->passwd としている部分をゴニョゴニョして、length $author->passwd が 13 なら従来通りの DES crypt、それ以上なら MD5 というロジックにすれば良かったかもしれませんが、いかんせんプラグインできなかったものですから。
$author->passwd は varchar(60) で定義されているようなので、折角なので、更に強固な符号化が利用されることを希望します。
ピロリーヌ・ド・マジク・ヴォクスさんこんにちは :)
>$author->passwd は varchar(60) で定義されているようなので、折角なので、更に強固な符号化が利用されることを希望します。
私も同感です。
lib/MT/Author.pmで
# FIXME: use something besides 'crypt'
とコメントがあるので何か検討されているのかも知れませんが・・・。
こんにちは。
調べてみたのですが、以下のような理由から、システムのcryptにmd5を使わせるよりは、自前でsha1を使うほうが良さそうでした。
1) 一部のシステム( Mac OS X など )ではシステムのcryptがmd5をサポートしていないので、md5を使うなら自前でハッシュ化を行う必要がある。
2) どうせ自前でやるなら sha1 のほうが md5 より堅牢。
3) sha1 はMT::Utilに実装が含まれているのでモジュールの追加が不要。
また、後方互換性については、crypt関数の形式を踏襲して、ダラーサイン($)区切りでハッシュアルゴリズムの指定とsaltを表記し、もしダラーが含まれていない、またはアルゴリズムがsha1でない場合はcrypt()由来のパスワードとみなし、そのままcrypt()に食わせれば照合できると思います。
aklaswadさん
こんいちは。返事が遅れてすいません。
ご提案のとおりMT::Util::perl_sha1_digestを使用してSalted SHA1形式で保存するのが現状ではいいようですね。
ご提案を私なりに考えてみました。
MT::Author::set_passwordでは
require MT::Util;
require MIME::Base64;
my $password = q($1$SSHA$) . MIME::Base64::encode_base64( MT::Util::perl_sha1_digest($pass . $salt) . $salt,'' );
$auth->column('password', $password);
MT::Auth::MT::is_valid_passwordでは
if ($real_pass =~ /^\$1\$SSHA\$/) {
#現状では$saltは2文字なのでMD5のcryptも除外できる。
$real_pass =~ s/^\$1\$SSHA\$//i;
require MT::Util;
require MIME::Base64;
my ($hash, $salt) = unpack("a20a*", MIME::Base64::decode_base64($real_pass));
my $pwhash = MT::Util::perl_sha1_digest($pass . $salt);
#どういう場合is_valid_passwordへ$cryptedが1で渡ってくるかよくわかっていません・・・。
return $pwhash eq $hash ? 1 : 0; #なのでこれは自信がありません。
} else {
return $crypted ? $real_pass eq $pass :
crypt($pass, $real_pass) eq $real_pass;
}
今回のピロリーヌ・ド・マジク・ヴォクスさんとaklaswadさんのご提案を受けて
Movable TypeのパスワードをSSHA形式に変更するプラグイン
「SSHAPassword」を作成しました。
http://www.macminiosx.com/2011/02/mt_sha1_sshapasswordhtml.html
http://communities.movabletype.jp/plugins/2011/02/sshapassword.html
また当初の要望が「パスワードの暗号化をMD5で」でしたが
「パスワードの暗号化をSalted SHA1で」に変更したいと思います。