/etc/shadow
bash 스크립트를 사용하여 파일에 해시된 비밀번호를 생성하려고 합니다. 사용자에게 변수에 저장된 비밀번호를 묻는 메시지가 표시됩니다 PSWD
. 파일에서 해시값과 솔트값을 추출하여 각각 변수 와 /etc/shadow
에 저장했습니다 .HVAL
SVAL
이제 비밀번호와 솔트를 사용하여 해시된 비밀번호를 생성하려면 아래 명령을 사용해야 합니다(인용하다):
$ perl -e 'print crypt("password","\$6\$salt\$") . "\n"'
$PSWD
위 명령에서 "password"를 변수로 , "6"을 변수로, $HVAL
"salt"를 변수로 바꿔야 합니다 $SVAL
.
위의 변수를 내보내고 아래와 같이 perl 명령에서 바꾸려고 시도했지만 완전히 엉망이 되었습니다.
perl -e 'print crypt("$ENV{"PSWD"}","\$$ENV{"HVAL"}\$$ENV{"SVAL"}\$") . "\n"'
어떤 수정이 이루어지나요?
답변1
문제는 큰따옴표에 있습니다. 여기서는 이러한 해시 키를 있는 그대로 참조할 필요가 없습니다.단순 식별자. 에서 perldoc perldata
:
실제로 중괄호 안의 간단한 식별자는 해시 첨자와 마찬가지로 문자열로 강제 변환됩니다. 인용은 필요하지 않습니다. 이전 예를 다음
$days{'Feb'}
과 같이 작성할 수$days{Feb}
있으며 따옴표가 자동으로 가정됩니다. 그러나 아래 첨자에서 더 복잡한 내용은 표현식으로 해석됩니다. 예를 들어, 이는 가 아니라$version{2.0}++
와 동등함을 의미합니다 .$version{2}++
$version{'2.0'}++
그래서:
perl -le 'print crypt($ENV{PSWD},"\$$ENV{HVAL}\$$ENV{SVAL}\$")'
백틱 안에 사용하는 경우 다음과 같이 백슬래시를 두 배로 늘려야 합니다.
var=`perl -le 'print crypt($ENV{PSWD},"\\$$ENV{HVAL}\\$$ENV{SVAL}\$")'`
$(...)
명령 대체를 사용하는 것이 가장 좋습니다 .
var=$(perl -le 'print crypt($ENV{PSWD},"\$$ENV{HVAL}\$$ENV{SVAL}\$")')
답변2
올바른 견적을 얻는 순서는 원래 명령으로 시작됩니다.
perl -e 'print crypt("password","\$6\$salt\$") . "\n"'
공간을 추가해 보겠습니다.
perl -e 'print crypt(" password ","\$ 6 \$ salt \$") . "\n"'
변수를 해당 변수로 변경해 보겠습니다.
perl -e 'print crypt(" $ENV{PSWD} ","\$ $ENV{HVAL} \$ $ENV{SVAL} \$") . "\n"'
동등한 항목은 따옴표 안에 포함되지 않으므로 따옴표로 묶어서는 안 됩니다.
perl -e 'print "$ENV{PSWD}" . "\n"' # correct.
perl -e 'print "$ENV{"PSWD"}" . "\n"' # fail.
마지막으로 위에 삽입된 공백을 제거해 보겠습니다.
perl -e 'print crypt("$ENV{PSWD}","\$$ENV{HVAL}\$$ENV{SVAL}\$") . "\n"'
그런 다음 명령을 변수에 할당할 수 있습니다.
var="$( perl -e 'print crypt("$ENV{PSWD}","\$$ENV{HVAL}\$$ENV{SVAL}\$") . "\n"' )"
내보낸 값을 사용하면 다음과 같은 결과를 얻 PSWD=password
습니다 .HVAL=6
SVAL=saltsalt
$6$옌얀$qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2/jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh/