/ etc / shadow의 비밀번호를 수동으로 생성


109

/etc/shadow가상 머신 이미지 내부의 루트 비밀번호를 변경하려면 수동으로 편집해야합니다 .

/etc/shadow비밀번호를 사용하고 표준 출력에서 ​​호환되는 비밀번호 해시를 생성하는 명령 행 도구가 있습니까?

답변:


126

동일한 명령으로 다음 명령을 사용할 수 있습니다.

방법 1 (md5, sha256, sha512)

openssl passwd -6 -salt xyz  yourpass

참고 : 전달 -1하면 MD5 비밀번호, -5SHA256 및 -6SHA512 (권장) 가 생성됩니다.

방법 2 (md5, sha256, sha512)

mkpasswd --method=SHA-512 --stdin

방법 수용 md5, sha-256그리고sha-512

방법 3 (des, md5, sha256, sha512)

@tink가 제안했듯이 다음을 사용 chpasswd하여 비밀번호를 업데이트 할 수 있습니다 .

echo "username:password" | chpasswd 

또는로 암호화 된 비밀번호를 사용할 수 있습니다 chpasswd. 먼저 이것을 사용하여 생성하십시오 :

perl -e 'print crypt("YourPasswd", "salt", "sha512"),"\n"'

그런 다음 나중에 생성 된 비밀번호를 사용하여 업데이트 할 수 있습니다.

echo "username:encryptedPassWd"  | chpasswd -e

이 암호화 된 비밀번호는 다음과 같이 비밀번호를 사용하여 새 사용자를 작성하는 데 사용할 수 있습니다.

useradd -p 'encryptedPassWd'  username

3
사용하는 경우 chpasswd -e, 문자열 당신에 작은 따옴표를 사용하십시오 echo에서를; 그렇지 않으면 $다른 특수 문자 가 있거나 문자 그대로 처리되지 않습니다.
Zags

4
이것들의 메이크는 쉘 히스토리에서 끝납니다. 나는 openssl passwd -11) 거기에 끝나지 않고 2) 당신을 위해 무작위 소금을 생성합니다 (쉘 역사에서도 끝나지 않습니다).
Ztyx

1
openssl passwd-1옵션이 무엇을하는지 알아 내려는 사람을위한 문서 .
CivFan

4
SHA-512 해시 : python3 -c 'import crypt; print(crypt.crypt("test", crypt.mksalt(crypt.METHOD_SHA512)))'- 관련 ServerFault 질문에서
CivFan

9
위의 방법 1) 및 2)는 해싱에 MD5를 사용합니다. 해시 충돌이 발생하여 MD5는 더 이상 모범 사례로 간주되지 않습니다. 방법 3) 또는 unix.stackexchange.com/a/198906/10911에 설명 된 방법을 사용하십시오 .
Ztyx

36

Ubuntu 12.04에는 whois 패키지에서 mkpasswd가 있습니다.

mkpasswd  -m sha-512 -S saltsalt -s <<< YourPass

어디:

  • -m= TYPE 방법을 사용하여 비밀번호를 계산하십시오. TYPE이 도움이되면 사용 가능한 방법이 인쇄됩니다.
  • -S = 소금 사용.

예 :

$ mkpasswd -m help

-s = Read password from stdin

8
솔트를 지정할 필요가 없습니다. mkpasswd는 임의의 솔트 생성을 처리합니다.
SE 마하려면

1
어쨌든, mkpasswd에서 / etc / passwd로 복사 된 생성 된 비밀번호는 항상 실패합니다. mkpasswd에 의해 생성 된 해시가 올바른지 확인하는 방법이 있습니까?
CMCDragonkai

@CMCDragonkai : 잘못된 질문입니다. 시스템이 무엇을 기대하는지 물어봐야합니다.
user3183018

1
@TomaSE : 소금을 조절하는 데 유용한 시간입니다. 소금을 별도의 저장소에 저장하는 웹 응용 프로그램의 암호 해시 생성 암호를 테스트 할 때 사용했습니다. 예를 들어 MySQL DB의 해시 비밀번호와 Redis의 사용자 별 소금.
user3183018

15

이 솔루션에는 다음과 같은 이점이 있습니다.

  • 추가로 설치할 것이 없습니다
  • 쉘 히스토리에 비밀번호를 저장하지 않습니다
  • 당신을 위해 무작위 소금을 생성합니다
  • 현대적이고 강력한 해싱 알고리즘 인 SHA-512를 사용합니다.
  • 실수를 피하기 위해 암호를 다시 입력하십시오.

    $ python3 -c "from getpass import getpass; from crypt import *; \
        p=getpass(); print('\n'+crypt(p, METHOD_SHA512)) \
        if p==getpass('Please repeat: ') else print('\nFailed repeating.')"
    

참고 문헌


3

데비안 기반 시스템이없는 사람들. Python3도 잘 작동합니다.

python3 -c 'import crypt; print(crypt.crypt("test"))'

참고 : 문자열 "test"는 암호화 된 문자열로 생성하는 비밀번호입니다.


어떤 이유로에 대한 crypt.mksalt비밀번호를 생성 할 때 사용 이 작동하지 않습니다 /etc/shadow. 그러나 @ Alex131089의 방법은 효과가 있습니다!
maulinglawns

의견을 알기 전에이 방법을 시도하는 데 1.5 시간을 낭비했습니다. 누군가 그것을 제거 할 수 있습니까? 아직 공감할 수 없습니다.
Michał F

