Secara manual menghasilkan kata sandi untuk / etc / shadow


109

Saya perlu mengedit secara manual /etc/shadowuntuk mengubah kata sandi root di dalam gambar mesin virtual.

Apakah ada alat baris perintah yang mengambil kata sandi dan menghasilkan /etc/shadowhash kata sandi yang kompatibel pada standar keluar?

Jawaban:


126

Anda dapat menggunakan perintah berikut untuk hal yang sama:

Metode 1 (md5, sha256, sha512)

openssl passwd -6 -salt xyz  yourpass

Catatan: passing -1akan menghasilkan kata sandi MD5, -5SHA256 dan -6SHA512 (direkomendasikan)

Metode 2 (md5, sha256, sha512)

mkpasswd --method=SHA-512 --stdin

Metode menerima md5, sha-256dansha-512

Metode 3 (des, md5, sha256, sha512)

Seperti yang disarankan @tink, kami dapat memperbarui kata sandi chpasswdmenggunakan:

echo "username:password" | chpasswd 

Atau Anda dapat menggunakan kata sandi terenkripsi dengan chpasswd. Pertama buat menggunakan ini:

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

Kemudian, Anda dapat menggunakan kata sandi yang dihasilkan untuk memperbarui:

echo "username:encryptedPassWd"  | chpasswd -e

Kata sandi terenkripsi ini dapat kita gunakan untuk membuat pengguna baru dengan kata sandi, misalnya:

useradd -p 'encryptedPassWd'  username

3
Saat menggunakan chpasswd -e, pastikan untuk menggunakan tanda kutip tunggal pada string yang Anda gunakan echo; jika tidak, jika ada $atau karakter khusus lainnya, mereka tidak akan diperlakukan secara harfiah.
Zags

4
Perhatikan bahwa hasil ini akan berakhir dalam riwayat shell Anda. Saya akan menggunakan openssl passwd -1yang 1) tidak berakhir di sana dan 2) menghasilkan garam acak untuk Anda (yang tidak berakhir dalam sejarah shell, juga).
Ztyx

1
openssl passwddokumentasi untuk siapa pun yang mencoba mencari tahu apa yang dilakukan -1opsi.
CivFan

4
Untuk hash SHA-512: python3 -c 'import crypt; print(crypt.crypt("test", crypt.mksalt(crypt.METHOD_SHA512)))'- dari pertanyaan terkait ServerFault
CivFan

9
Metode 1) dan 2) di atas menggunakan MD5 untuk hashing. MD5 tidak dianggap praktik terbaik lagi karena telah terjadi tabrakan hash. Gunakan metode 3) atau yang dijelaskan di unix.stackexchange.com/a/198906/10911 .
Ztyx

36

Di Ubuntu 12.04, ada mkpasswd (dari paket whois): Frontfender berlebih hingga crypt (3)

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

Dimana:

  • -m= Hitung kata sandi menggunakan metode TYPE. Jika TYPE membantu, maka metode yang tersedia akan dicetak.
  • -S = garam yang digunakan.

Misalnya

$ mkpasswd -m help

-s = Read password from stdin

8
Tidak perlu menentukan garam, mkpasswd menangani pembuatan yang acak.
Ke 마 SE

1
Apa pun itu, kata sandi yang dihasilkan dari mkpasswd yang disalin ke / etc / passwd selalu gagal. Apakah ada cara untuk memeriksa apakah hash yang dibuat oleh mkpasswd benar?
CMCDragonkai

@ CMCDragonkai: Pertanyaan salah. Anda perlu bertanya apa yang diharapkan sistem Anda.
user3183018

1
@To 마 SE: Kadang-kadang berguna untuk mengontrol garam. Saya telah menggunakannya ketika menguji generasi hash dari kata sandi untuk aplikasi web di mana saya menyimpan garam di toko yang terpisah. Misalnya kata sandi hash dalam MySQL DB, dan per pengguna garam di Redis.
user3183018

15

Solusi ini memiliki manfaat sebagai berikut:

  • Tidak ada tambahan untuk dipasang
  • Tidak menyimpan kata sandi dalam riwayat shell Anda
  • Menghasilkan garam acak untuk Anda
  • Menggunakan algoritma hashing modern, kuat, SHA-512
  • Meminta kembali kata sandi untuk menghindari kesalahan.

    $ 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.')"
    

Referensi


3

Bagi yang tanpa sistem berbasis Debian. Python3 juga berfungsi dengan baik.

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

CATATAN: String "test" adalah kata sandi yang kami hasilkan sebagai string yang disandikan.


Untuk beberapa alasan, menggunakan crypt.mksalttidak berfungsi saat membuat kata sandi untuk /etc/shadow. Tapi metode @ Alex131089 berhasil!
maulinglawns

Hanya membuang waktu 1,5 jam untuk mencoba metode ini, sebelum saya perhatikan komentarnya. Adakah yang bisa menghapusnya? Saya belum bisa mengundurkan diri.
Michał F

