macminiosx

パスワードの暗号化をMD5で

0

スカイアークシステムさんの
「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\$/;

とすればいけるとは思いますが既に運用していてパスワードを保存している場合はどうするか課題が残るとは思います。

返信(5)

| 返信する
  • ども(=゚ω゚)ノ

    今回、この記事と併せてパスワードの符号化に 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で」に変更したいと思います。

返信する


カテゴリグループ

フォーラムカテゴリー

21 76

最新のトピック: 公開終了日の取り消し (2013年10月18日 gsk)

178 552

最新のトピック: ユーザへアカウント発行通知 (2014年1月27日 cmtskt)

143 426

最新のトピック: アイテム・カスタムフィールドの連動 (2013年12月16日 kazuhiro watanabe)

291 819

最新のトピック: 検索についての質問 (2014年1月23日 noble777)

OpenID対応しています OpenIDについて