1
@ MichałF는 소금이 제대로 이루어지지 않아 작동하지 않는 것 같습니다. 이것을 지적 해 주셔서 감사합니다. 소금이 OS에 의존 하기 때문에 소금을 제거 했으며 내 대답에 모든 범위의 OS를 설명하는 것은 실용적이지 않습니다. @RahulPatil에 의해 요약 된 방법 1을 사용해야합니다. 소금을 사용할 수 openssl있고 매우 보편적 인 도구 이기 때문 입니다.
그렉

쉘 히스토리에 비밀번호를 남기므로 권장하지 않습니다.
Mark Stosberg

셸 기록에서 cmd를 항상 지울 수 있습니다
Greg

3

현재 방법 중 어느 것도 받아 들일 수 없습니다-그들은 명령 줄에서 암호를 전달합니다 (쉘 역사에서 끝남). 추가 유틸리티 ( python3, makepasswd) 설치가 필요 하거나 하드 코딩 된 소금을 사용하거나 오래된 해싱 기술을 사용합니다.

이 방법은 암호를 묻는 메시지가 나타난 후 SHA-512 해시를 생성하고 임의의 소금을 사용합니다.

비표준 라이브러리없이 Python 2를 사용하는 방법 :

python2 -c 'import crypt, getpass,os,base64; print crypt.crypt(getpass.getpass(), "$6$"+base64.b64encode(os.urandom(16))+"$")'

프롬프트없이 수행하려면 : (이것은 암호를 명령 기록에 남겨 둡니다)

python2 -c 'import crypt, os,base64; print crypt.crypt("MyPassword", "$6$"+base64.b64encode(os.urandom(16))+"$")'

2
명령 히스토리에 비밀번호를 남기지 않으려면 환경 변수 HISTCONTROL을 적어도 bash의 경우 'ignorespace'로 설정 한 다음 명령 앞에 선행 공백을 추가하십시오.
adam820

@ adam820 : 그것은 한 가지 방법입니다 ... ps명령이 실행되는 순간 에도 여전히 출력에 표시됩니다. (가장 안전한 것은 암호를 요구하는 버전을 사용하는 것입니다)
Gert van den Berg

2

opensslchpasswd -e쌍은 RHEL6에서 내 경우에는 작동하지 않았다. 결합 openssl passwdusermod -p지휘는 일을했다.

솔트 값과 함께 비밀번호의 해시 값을 생성하십시오.

$ openssl passwd -1  -salt 5RPVAd clear-text-passwd43

$1$5RPVAd$vgsoSANybLDepv2ETcUH7.

그런 다음 암호화 된 문자열을 usermod에 복사하십시오. 작은 따옴표로 묶어야합니다.

$ usermod -p '$1$5RPVAd$vgsoSANybLDepv2ETcUH7.' root

섀도 파일에서 확인하십시오.

$ grep root /etc/shadow

root:$1$5RPVAd$vgsoSANybLDepv2ETcUH7.:17774:0:99999:7:::

1

암호를 생성하는 또 다른 방법은 openssl도구를 사용하는 것 입니다.

MD5 비밀번호 생성

openssl passwd -1 -salt SaltSalt SecretPassword
# output: $1$SaltSalt$FSYmvnuDuSP883uWgYBXW/

DES 비밀번호 생성

openssl passwd -crypt -salt XR SuprScrt
# output: XR1dOp2EVMph2

3
Rahul Patil의 답변 에서 방법 1과 다른 점은 무엇입니까? 이전 DES 기반 암호 해싱 알고리즘은 절대 사용해서는 안됩니다 ! 우선, 최대 8 바이트의 비밀번호 만 지원하므로 요즘에는 부적절합니다.
CVn

3
인용문 Snowden : "적대자가 초당 1 조 개의 추측을 할 수 있다고 가정하십시오." 완전히 합리적이지 않은 70 자 문자 세트와 완전 임의 암호로 576 초 (10 분 미만)입니다. 능력이 떨어지지 만 결단력있는 적들에 대항하여도 그것은 부적절하게 부적절하다 .
CVn

이것은 MD5와 DES 때문에 매우 안전하지 않습니다 ...
AdamKalisz

DES 비밀번호를 암호화하는 방법을 보여주는 유일한 답변이되어 주셔서 감사합니다! IP 카메라 펌웨어의 루트 암호를 무시하려고 할 때 매우 유용합니다.
Malvineous

1

u150825와 Gert van den Berg에 대한 비판을 조금 더 확장하면서, 나는 다른 자동화 시스템을 가진 다른 상황에 대해 상대적으로 유연한 무언가가 필요하다는 것을 알았습니다. 나는 유용한 스크립트의 작은 라이브러리에 추가하고 이것을 작성하기로 결정했습니다. python 2.7+의 기본 라이브러리 만 사용하고 python3에서도 작동합니다.

원하는 경우 여기에서 선택할 수 있습니다 . 많이 사용하거나 http로 호스팅하거나 무엇이든 사용해야하는 경우 환경에이를 쉽게 드롭 할 수 있으며 사용 가능한 기본 파이썬 인터프리터가 무엇이든간에 모든 플랫폼에서 실행할 수 있습니다. 확실하게 작동합니다.

기본적으로 stderr에 프롬프트와 함께 getpass를 사용하라는 메시지가 표시되지만 (stdout을 쉽게 캡처 할 수 있음) 문자열을 파이프하면 stdin에서 얻을 수 있습니다. 당신 이이 일을하는 방법에 따라 명령 기록에 표시되지 않을 수도 있으므로 작업중 인 것을 인식하십시오. 저는 10 가지 방법으로 승리하기 위해 패키지 나 파이썬에 한 줄로 의존하지 않고 예상대로 작동하는 유연한 도구를 선호합니다.


어떤 버전의 파이썬이 이미 설치되어 있는지 여부는 시스템에 따라 다릅니다. 문제가 정확히 무엇입니까 chpasswd?
RalfFriedl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.