Tính toán bcrypt băm từ dòng lệnh


17

Tôi muốn tính băm mật khẩu bcrypt của mật khẩu của tôi.

Có một công cụ dòng lệnh nguồn mở nào sẽ làm điều đó không?

Tôi sẽ sử dụng băm này trong tập tin cấu hình Syncthing (ngay cả khi tôi biết từ đây mà tôi có thể đặt lại mật khẩu bằng cách chỉnh sửa tập tin cấu hình để loại bỏ người dùng và mật khẩu trong phần gui, sau đó khởi động lại Syncthing).

Câu trả lời:


24

Bạn có thể (ab) sử dụng htpasswdtừ gói apache-utils , miễn là bạn có phiên bản 2.4 trở lên.

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

-blấy mật khẩu từ đối số lệnh thứ hai
-nin hàm băm thành thiết bị xuất chuẩn thay vì ghi nó vào tệp
-Bhướng dẫn sử dụng bcrypt
-C 10đặt chi phí bcrypt thành 10

Lệnh htpasswd trần xuất ra ở định dạng <name>: <hash> theo sau là hai dòng mới. Do đó, chuỗi trống cho tên và trtước dấu hai chấm và dòng mới.

Lệnh xuất ra bcrypt với $2y$tiền tố, có thể là vấn đề đối với một số mục đích sử dụng, nhưng có thể dễ dàng được sửa bởi một người khác sedvì biến thể OpenBSD sử dụng $2a$tương thích với biến thể crypt_blowfish cố định sử dụng $2y$.

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

Liên kết đến trang man htpasswd: https://httpd.apache.org/docs/2.4/programs/htpasswd.html
Chi tiết về các biến thể bcrypt: /programming//a/36225192/6732096


Phiên bản này có vấn đề với việc triển khai BCrypt của Java Spring Security. Mật khẩu để băm phải được chấm dứt bằng ký tự null. Spring Security dường như làm điều đó một cách chính xác. Tôi nghĩ htpasswd không làm điều này một cách chính xác.
k_o_

@k_o_: Bạn có thể nói cụ thể hơn về "có vấn đề" không? Tất cả các cài đặt bcrypt đều sử dụng bộ kết thúc ký tự null. Một số, như py-bcrypt thậm chí còn có các kiểm tra bổ sung để đảm bảo rằng ký tự null không phải là một phần của mật khẩu. Bạn có thể kiểm tra việc triển khai Apache trên GitHub . Tôi đang sử dụng htpasswd với sed bổ sung để điền vào các bản ghi cơ sở dữ liệu cho nhiều ứng dụng Spring mà không gặp vấn đề gì (đó thực sự là cách tôi đi đến câu trả lời).
Disassembler

Tôi đã giả sử rằng bỏ đi ký tự null là một vấn đề của htpasswd để giải thích các mã hóa khác nhau giữa Spring và htpasswd. Đầu ra từ bcrypt sử dụng phương pháp tiếp cận Python của câu trả lời khác đã tạo ra kết quả tương tự như trong Spring, nhưng htpasswd thì không. Có lẽ phiên bản htpasswd của tôi khá cũ, tôi nghĩ rằng bản nhị phân không được cập nhật kể từ 2 năm.
k_o_

11

Bạn có thể sử dụng thư viện Python. Trên hệ thống Fedora của tôi, tôi đã làm:

sudo dnf search bcrypt

(sudo chỉ để tránh lãng phí dung lượng cho bộ đệm dnf của người dùng) và từ kết quả có thể thấy có một gói Python2 và 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

Cài đặt phiên bản Python2 và liệt kê các tệp trong gói:

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

Điều này cho thấy có một tập tin /usr/lib64/python2.7/site-packages/bcrypt/__init__.pyđể tôi có thể lấy tài liệu với

pydoc bcrypt

Điều này cho tôi thấy đủ để viết lệnh sau đây sẽ băm chuỗi "password":

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

Đối với các phiên bản bcryptsử dụng sau này rounds=thay vì log_rounds=.


2
+1. FTR bạn không cần sudochạy dnf search, nó hoạt động tốt như một người dùng chuẩn.
Stephen Kitt

1
Kể từ tháng 4 năm 2018, tham số log_roundsdường như đã thay đổi để roundsthực hiện python -c 'import bcrypt; print(bcrypt.hashpw("password", bcrypt.gensalt(rounds=10)))'.
HorstKevin

4

Bổ sung cho @Disassemblercâu trả lời:

  • không nên chuyển mật khẩu từ dòng lệnh (vì mật khẩu có thể xem được ps)
  • 15 là một sự cân bằng tốt cho tốc độ tạo mật khẩu / phức tạp

Kịch bản gói cho 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 $?

1
Và trừ khi bạn bắt đầu dòng lệnh với một khoảng trắng, mật khẩu sẽ đi vào lịch sử shell của bạn (một tệp có thể không được mã hóa).
Gabriel Devillers

@GabrielDevillers yup, giống nhau ở đây. Tôi đã thêm "-i" vào OPTS và "" vào dòng thứ 2 đến cuối cùng.
Towi

đối với lịch sử BASH & myQuery cho rootngười dùng, bạn nên tạo một liên kết tượng trưng đến /dev/null.
Stuart Cardall

1
Về nhận xét của @ GabrielDevillers, có lẽ đáng nói đến việc thêm một khoảng trắng vào đầu không phải lúc nào cũng ẩn một mục khỏi lịch sử shell - phụ thuộc vào trình bao và cài đặt.
run rẩy
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.