Cách tạo băm mật khẩu SHA512 trên dòng lệnh


83

Trong Linux, tôi có thể tạo hàm băm mật khẩu SHA1 bằng cách sử dụng sha1pass mypassword. Có một công cụ dòng lệnh tương tự cho phép tôi tạo sha512băm không? Câu hỏi tương tự cho BcryptPBKDF2.


Ý bạn là sha1sumsao?

1
@Tichodroma không, thực sự có một sha1passlệnh, một phần của gói chung syslinux trên Debian.
derobert

2
Có một sha512sumlệnh đó là một phần của coreutils, và tương tự openssl sha512- nhưng cũng không phải là thứ bổ sung sha1pass.
Keith Thompson

Câu trả lời:


55

Có, bạn đang tìm kiếm mkpasswd, mà (ít nhất là trên Debian) là một phần của whoisgói. Đừng hỏi tại sao ...

anthony@Zia:~$ mkpasswd -m help
Available methods:
des     standard 56 bit DES-based crypt(3)
md5     MD5
sha-256 SHA-256
sha-512 SHA-512

Thật không may, phiên bản của tôi ít nhất không làm bcrypt. Nếu thư viện C của bạn làm như vậy, nó sẽ (và manpage cung cấp tùy chọn -R để đặt độ mạnh). -R cũng hoạt động trên sha-512, nhưng tôi không chắc PBKDF-2 của nó hay không.

Nếu bạn cần tạo mật khẩu bcrypt, bạn có thể thực hiện nó khá đơn giản với Crypt::Eksblowfish::Bcryptmô-đun Perl.


70

Trên bất kỳ bản phân phối Red Hat nào như Fedora, CentOS hoặc RHEL, lệnh mkpasswdkhông bao gồm cùng một bộ chuyển đổi như phiên bản thường có trong Debian / Ubuntu.

LƯU Ý: Lệnh mkpasswdthực sự là một phần của expectgói và có lẽ nên tránh. Bạn có thể tìm ra gói nào thuộc về một trong hai lệnh này.

$ yum whatprovides "*/mkpasswd"
-or-
$ repoquery -q --file */mkpasswd

Thí dụ

$ repoquery -q --file */mkpasswd
expect-0:5.43.0-8.el5.x86_64
expect-0:5.43.0-8.el5.i386

Cả hai phương pháp này đều vượt trội so với việc sử dụng rpmvì các gói không phải cài đặt để định vị */mkpasswd.

Cách giải quyết

Để giải quyết vấn đề này, bạn có thể sử dụng các lớp lót Python hoặc Perl sau đây để tạo mật khẩu SHA-512. Hãy lưu ý rằng đây là những món mặn:

Con trăn (> = 3,3)

$ python -c 'import crypt,getpass; print(crypt.crypt(getpass.getpass(), crypt.mksalt(crypt.METHOD_SHA512)))'

-hoặc kịch bản-

$ python -c 'import crypt; print(crypt.crypt("somesecret", crypt.mksalt(crypt.METHOD_SHA512)))'

Python (2.x hoặc 3.x)

$ python -c "import crypt, getpass, pwd; \
             print(crypt.crypt('password', '\$6\$saltsalt\$'))"

$6$saltsalt$qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2/jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh/

Lưu ý: $ 6 $ chỉ định sha512. Hỗ trợ cho phương pháp xác định thuật toán này phụ thuộc vào hỗ trợ trong chức năng thư viện mã hóa cấp độ hệ điều hành (3) (thường là trong libcrypt). Nó không phụ thuộc vào phiên bản python.

Perl

$ perl -e 'print crypt("password","\$6\$saltsalt\$") . "\n"'
$6$saltsalt$qFmFH.bQmmtXzyBY0s9v7Oicd2z4XSIecDzlB5KiA2/jctKu9YterLp8wwnSq.qc.eoxqOmSuNp2xS0ktL3nh/

Trong các ví dụ này, mật khẩu là chuỗi "mật khẩu" và muối là "saltsalt". Cả hai ví dụ đều sử dụng $ 6 $ biểu thị rằng bạn muốn tiền điện tử sử dụng SHA-512.


2
Đối với lớp lót một con trăn, bạn có thể sử dụng crypt.mksalt(crypt.METHOD_SHA512)để tạo ra muối thay vì sử dụng một lớp cố định.
Jake Cobb

2
@JakeCobb crypt.mksaltchỉ khả dụng trong Python 3.x
Riccardo Murri

2
Trước khi nhập mật khẩu văn bản rõ ràng vào dòng lệnh, hãy đảm bảo bạn đã đặt "khoảng trống" trong HISTCONTROL (nghĩa là thực hiện điều này trước tiên trên CentOS / RHEL: echo 'export HISTCONTROL = "ignups: ignorespace"'> /etc/profile.d /histcontrol.sh && nguồn /etc/profile.d/histcontrol.sh). Nếu không, nó sẽ được lưu trong ~ / .bash_history của bạn.
Patrick

3
perl (và có lẽ là con trăn) sử dụng chức năng hệ thống "mật mã". Vì vậy, chúng không di động, chúng yêu cầu chức năng mã hóa hiểu loại băm được yêu cầu. Mật mã OSX không - nó chỉ mang lại cho tôi một chuỗi mã hóa kiểu cũ.
Dan Pritts

1
@RiccardoMurri Tôi có Python 2.7.5 và có quyền truy cập crypt.mksalttrên CentOS 7.1
user12345

