Hitung hash bcrypt dari baris perintah

17

Saya ingin menghitung hash bcrypt kata sandi saya.

Apakah ada alat baris perintah sumber terbuka yang akan melakukan itu?

Saya akan menggunakan hash ini di file konfigurasi Syncthing (bahkan jika saya tahu dari sini bahwa saya dapat mengatur ulang kata sandi dengan mengedit file konfigurasi untuk menghapus pengguna dan kata sandi di bagian gui, kemudian restart Syncthing).

Gabriel Devillers
sumber

Jawaban:

25

Anda dapat (ab) menggunakan htpasswddari paket apache-utils , asalkan Anda memiliki versi 2.4 atau lebih tinggi.

htpasswd -bnBC 10 "" password | tr -d ':\n'

-bmengambil kata sandi dari argumen perintah kedua
-nmencetak hash ke stdout alih-alih menuliskannya ke file yang
-Bmemerintahkan untuk menggunakan bcrypt
-C 10menetapkan biaya bcrypt ke 10

Perintah telanjang htpasswd menampilkan dalam format <name>: <hash> diikuti oleh dua baris baru. Karenanya string kosong untuk nama dan trpengupasan usus besar dan baris baru.

Perintah menampilkan bcrypt dengan $2y$awalan, yang mungkin menjadi masalah untuk beberapa penggunaan, tetapi dapat dengan mudah diperbaiki oleh yang lain sedkarena varian OpenBSD yang digunakan $2a$kompatibel dengan varian tetap menggunakan crypt_blowfish $2y$.

htpasswd -bnBC 10 "" password | tr -d ':\n' | sed 's/$2y/$2a/'

Tautan ke halaman manual htpasswd: https://httpd.apache.org/docs/2.4/programs/htpasswd.html
Detail tentang varian bcrypt: /programming//a/36225192/6732096

Disassembler
sumber
Versi ini memiliki masalah dengan implementasi BCrypt dari Java Spring Security. Kata sandi untuk hash harus diakhiri dengan karakter nol. Spring Security tampaknya melakukannya dengan benar. Saya pikir htpasswd tidak melakukan ini dengan benar.
k_o_
@k_o_: Dapatkah Anda lebih spesifik tentang "memiliki masalah"? Semua implementasi bcrypt menggunakan terminator karakter nol. Beberapa, seperti py-bcrypt bahkan memiliki pemeriksaan tambahan untuk memastikan bahwa karakter nol bukan bagian dari kata sandi. Anda dapat memeriksa implementasi Apache di GitHub . Saya menggunakan htpasswd dengan sed tambahan untuk mengisi catatan database untuk beberapa aplikasi Spring tanpa masalah (itulah sebenarnya bagaimana saya sampai pada jawabannya).
Disassembler
Saya berasumsi bahwa meninggalkan karakter nol adalah masalah htpasswd untuk menjelaskan pengkodean yang berbeda antara Spring dan htpasswd. Output dari bcrypt menggunakan pendekatan Python jawaban lain menghasilkan hasil yang sama seperti di Spring, tetapi htpasswd tidak. Mungkin juga versi htpasswd saya sudah cukup lama, saya pikir biner tidak diperbarui sejak 2 tahun.
k_o_
11

Anda dapat menggunakan pustaka Python. Pada sistem Fedora saya, saya lakukan:

sudo dnf search bcrypt

(sudo hanya untuk menghindari pemborosan ruang untuk cache dnf pengguna) dan dari hasilnya dapat melihat ada paket Python2 dan Python3:

py-bcrypt.x86_64 : Python bindings for OpenBSD's Blowfish password hashing code
python3-py-bcrypt.x86_64 : Python 3 bindings for OpenBSD's Blowfish password hashing code

Instal versi Python2 dan daftarkan file dalam paket:

sudo dnf install py-bcrypt.x86_64
rpm -ql py-bcrypt.x86_64

Ini menunjukkan ada file /usr/lib64/python2.7/site-packages/bcrypt/__init__.pysehingga saya bisa mendapatkan dokumentasi

pydoc bcrypt

Ini menunjukkan saya cukup untuk menulis perintah berikut yang akan hash string "password":

$ python -c 'import bcrypt; print(bcrypt.hashpw("password", bcrypt.gensalt(log_rounds=10)))'
$2a$10$vWFRZgbOx6RKOKYxCTtyWuMJM60E90Vdm/.0nj.X/o3dYUxvQ/2Dm

Untuk versi bcryptpenggunaan yang lebih baru, rounds=alih-alih log_rounds=.

meuh
sumber
2
+1. FTR Anda tidak perlu sudodijalankan dnf search, itu berfungsi dengan baik sebagai pengguna standar.
Stephen Kitt
1
Pada April 2018 parameternya log_roundstampaknya telah berubah untuk roundsmembuatnya python -c 'import bcrypt; print(bcrypt.hashpw("password", bcrypt.gensalt(rounds=10)))'.
HorstKevin
4

Tambahan untuk @Disassemblerjawaban:

  • itu bukan ide yang baik untuk memasukkan kata sandi dari baris perintah (karena kata sandi dapat dilihat dengan ps)
  • 15 adalah keseimbangan yang baik untuk kecepatan pembuatan kata sandi / kompleksitas

Skrip pembungkus untuk htpasswd& bcrypt:

#!/bin/sh

## bcrypt passwd generator ##
#############################
CMD=$(which htpasswd 2>/dev/null)
OPTS="-nBC 15"
USERNAME=$1

usage() {
        local script=$(basename $0)
        cat <<EOF
$script: Generate Bcrypt Hashed Passwords using htpasswd

Usage: $script username
EOF
        exit 1
}

check_config() {
    if [ -z $CMD ]; then
        printf "Exiting: htpasswd is missing.\n"
        exit 1
    fi

    if [ -z "$USERNAME" ]; then
            usage
    fi
}

check_config $USERNAME
printf "Generating Bcrypt hash for username: $USERNAME\n\n"
$CMD $OPTS $USERNAME
exit $?
Stuart Cardall
sumber
1
Dan kecuali Anda memulai baris perintah dengan spasi, kata sandi akan pergi ke riwayat shell Anda (file yang mungkin tidak dienkripsi).
Gabriel Devillers
@GabrielDevillers ya, sama di sini. Saya menambahkan "-i" ke OPTS dan "" ke baris ke-2 hingga terakhir.
towi
untuk riwayat BASH & mySQL untuk rootpengguna, sebaiknya buat tautan simbolik /dev/null.
Stuart Cardall
1
Mengenai komentar @ GabrielDevillers, mungkin perlu disebutkan bahwa menambahkan spasi ke awal tidak selalu menyembunyikan item dari riwayat shell - tergantung pada shell dan pengaturan.
gemetar