1
@ MichałF sepertinya ini tidak berfungsi karena pengasinan tidak dilakukan dengan benar. Terima kasih telah menunjukkan ini. Saya telah menghilangkan garam karena pengasinan tergantung pada OS dan tidak praktis untuk menjelaskan semua rentang OS dalam jawaban saya. Anda harus menggunakan Metode 1 yang digariskan oleh @RahulPatil karena memungkinkan Anda untuk menggunakan pengasinan dan opensslmerupakan alat yang cukup universal.
Greg

Tidak disarankan, karena meninggalkan kata sandi Anda dalam riwayat shell Anda.
Mark Stosberg

Maksud saya, Anda selalu dapat menghapus cmd dari riwayat shell Anda
Greg

3

Tidak satu pun dari metode saat ini yang dapat diterima oleh saya - Mereka baik melewati kata sandi pada baris perintah (yang berakhir dalam sejarah shell saya), memerlukan instalasi utilitas tambahan ( python3, makepasswd), menggunakan garam kode keras atau menggunakan teknik hashing lama.

Metode ini akan menghasilkan hash SHA-512 setelah meminta kata sandi dan akan menggunakan garam acak.

Metode yang menggunakan Python 2 tanpa pustaka non-standar:

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

Untuk melakukannya tanpa prompt: (Ini akan meninggalkan kata sandi Anda dalam sejarah perintah)

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

2
Untuk menghindari meninggalkan kata sandi dalam histori perintah, Anda dapat mengatur (untuk bash, setidaknya) variabel lingkungan HISTCONTROL ke 'ignorespace', dan kemudian menambahkan ruang utama di depan perintah.
adam820

@ adam820: Itu adalah salah satu cara ... Itu akan tetap di psoutput dalam sepersekian detik bahwa perintah sedang berjalan. (Tetap paling aman untuk menggunakan versi yang meminta kata sandi)
Gert van den Berg

2

The openssldan chpasswd -epasangan tidak bekerja dalam kasus saya di RHEL6. Menggabungkan openssl passwddan usermod -pmemerintahkan melakukan pekerjaan.

Hasilkan nilai hash kata sandi bersama dengan nilai garam:

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

$1$5RPVAd$vgsoSANybLDepv2ETcUH7.

Kemudian, salin string terenkripsi ke usermod. Pastikan untuk membungkusnya dengan tanda kutip tunggal.

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

Lihat dalam file bayangan.

$ grep root /etc/shadow

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

1

Namun metode lain untuk menghasilkan kata sandi, menggunakan opensslalat.

Hasilkan kata sandi MD5

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

Hasilkan kata sandi DES

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

3
Apa bedanya dengan metode 1 dalam jawaban Rahul Patil ? Perhatikan bahwa algoritma hashing kata sandi berbasis DES lama pasti tidak boleh digunakan! Untuk satu hal, itu hanya mendukung kata sandi hingga delapan byte, yang sangat tidak memadai hari ini.
CVn

3
Mengutip Snowden: "Asumsikan lawanmu mampu tebakan satu triliun per detik." Dengan karakter karakter 70-karakter yang tidak sepenuhnya tidak masuk akal dan kata sandi yang sepenuhnya acak, itu 576 detik - kurang dari sepuluh menit. Bahkan melawan musuh yang kurang mampu tetapi bertekad bulat, itu sangat tidak memadai .
CVn

Ini tidak terlalu aman, karena MD5 dan DES ...
AdamKalisz

Terima kasih telah menjadi satu-satunya jawaban yang menunjukkan cara mengenkripsi kata sandi DES! Sangat berguna untuk mencoba menimpa kata sandi root untuk firmware kamera IP.
Malvineous

1

Memperluas sedikit pada kritik u150825 dan Gert van den Berg, saya menemukan diri saya membutuhkan sesuatu yang relatif fleksibel untuk situasi yang berbeda dengan sistem otomasi yang berbeda. Saya memutuskan untuk menambah perpustakaan kecil saya yang berisi skrip yang berguna dan menulis ini. Hanya menggunakan pustaka asli dari python 2.7+, dan bekerja di python3 juga.

Anda dapat mengambilnya di sini jika mau. Sama mudahnya untuk menjatuhkan ini di lingkungan Anda jika Anda perlu sering menggunakannya, http-host atau apa pun, dan Anda dapat menjalankannya pada platform apa pun menggunakan apa pun penerjemah python default yang tersedia untuk Anda, cukup andal mengandalkannya bekerja.

Ini default untuk meminta menggunakan getpass dengan meminta pada stderr (memungkinkan penangkapan stdout mudah), tetapi jika Anda menyalurkan string ke sana, ia hanya akan menuai dari stdin. Bergantung pada bagaimana Anda melakukan ini, itu mungkin tidak muncul dalam sejarah perintah, jadi, sadarilah apa yang sedang Anda kerjakan. Saya suka memiliki alat yang fleksibel yang akan berperilaku dengan cara yang diharapkan, daripada harus bergantung pada paket atau python satu-baris cara saya untuk kemenangan 10 cara yang berbeda.


Apakah python dalam versi apa pun sudah diinstal atau tidak tergantung pada sistem. Sebenarnya apa masalahnya chpasswd?
RalfFriedl
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.