섀도 용 SHA-512 해시 비밀번호를 만드는 방법은 무엇입니까?


62

이전에 본 SF 질문은 MD5 해시 암호를 생성하는 답변으로 이어졌습니다.

SHA-512 해시 비밀번호를 생성 할 사람이 있습니까? 스크립트 대신 하나의 라이너를 선호하지만 스크립트가 유일한 솔루션이라면 괜찮습니다.

최신 정보

이전 py2 버전을 다음으로 바꾸십시오.

python3 -c "import crypt;print(crypt.crypt(input('clear-text pw: '), crypt.mksalt(crypt.METHOD_SHA512)))"

4
SHA와 MD5는 암호화 가 아닙니다 . 해싱 알고리즘입니다. 중요한 차이점은 해시 된 데이터를 복구 할 수 없다는 것입니다. 뭘하길 원해?
SmallClanger

감사합니다. 질문을 수정했습니다. man 5 shadow"암호화 된 암호"라고해서 그 용어를 사용했습니다.
벨민 페르난데스

2
약간 비꼬는 경우 사과합니다. 섀도 호환 암호 해시를 수동으로 생성하려고합니까? 그렇다면 /etc/shadow내용을 살펴보십시오 . 당신은 볼 수 있습니다 $x$salt$hash. x알고리즘에 의해 사용되는 의미 crypt6SHA512 (참조 현대적인 linuxes에 통상적 인을 man 3 crypt). 아래 답변 중 하나에 동일한 소금을 주면 동일한 해시가 생성됩니다.
SmallClanger

2
아뇨, 전혀 소리 지르지 않습니다. 당신은 내가 혼란스러워 한 것을 분명히 했으므로 매우 감사합니다.
벨민 페르난데스

1
감사합니다! passlib 기반의 하나는 내가 OS X의 작업을 할 수있었습니다 유일
Stig가 Brautaset

답변:


65

하나의 라이너가 있습니다.

python -c 'import crypt; print crypt.crypt("test", "$6$random_salt")'

Python 3.3 이상에는 mksaltcrypt가 포함 되어 있어 훨씬 더 쉽고 안전하게 사용할 수 있습니다.

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

당신이 인수를 제공하지 않는 경우 crypt.mksalt(받아 들일 수 crypt.METHOD_CRYPT, ...MD5, SHA256,과 SHA512), 그것은 강한 사용할 수를 사용합니다.

해시의 ID (첫 번째 이후의 숫자 $)는 사용 된 방법과 관련이 있습니다.

  • 1-> MD5
  • 2a-> 복어 (주요 glibc에 없음; 일부 Linux 배포판에 추가됨)
  • 5-> SHA-256 (glibc 2.7부터)
  • 6-> SHA-512 (glibc 2.7부터)

나는 소금이 무엇인지 찾아 보는 것이 좋으며 smallclamgers에 따르면 암호화와 해싱의 차이점을 언급합니다.

업데이트 1 : 생성 된 문자열은 그림자 및 킥 스타트 스크립트에 적합합니다. 업데이트 2 : 경고. Mac을 사용하는 경우 Mac에서 예상대로 작동하지 않는 경우 Python에서이를 사용하는 것에 대한 의견을 참조하십시오.


5
random_salt실제 무작위 소금으로 교체하십시오 .
Belmin Fernandez

6
요세미티에서는 작동하지 않습니다. 이것이 뱉어내는 것입니다 : $6asQOJRqB1i2-정확하기에 충분히 길지 않은 것 같습니다!
Stig Brautaset

3
크립트 모듈이 당신을 위해 소금을 만들어 보자 : python -c 'import crypt; print crypt.crypt("test", crypt.mksalt(crypt.METHOD_SHA512))'
rrauenza

2
glibc는 기본적으로 5000 라운드 만 사용 하는데 요즘 상당히 약합니다. "$ rounds = ###"을 추가하여 라운드 수를 지정할 수 있습니다 (예 :) crypt.crypt("test", "$6$rounds=200000$random_salt"). 200000은 현재 랩톱에서 약 100ms를 사용합니다.
srparish

2
적어도 Mac에서는 사용해서는 안됩니다. Mac (10.13.5)에서는 매번 동일한 잘못된 결과를 반환합니다.
oskarpearson