15

Bạn có thể sử dụng doveadmtiện ích, được bao gồm trong dovecotgói.

doveadm pw -s SHA512-CRYPT

Ví dụ kết quả:

{SHA512-CRYPT}$6$0JvQ1LLFESzA16.I$JVdKAIq0igudTq06BMqzT9rL1gRawMPwLr9U3/kBMKUqZdONfa0wubC89C35LKl3aE16CRH57BfGb4ygPLggL1

Chỉ cần cắt {SHA512-CRYPT} và bạn sẽ nhận được chuỗi băm SHA512 của mình.


Không hoạt động đối với tôi như một người dùng thông thường:doveadm(jotik): Fatal: Error reading configuration: stat(/etc/dovecot/dovecot.conf) failed: Permission denied (euid=1000(jotik) egid=100(users) missing +x perm: /etc/dovecot, we're not in group 97(dovecot), dir owned by 0:97 mode=0750)
jotik

12

Chạy lệnh này:

$ /sbin/grub-crypt --sha-512

sau đó nhập từ bạn muốn băm.


-bash: / sbin / grub-crypt: Không có tệp hoặc thư mục như vậy
Will Sheppard

Tôi không tin grub là trên c7 vì vậy bạn có thể sử dụng: nhập mã hóa python -c ', getpass; in (crypt.crypt (getpass.getpass (), crypt.mksalt (crypt.METHOD_SHA512))) '
ucemike

3

Để mở rộng các cách giải quyết của @ slm ở trên, nếu bạn lo lắng về việc ai đó nắm giữ lịch sử bash của bạn và xem mật khẩu văn bản đơn giản, bạn có thể chèn raw_input()vào câu lệnh python nơi các trường muối và mật khẩu sẽ nhắc bạn cho họ. Văn bản không bị che trong khi bạn đang gõ, nhưng nó sẽ không hiển thị trong lịch sử bash của bạn. Bạn cũng có thể bắt đầu lệnh với một không gian hàng đầu, nhưng tôi luôn quên làm điều đó.

python -c "import crypt, getpass, pwd; print crypt.crypt(raw_input(), '\$6\$' + raw_input() + '\$')"

2
Bạn cũng có thể định cấu hình bashđể không ghi lại các lệnh có tiền tố với một khoảng trắng thêm HISTCONTROL=ignorespacevào .bashrctệp của bạn . Khi bạn chạy một lệnh bạn muốn loại trừ khỏi lịch sử của bạn chỉ cần nhập một khoảng trắng sau đó là lệnh thực tế.
theillien

1

sha512 htpasswd

Lệnh yêu cầu người dùng và mật khẩu và tạo tệp htpasswd thông thường:

python -c 'import crypt,getpass; print(getpass.getpass("Name: ")+":"+crypt.crypt(getpass.getpass(),crypt.mksalt(crypt.METHOD_SHA512)))' >> htpasswd

Hoạt động với tất cả các phiên bản python> 2.5.


1

OpenSSL có

openssl passwd -6

Trợ giúp nói:

$ openssl passwd --help
Usage: passwd [options]
Valid options are:
...
 -6                  SHA512-based password algorithm

0

Nếu bạn sử dụng phương thức Python (> = 2.7) từ câu trả lời của sim và muốn xác nhận mật khẩu của bạn trước khi nó tạo ra - bởi vì mật khẩu ngón tay mập ...

$ python -c 'import crypt,getpass;pw=getpass.getpass(); print(crypt.crypt(pw), crypt.mksalt(crypt.METHOD_SHA512) if (pw==getpass.getpass("Confirm: ")) else exit())'

Trong phiên bản ngày 29 tháng 11 năm 2017 của câu trả lời này, nó cho biết điều này hoạt động với python 2.7 (hoặc mới hơn). Mô-đun mật mã của python2.7 không có mksalt (). Ngoài ra tôi nghĩ rằng bạn muốn cuộc gọi crypt.mksalt () là đối số thứ 2 thành crypt.crypt () (đặt sai vị trí gần paren?).
Juan

0

phiên bản openssl "OpenSSL 1.1.1, trên Linux và phiên bản openssl" LibreSSL 2.6.5, trên MacOS hỗ trợ md5_crypt.

Chỉ cần chạy và nhập mật khẩu:

openssl passwd -crypt
Password:
Verifying - Password:
<results_into_a_md5_crypt_password>

hoặc cung cấp mật khẩu văn bản đơn giản trực tiếp cho CLI:

openssl password -crypt <plain_text_password_goes_here>
<results_into_a_md5_crypt_password>

-12

Bạn có thể sử dụng sha512sum:

echo "password" | sha512sum

24
Câu trả lời này không chính xác. Lệnh sẽ không tạo ra hàm băm mật khẩu SHA-512 hợp lệ . Nó chỉ đơn giản là tính toán tổng kiểm tra mật khẩu chuỗi \ n (lưu ý rằng cuối cùng cũng có một dòng mới). Băm mật khẩu Unix được muối và bao gồm mã phiên bản băm giữa hai ký hiệu "$". Xem câu trả lời của @slm.
zorlem

Cụ thể hơn, vấn đề là trong khi mật khẩu hơi bị xáo trộn, phương pháp này dễ bị tấn công bởi en.wikipedia.org/wiki/Rainbow_table .
DepressionDaniel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.