사용자 암호를 암호화하여 저장
- 사용자가 UseModWiki환경설정에서 입력한 자신의 암호와 관리자 암호가 *.db 화일에 고스란히 평문으로 저장되는 문제를 해결
- perl 에서 제공하는 crypt 함수를 사용하여, 간단한 변환을 거친 후에 저장하도록 한다.
- Bab2님이 작성한 패치를 변형시켜 적용
- 부작용:
- crypt 함수의 안정성에 의존하게 됨
- crypt 함수의 호출로 인한 퍼포먼스 저하. crypt 는 암호화 함수라기보다는 단방향 해쉬 함수에 가깝기 때문에 크게 저하될 것이라 생각되지는 않으나...
- 기존에 사용하던 사용자 데이타와 호환되지 않는다. (호환되게 할수도 있겠으나 귀찮아서..) 굳이 호환되게 하고 싶다면, 아래에 나오는 각종 if 문에서, 기존에 사용되던 조건문과 새로 변경된 조건문을 둘 다 검사하게 OR 로 연결해 주면 될 것이다.
-
...
package UseModWiki;
use strict;
use vars qw($HashKey);
$HashKey = "salt";
- 위에 있는 $HashKey 변수는 crypt 에서 사용되는 키 값이다. salt 가 아닌 다른 문자열을 사용하도록 하고, 가끔 생각날때 한번씩 바꿔주면 좋을 것이다. 키를 바꾸더라도 기존에 사용하던 사용자 데이터는 그대로 사용할 수 있다. (키 값은 처음 두 글자만 의미가 있다. 세번째 이후는 바꾸나마나이니 주의)
-
sub UserIsAdmin {
...
foreach (split(/\s+/, $AdminPass)) {
next if ($_ eq "");
return 1 if (crypt($_, $userPassword) eq $userPassword);
}
return 0;
}
-
sub UserIsEditor {
...
foreach (split(/\s+/, $EditPass)) {
next if ($_ eq "");
return 1 if (crypt($_, $userPassword) eq $userPassword);
}
return 0;
}
-
sub DoUpdatePrefs {
my ($username, $password);
my $hashpass = "";
...
$password = &GetParam("p_password", "");
$hashpass = crypt($password, $HashKey);
if ($password eq "") {
print T('Password removed.'), '<br>';
undef $UserData{'password'};
} elsif ($password ne "*") {
print T('Password changed.'), '<br>';
$UserData{'password'} = $hashpass;
}
if ($AdminPass ne "") {
$password = &GetParam("p_adminpw", "");
$hashpass = crypt($password, $HashKey);
if ($password eq "") {
print T('Administrator password removed.'), '<br>';
undef $UserData{'adminpw'};
} elsif ($password ne "*") {
print T('Administrator password changed.'), '<br>';
$UserData{'adminpw'} = $hashpass;
if (&UserIsAdmin()) {
print T('User has administrative abilities.'), '<br>';
...
}
-
sub DoLogin {
...
&LoadUserData();
if (defined($UserData{'password'}) &&
(crypt($password, $UserData{'password'}) eq $UserData{'password'})) {
$SetCookie{'id'} = $uid;
...
위키위키분류