37

데비안에서는 mkpasswd 를 사용하여 / etc / shadow에 적합한 다른 해싱 알고리즘으로 암호를 만들 수 있습니다 . 패키지 whois에 포함되어 있습니다 (apt-file에 따라).

mkpasswd -m sha-512
mkpasswd -m md5

사용 가능한 해싱 알고리즘 유형 목록을 얻으려면

mkpasswd -m help 

HTH


3
어떤 패키지가 제공합니까? mkpasswdFedora 에는 프로그램 (예상 부분)도 있지만이 목적에는 쓸모가 없습니다.
Cristian Ciupitu

그가 말했듯이, mkpasswd그가 말하는 버전은 데비안 / 우분투입니다. mkpasswd페도에 (적어도 최대 14)는 누락 -m스위치.
slm

3
흥미롭게도 데비안의 유산 인 후이즈 패키지입니다. dpkg -S /usr/bin/mkpasswd내가 그것을 믿을 수 없었다 참조 : D
Rbjz

암호를 확인하려면 첫 번째 숫자가 6 인 경우 두 번째 달러와 세 번째 달러 사이의 부분을 소금으로 사용하십시오. 예를 들어 root:$6$AbCdE$xyz:...다음을 사용해야합니다 mkpasswd -m sha-512 -S AbCdE.. 올바른 비밀번호를 사용하면 동일한 해시를 얻게됩니다.
Luc

24

최고의 답변 : grub-crypt

Usage: grub-crypt [OPTION]...
Encrypt a password.

-h, --helpPrint this message and exit
-v, --version           Print the version information and exit
--md5                   Use MD5 to encrypt the password
--sha-256               Use SHA-256 to encrypt the password
**--sha-512             Use SHA-512 to encrypt the password (default)**

1
간단한 솔루션. CentOS 6에서 나를 위해 일했습니다.
Banjer

4
grub-crypt명령 이있는 시스템 에서는이 작업이 가장 간단하고 편리한 방법입니다. 당신이 그것을 조일 수있을 때 수동으로 소금을 가지고 노는 의미가 없습니다. 문제는 점점 더 현대적인 시스템에 GRUB2가 있으며이 명령을 포함하지 않는다는 것입니다.
rsaw

11

다음은 다양한 Unix 유형 OS에서 SHA-512 비밀번호를 생성하는 간단한 C 코드입니다.

파일: passwd-sha512.c

#define _XOPEN_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
  if ( argc < 3 || (int) strlen(argv[2]) > 16 ) {
    printf("usage: %s password salt\n", argv[0]);
    printf("--salt must not larger than 16 characters\n");
    return;
  }

  char salt[21];
  sprintf(salt, "$6$%s$", argv[2]);

  printf("%s\n", crypt((char*) argv[1], (char*) salt));
  return;
}

컴파일하기:

/usr/bin/gcc -lcrypt -o passwd-sha512 passwd-sha512.c

용법:

passwd-sha512 <password> <salt (16 chars max)>

이 질문은 3 살입니다 ...
Grumpy

이 의견은 그렇게 오래되지 않았습니다. 당신이 거기에 도착 귀여운 응용 프로그램, 그것은 심지어 맨 페이지 예처럼 보이는 동안 단지 1 c 답변입니다 :)
Sampo Sarrala

4

SHA-512 해시 비밀번호를 생성하는 Perl one-liner 솔루션 :

perl -le 'print crypt "desiredPassword", "\$6\$customSalt\$"'

RHEL 6 작업


2

/ etc / shadow에 대한 모든 비밀번호 해싱이 sha512를 사용하여 수행되도록 Centos / RHEL 시스템에 대해 다음 점검 및 수정을 수행하지 않겠습니까? 그런 다음 passwd 명령을 사용하여 패스 워크를 정상적으로 설정할 수 있습니다.

#Set stronger password hasing
/usr/sbin/authconfig --test | grep sha512 > /dev/null
if [ $? -ne 0 ]; then
echo "Configuring sha512 password hashing"
sudo /usr/sbin/authconfig --enableshadow --passalgo=sha512 --updateall
fi

2

다음은 쉘 명령을 사용하여 임의 소금을 사용하여 SHA-512 해시 비밀번호를 작성하는 단일 라이너입니다.

[root @ host] mkpasswd -m sha-512 MyPAsSwOrD $ (openssl rand -base64 16 | tr -d '+ ='| head -c 16)

노트

  1. "mkpasswd"를 제공하는 "whois"패키지 (Debian, SuSE 등)를 설치해야 할 수도 있습니다.
  2. "/ etc / shadow"의 행 형식에 대한 자세한 내용은 crypt (3)를 참조하십시오.

불행히도 whoisFedora 18 의 패키지는 어떤 것도 제공하지 않습니다 mkpasswd.
Cristian Ciupitu

1
아치 리눅스에서 : / usr / bin / mkpasswd는 expect 5.45-3 소유
Nowaker

Fedora 20에서도 동일하며 다른 작업을 수행합니다.
Cristian Ciupitu

2
안타깝게도 제안 된 명령에는 두 가지 문제가 있습니다. 1) 제공된 암호는 이제 쉘 기록에 저장되며 'history'명령 또는 이와 유사한 명령을 가진 모든 사람이 볼 수 있습니다. 2) 명령 줄에 임의의 소금을 공급할 필요가 없으며 펑키 한 openssl 트릭을 사용하는 대신 mkpasswd에서 소금을 공급해야한다고 생각합니다. (이것은 적어도 우분투 Quantal에서는 사실입니다. 'mkpasswd -m sha-512 foo'를 여러 번 실행하여 테스트 할 수 있습니다. 소금의 변화를 볼 수 있습니다. 소금은 두 번째와 세 번째 $ 문자 사이의 값입니다. )
oskarpearson

2

이 답변의 보안 영향에 대해 알아 보려면 아래 주석을 읽으십시오.

루비 사고 방식의 사람들을 위해 여기에 하나의 라이너가 있습니다.

'password'.crypt('$6$' + rand(36 ** 8).to_s(36))

1
루비의 랜드 함수는 안전하지 않습니다. PRNG를 사용하므로,이를 실행 한 순간의 시간 / 상태를 추측하여 역 엔지니어링 할 수있는 결과가 생성됩니다.
oskarpearson

1

이 스크립트는 Ubuntu 12.04 LTS에서 나를 위해 일했습니다 : https://gist.github.com/JensRantil/ac691a4854a4f6cb4bd9

#!/bin/bash
read -p "Enter username: " username
read -s -p "Enter password: " mypassword
echo
echo -n $username:$mypassword | chpasswd -S -c SHA512

다른 대안 중 일부에는없는 다음 기능이 있습니다.

  • 소금을 확실하게 생성합니다. 이 작업을 수동으로 수행해서는 안됩니다. 이제까지.
  • 쉘 히스토리 에는 아무것도 저장하지 않습니다 .
  • 명확하게하기 위해, 그것은 많은 사용자 암호를 생성 할 때 좋을 수있는 생성 된 사용자 암호를 인쇄합니다.

2
chpasswd시스템에있는 경우에만 작동합니다 .
Matt Sanders

참고 : chpasswd는 shadow-utils-4.1.5.1에서 -S를 지원하지 않습니다
Saustrup


0
#!/usr/bin/env python

import getpass

from passlib.hash import sha512_crypt

if __name__ == "__main__":
    passwd = getpass.getpass('Password to hash: ')
    hash = sha512_crypt.encrypt(passwd)

    print hash

원하는 경우 내 github 저장소에서 복제 할 수 있습니다 : https://github.com/antoncohen/mksha


0

하나의 라이너는 아니지만 누군가에게 도움이 될 수 있습니다.

import crypt, getpass, pwd, string, sys, random
randomsalt = ""
password = getpass.getpass()
choices = string.ascii_uppercase + string.digits + string.ascii_lowercase
for _ in range(0,8):
    randomsalt += random.choice(choices)
print crypt.crypt(password, '$6$%s$' % randomsalt)

random암호화 적으로 안전하지 않으므로 os.urandom사용해야합니다. 56 자 길이의 사전에서 8 자도 너무 적습니다. 파이썬에서 찌르는 소리를 반복적으로 묶는 것도 나쁜 형태입니다 (O (n ^ 2) 복잡성)
Hubert Kario

0
$ htpasswd -c /tmp/my_hash user1
New password: 
Re-type new password: 
Adding password for user user1
$ cat /tmp/my_hash
user1:$apr1$oj1ypcQz$4.6lFVtKz2nr8acsQ8hD30

분명히, 당신은 단지 두 번째 필드를 잡고, 파일을 그림자에 추가하거나 sudo와 함께 사용하기 위해 파일을 삭제할 수 있습니다 (여전히 그림자 일 가능성이 높습니다).


0

crypt (3) 매뉴얼 페이지를 살펴보면 glibc 및 sha256 ($ 5) 및 sha512 ($ 6), 여러 라운드, 훨씬 더 큰 소금 등을 사용하도록 암호화 도구가 업데이트되었다고 생각합니다. .

분명히 SHA512는 / etc / shadow의 작동 방식과 관련이 있습니다.

즉,이 웹 페이지는 내 문제를 해결했기 때문에 특히 MKPASSWD 매우 유용했습니다.

잠재적으로 "잃어버린"암호가 주어지면 MKPASSWD와 솔트를 사용하여 SHA512 해시를 생성하고 후보 암호 목록을 확인 / 거부 할 수 있습니다.

나는 리퍼 존을 사용하지만 적어도 내 하드웨어 (Raspberry Pi)와 예산 (아무것도하지 않음)에서 존을 할 수 없습니다 (Raspbian 무료 버전의 고급 crypt / glibc 항목을 지원하지 않는 것 같습니다.

/ etc / shadow를 읽고 쓸 수있는 충분한 권한이 있기 때문에 해시를 덮어 쓰고 삶을 살 수 있습니다. 이것은 학업적인 운동입니다.


참고 Glibc 참고이 기능의 glibc2 버전은 추가 암호화 알고리즘을 지원합니다.

   If salt is a  character  string  starting  with  the  characters
   "$id$" followed by a string terminated by "$":

          $id$salt$encrypted

   then instead of using the DES machine, id identifies the encryp‐
   tion method used and this then determines how the  rest  of  the
   password  string is interpreted.  The following values of id are
   supported:

          ID  | Method
          ─────────────────────────────────────────────────────────
          1   | MD5
          2a  | Blowfish (not in mainline glibc; added in some
              | Linux distributions)
          5   | SHA-256 (since glibc 2.7)
          6   | SHA-512 (since glibc 2.7)

   So  $5$salt$encrypted  is  an  SHA-256  encoded   password   and
   $6$salt$encrypted is an SHA-512 encoded one.

0

perl / python으로 작성된 하나의 라이너에 대한 대안이 필요한 경우 mkpasswd가 적합합니다. 데비안 후이즈 패키지에 포함되어 있지만 CentOS / RHEL 시스템에는 없습니다. mkpasswd의 데비안 버전을 수정했으며 OpenSSL을 기반으로 더 강력한 솔트 생성 메커니즘을 포함 시켰습니다. 결과 바이너리는 데비안의 모든 버전 명령 행 매개 변수를 완전히 보존합니다. 코드는 github에서 사용 가능하며 모든 Linux 버전에서 컴파일해야합니다. mkpasswd


-4

SHA-512의 관련성이 확실하지 않습니다 /etc/shadow. 이 비밀번호는 crypted입니다.

그러나 SHA-512로 해시 된 비밀번호를 원한다면으로 할 수 있습니다 echo -n the_password | sha512sum. / etc / shadow에는 출력을 사용할 수 없습니다.


2
echo -n the_password그래서 당신은 개행을 해시하지 않습니다. </
pedant

shadow이후 몇 년 동안 암호는 더 이상 crypt ()되지 않습니다. 최신 시스템은 md5 이상을 사용합니다.
Alexander Janssen

6
실제로 암호 shadow는 계속 입력 crypt()되지만 여러 가지 알고리즘을 지원하도록 기능이 업데이트되었습니다. 그럼에도 불구하고이 답변에 설명 된 방법은에 적합한 해시를 생성하지 않습니다 /etc/shadow. 이 알고리즘은 단일 SHA-512 해시 라운드보다 복잡합니다.
스냅
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.