/ 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

openssl와 chpasswd -e쌍은 RHEL6에서 내 경우에는 작동하지 않았다. 결합 openssl passwd과 usermod -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.