[Fswiki-dev] MD5を使ったパスワード暗号化

アーカイブの一覧に戻る

typer typer_jp****@yahoo*****
2003年 10月 28日 (火) 01:25:23 JST


ども。typer.加藤です。

早速ですが、BugTrack-wiki/136 のパスワード長に関する話で書いた
crypt関数MD5対応パッチです。
とりあえず互換性はあり、MD5非対応なら従来通りの方法で暗号化するはずです。
が、その辺りの環境依存の部分での確認はできていませんので、
皆さんにレビューしていただければとおもいます。
#手元で確認したのはFreeBSD,debianです。
#SYS_V系、MacOSX、Win系での確認がとりたいところ。

あと、パッチ書いて思った点として、現在プラグイン(主にadmin)側の数箇所で
直接crypt関数を使って暗号化していますが、これをできれば本体等どこかにまと
めておいた方がいいような気がします。
#加えて今後のためにユーザー情報を扱うインターフェースとしてまとまる
#となおよいかと。

では、以下がパッチです。

--- plugin/admin/AccountHandler.pm.orig	Mon Oct 13 11:54:49 2003
+++ plugin/admin/AccountHandler.pm	Tue Oct 28 00:28:26 2003
@@ -84,7 +84,9 @@
 
 	# 他人がパスワードを変更してしまうことを防止するため、パスワードを変更
 	# する際には現在のパスワードを照合する必要がある。
-	my $login = $wiki->login_check($id,crypt($pass_old,$id));
+	my $users = &Util::load_config_hash($wiki,$wiki->config('userdat_file'));
+	my ($p) = split(/\t/,$users->{$id});
+	my $login = $wiki->login_check($id,crypt($pass_old,$p));
 	if(defined($login)){
 		my $min_length = 2;
 
@@ -105,7 +107,10 @@
 
 		my $users = &Util::load_config_hash($wiki,$wiki->config('userdat_file'));
 		my ($p,$type)  = split(/\t/,$users->{$id});
-		$users->{$id} = crypt($pass,$id)."\t$type";
+		# MD5形式で生成してみて非対応なら従来通りの方法で生成
+		$p = crypt($pass,'$1$'.$id.'$');
+		substr($p,0,3) ne '$1$' and $p = crypt($pass,$id);
+		$users->{$id} = "$p\t$type";
 		&Util::save_config_hash($wiki,$wiki->config('userdat_file'),$users);
 	} else {
 		return $wiki->error("現在のパスワードが違います。");
--- plugin/admin/AdminUserHandler.pm.orig	Mon Oct 13 11:54:49 2003
+++ plugin/admin/AdminUserHandler.pm	Tue Oct 28 00:29:23 2003
@@ -162,7 +162,10 @@
 		($pass) = split(/\t/,$users->{$id});
 		$users->{$id} = "$pass\t$type";
 	} else {
-		$users->{$id} = crypt($pass,$id)."\t$type";
+		# MD5形式で生成してみて非対応なら従来通りの方法で生成
+		my $p = crypt($pass,'$1$'.$id.'$');
+		substr($p,0,3) ne '$1$' and $p = crypt($pass,$id);
+		$users->{$id} = "$p\t$type";
 	}
 	&Util::save_config_hash($wiki,$wiki->config('userdat_file'),$users);
 	
@@ -183,7 +186,10 @@
 	
 	my $users = &Util::load_config_hash($wiki,$wiki->config('userdat_file'));
 	my ($p,$type)  = split(/\t/,$users->{$id});
-	$users->{$id} = crypt($pass,$id)."\t$type";
+	# MD5形式で生成してみて非対応なら従来通りの方法で生成
+	my $p = crypt($pass,'$1$'.$id.'$');
+	substr($p,0,3) ne '$1$' and $p = crypt($pass,$id);
+	$users->{$id} = "$p\t$type";
 	&Util::save_config_hash($wiki,$wiki->config('userdat_file'),$users);
 	
 	return "<p>パスワードを変更しました。</p>".
--- plugin/admin/Login.pm.orig	Mon Oct 13 11:54:49 2003
+++ plugin/admin/Login.pm	Mon Oct 27 23:57:04 2003
@@ -35,7 +35,9 @@
 		my $id   = $cgi->param("id");
 		my $pass = $cgi->param("pass");
 		if($id ne "" && $pass ne ""){
-			my $login = $wiki->login_check($id,crypt($pass,$id));
+			my $users = &Util::load_config_hash($wiki,$wiki->config('userdat_file'));
+			my ($p) = split(/\t/,$users->{$id});
+			my $login = $wiki->login_check($id,crypt($pass,$p));
 			if(defined($login)){
 				my $session = $cgi->get_session($wiki);
 				$session->param("wiki_id"  ,$id);
--- plugin/farm/Install.pm.orig	Mon Oct 13 11:54:49 2003
+++ plugin/farm/Install.pm	Tue Oct 28 00:29:41 2003
@@ -55,7 +55,10 @@
 			
 			# 管理ユーザの作成(ここで作るのはちょっとアレかも・・・)
 			open(USERDAT,">".$self->config('config_dir')."/$child/".$self->config('userdat_file')) or die $!;
-			print USERDAT "$id=".crypt($pass,$id)."\t0\n";
+			# MD5形式で生成してみて非対応なら従来通りの方法で生成
+			my $p = crypt($pass,'$1$'.$id.'$');
+			substr($p,0,3) ne '$1$' and $p = crypt($pass,$id);
+			print USERDAT "$id=$p\t0\n";
 			close(USERDAT);
 		
 			# create_wikiフックの呼び出し

-- 
typer        typer_jp****@yahoo***** 
Noboru Katoh typer****@goenn*****



Fswiki-dev メーリングリストの案内
アーカイブの一覧に戻る