วิธีสร้างรหัสผ่านที่แฮช 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อ้างถึงว่าเป็น "รหัสผ่านที่เข้ารหัส" ดังนั้นฉันจึงไปพร้อมกับคำนั้น
Belmin Fernandez

2
ขอโทษถ้านั่นเป็นคำพูดที่น่ารังเกียจ คุณกำลังพยายามสร้างแฮชรหัสผ่านที่เข้ากันได้กับเงาด้วยตนเองหรือไม่? ถ้าเป็นเช่นนั้นลองดูที่/etc/shadowเนื้อหาของคุณ $x$salt$hashคุณจะเห็น xหมายถึงขั้นตอนวิธีการที่ใช้โดยcryptมี6เป็นปกติใน Linuxes ที่ทันสมัยซึ่งเป็น SHA512 (ดูman 3 crypt) คำตอบทั้งสองข้อด้านล่างนี้จะสร้างแฮชเดียวกันตราบใดที่คุณให้เกลือเดียวกัน
SmallClanger

2
โอ้ไม่ไม่น่ารังเกียจเลย คุณชี้แจงสิ่งที่ฉันสับสนเกี่ยวกับดังนั้นฉันขอบคุณมาก!
Belmin Fernandez

1
ขอขอบคุณ! Passlib-based หนึ่งเดียวที่ฉันสามารถทำงานบน OS X ได้
Stig Brautaset

คำตอบ:


65

นี่คือหนึ่งซับ:

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

Python 3.3+ รวมmksaltอยู่ในห้องใต้ดินซึ่งทำให้ใช้งานได้ง่ายขึ้น (และปลอดภัยยิ่งขึ้น):

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 -> Blowfish (ไม่ใช่ใน mainline glibc; เพิ่มใน Linux ดิสทริบิวชัน)
  • 5 -> SHA-256 (ตั้งแต่ glibc 2.7)
  • 6 -> SHA-512 (ตั้งแต่ glibc 2.7)

ฉันขอแนะนำให้คุณค้นหาว่าเกลือเป็นเช่นไรและตามความเห็นของนักธุรกิจขนาดเล็กแสดงความคิดเห็นความแตกต่างระหว่างการเข้ารหัสและการแฮช

อัพเดต 1: สตริงที่สร้างขึ้นเหมาะสำหรับสคริปต์ shadow และ kickstart อัปเดต 2: คำเตือน หากคุณกำลังใช้งาน Mac ให้ดูความคิดเห็นเกี่ยวกับการใช้งานนี้ใน python บน mac ที่ดูเหมือนจะไม่ทำงานตามที่คาดไว้


5
แทนที่random_saltด้วยเกลือแบบสุ่มจริง
Belmin Fernandez

6
ฉันไม่สามารถทำงานนี้ในโยเซมิตีได้ นี่คือสิ่งที่มันถ่มน้ำลาย: $6asQOJRqB1i2- ดูเหมือนจะไม่นานพอที่จะถูกต้อง!
เพอร์ Brautaset

3
ปล่อยให้โมดูลฝังศพใต้ถุนโบสถ์ทำเกลือให้คุณ: python -c 'import crypt; print crypt.crypt("test", crypt.mksalt(crypt.METHOD_SHA512))'
rrauenza

2
glibc โดยค่าเริ่มต้นใช้เพียง5,000 รอบซึ่งค่อนข้างอ่อนแอในทุกวันนี้ คุณสามารถระบุจำนวนรอบโดยการเพิ่ม "$ รอบ = ###" crypt.crypt("test", "$6$rounds=200000$random_salt")ตัวอย่างเช่น: 200000 ใช้เวลาประมาณ 100ms ในแล็ปท็อปปัจจุบันของฉัน
srparish

2
ไม่ควรใช้สิ่งนี้อย่างน้อยใน Mac บน Mac (10.13.5) สิ่งนี้จะส่งกลับผลลัพธ์ที่ไม่ถูกต้องเหมือนเดิมทุกครั้ง
oskarpearson

37

บน Debian คุณสามารถใช้ mkpasswd เพื่อสร้างรหัสผ่านด้วยอัลกอริทึมการแฮชต่างๆที่เหมาะสมสำหรับ / etc / shadow มันรวมอยู่ในแพคเกจ whois (ตามไฟล์ apt)

mkpasswd -m sha-512
mkpasswd -m md5

เพื่อรับรายการ algoritms hashing ที่มีอยู่:

mkpasswd -m help 

HTH


3
มีแพ็คเกจอะไรบ้าง? มีmkpasswdโปรแกรม (ส่วนหนึ่งของการคาดหวัง) ภายใต้ Fedora ด้วย แต่ก็ไม่มีประโยชน์สำหรับจุดประสงค์นี้
Cristian Ciupitu

อย่างที่เขาพูดรุ่นที่mkpasswdเขาพูดถึงนั้นสำหรับ Debian / Ubuntu mkpasswdบน Fedora (อย่างน้อยถึง 14) จะหายไป-mสวิทช์
slm

3
อยากรู้อยากเห็นมันเป็นแพคเกจ whois มรดกจาก Debian ดู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

นี่คือรหัส C สั้น ๆ เพื่อสร้างรหัสผ่าน SHA-512 บนระบบปฏิบัติการ Unix ประเภทต่างๆ

ไฟล์: 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

ความคิดเห็นนี้ไม่เก่า แอปน่ารักคุณได้มีที่เพียง c ตอบมี 1up แม้ในขณะที่ดูเหมือนว่าตัวอย่างเช่นหน้าคน :)
Sampo Sarrala

4

Perl one-liner solution ในการสร้างรหัสผ่านที่แฮช SHA-512:

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

ทำงานบน RHEL 6


2

ทำไมไม่ทำการตรวจสอบและปรับเปลี่ยนต่อไปนี้กับเครื่อง Centos / RHEL เพื่อให้แน่ใจว่าการแฮ็กรหัสผ่านทั้งหมดสำหรับ / etc / shadow เสร็จสิ้นด้วย sha512 จากนั้นคุณสามารถตั้งค่า passworkd ของคุณตามปกติด้วยคำสั่ง 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. คุณอาจต้องติดตั้งแพ็คเกจ "whois" (Debian, SuSE, ฯลฯ ) ซึ่งให้บริการ "mkpasswd"
  2. ดู crypt (3) สำหรับรายละเอียดเกี่ยวกับรูปแบบของบรรทัดใน "/ etc / shadow"

น่าเสียดายที่whoisแพ็คเกจจาก Fedora 18 ไม่ได้ให้บริการอะไรmkpasswdเลย
Cristian Ciupitu

1
ใน Arch Linux: / usr / bin / mkpasswd เป็นเจ้าของโดยคาดว่า 5.45-3
Nowaker

เช่นเดียวกันกับ Fedora 20 และมันก็ทำอย่างอื่น
Cristian Ciupitu

2
น่าเสียดายที่คำสั่งที่แนะนำมีปัญหาสองประการ: 1) รหัสผ่านที่ให้มาจะถูกเก็บไว้ในประวัติเชลล์ของคุณและทุกคนที่เห็นคำสั่ง 'history' หรือที่คล้ายกัน 2) คุณไม่จำเป็นต้องใส่เกลือแบบสุ่มในบรรทัดคำสั่ง - และฉันคิดว่าคุณควรปล่อยให้ mkpasswd ทำเพื่อคุณแทนการใช้เทคนิค openssl ที่ขี้ขลาด (โปรดทราบว่านี่เป็นความจริงอย่างน้อยบน Ubuntu Quantal คุณสามารถทดสอบได้โดยใช้ 'mkpasswd -m sha-512 foo' หลายครั้งคุณจะเห็นการเปลี่ยนแปลงของเกลือเกลือเป็นค่าระหว่างตัวอักษรตัวที่ 2 และตัวที่ 3 )
oskarpearson

2

อ่านความคิดเห็นด้านล่างเพื่อเรียนรู้เกี่ยวกับผลกระทบด้านความปลอดภัยของคำตอบนี้

สำหรับความคิดของ Ruby นี่คือหนึ่งซับ:

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

1
สิ่งนี้ไม่ถูกต้อง: ฟังก์ชัน rand ของรูบี้ไม่ปลอดภัย - ใช้ 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

FYI: chpasswd ไม่สนับสนุน -S ใน shadow-utils-4.1.5.1
Saustrup



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ควรใช้cryptographically 8 ตัวอักษรจากพจนานุกรมยาว 56 ตัวอักษรก็น้อยเกินไป การเชื่อมโยงงูทับกันซ้ำแล้วซ้ำอีกเป็นรูปแบบที่ไม่ดีเช่นกัน (มีความซับซ้อน 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

เห็นได้ชัดว่าคุณเพิ่งคว้าฟิลด์ที่ 2 และสามารถลบไฟล์เมื่อคุณเพิ่มลงในเงาหรือเพื่อใช้กับ sudo (ยังคงเป็นเงามากที่สุด)


0

ลองดูที่หน้า man สำหรับ crypt (3) และฉันคิดว่าคุณจะพบว่าเครื่องมือ crypt นั้นได้รับการปรับปรุงให้ใช้ glibc และ sha256 ($ 5) และ sha512 ($ 6) หลายรอบเกลือที่ใหญ่กว่าและอื่น ๆ .

เห็นได้ชัดว่า SHA512 เกี่ยวข้องกับการทำงานของ / etc / shadow

ที่กล่าวว่าหน้าเว็บนี้มีประโยชน์มากโดยเฉพาะ MKPASSWD เนื่องจากนี่เป็นการแก้ไขปัญหาของฉัน

ด้วยรหัสผ่านที่ "หายไป" ฉันสามารถใช้ MKPASSWD และเกลือเพื่อสร้างแฮช SHA512 และยืนยัน / ปฏิเสธรายการรหัสผ่านผู้สมัคร

ฉันจะใช้ John the ripper - แต่อย่างน้อยในฮาร์ดแวร์ของฉัน (Raspberry Pi) และงบประมาณของฉัน (ไม่มีอะไร) - John ไม่สามารถทำได้ (ดูเหมือนจะไม่สนับสนุนสิ่ง crypt / glibc ขั้นสูงในรุ่นฟรีของ raspbian

โปรดทราบว่าเนื่องจากฉันได้รับอนุญาตให้อ่าน / เขียน / 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

หากคุณต้องการทางเลือกสำหรับ one-liners ที่เขียนด้วย perl / python mkpasswd เป็นคู่ที่ดี แม้ว่าจะรวมอยู่ในแพ็คเกจ Debian whois แต่ก็ขาดหายไปในระบบ CentOS / RHEL ฉันได้แก้ไขเวอร์ชัน Debian ของ mkpasswd และรวมถึงกลไกการสร้างเกลือที่แข็งแกร่งขึ้นตาม OpenSSL ไบนารีที่เป็นผลลัพธ์จะรักษาพารามิเตอร์บรรทัดคำสั่งเวอร์ชันของ Debian ทั้งหมดอย่างสมบูรณ์ รหัสสามารถใช้งานได้บน gitHub และควรรวบรวมในรสชาติ Linux ใด ๆ : mkpasswd


-4

ฉันไม่แน่ใจว่า SHA-512 เกี่ยวข้องกัน/etc/shadowอย่างไร รหัสผ่านเหล่านี้ถูกcryptแก้ไข

แต่ถ้าคุณต้องการรหัสผ่านถกกับ SHA-512 echo -n the_password | sha512sumคุณสามารถทำเช่นนี้โดย คุณไม่สามารถใช้เอาต์พุตสำหรับ / etc / shadow


2
echo -n the_passwordดังนั้นคุณจึงไม่ต้องขึ้นบรรทัดใหม่ </
pedant

รหัสผ่านในshadowไม่ได้ฝังศพใต้ถุนโบสถ์ () ได้อีกต่อไปนับตั้งแต่ปี ระบบสมัยใหม่ใช้อย่างน้อย md5
Alexander Janssen

6
รหัสผ่านที่แท้จริงshadowยังคงอยู่crypt()แต่ฟังก์ชั่นได้รับการปรับปรุงเพื่อรองรับอัลกอริทึมที่แตกต่างกัน /etc/shadowโดยไม่คำนึงถึงวิธีการที่อธิบายไว้ในคำตอบนี้ไม่ได้ผลิตกัญชาเหมาะสำหรับ อัลกอริทึมนั้นซับซ้อนกว่าแฮช SHA-512 รอบเดียว
snap
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.