คำนวณ bcrypt hash จากบรรทัดคำสั่ง


19

ฉันต้องการคำนวณbcrypt hash ของรหัสผ่านของฉัน

มีเครื่องมือบรรทัดคำสั่งโอเพนซอร์สที่จะทำเช่นนั้น?

ฉันจะใช้แฮชนี้ในไฟล์กำหนดค่า Syncthing (แม้ว่าฉันรู้จากที่นี่ว่าฉันสามารถรีเซ็ตรหัสผ่านโดยการแก้ไขไฟล์กำหนดค่าเพื่อลบผู้ใช้และรหัสผ่านในส่วน gui จากนั้นเริ่ม Syncthing ใหม่)

คำตอบ:


27

คุณสามารถใช้ (ab) htpasswdจากแพ็คเกจapache-utilsได้หากคุณมีเวอร์ชั่น 2.4 หรือสูงกว่า

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

-bใช้เวลารหัสผ่านจากการโต้แย้งคำสั่งที่สอง
-nพิมพ์กัญชาเพื่อ stdout แทนการเขียนไปยังแฟ้ม
-Bแนะใช้ bcrypt
-C 10ชุด bcrypt ค่าใช้จ่ายถึง 10

คำสั่ง bare htpasswd เอาต์พุตในรูปแบบ<name>: <hash>ตามด้วยบรรทัดใหม่สองบรรทัด ดังนั้นสตริงว่างสำหรับชื่อและtrการตัดเครื่องหมายโคลอนและการขึ้นบรรทัดใหม่

คำสั่งผล bcrypt กับ$2y$คำนำหน้าซึ่งอาจจะเป็นปัญหาสำหรับการใช้งานบางอย่าง แต่สามารถแก้ไขอีกsedตั้งแต่ตัวแปร OpenBSD ใช้$2a$เข้ากันได้กับตัวแปร crypt_blowfish $2y$คงใช้

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

ลิงก์ไปยังหน้า htpasswd man: https://httpd.apache.org/docs/2.4/programs/htpasswd.html
รายละเอียดเกี่ยวกับตัวแปร bcrypt: /programming//a/36225192/6732096


รุ่นนี้มีปัญหากับการใช้งาน BCrypt ของ Java Spring Security รหัสผ่านสำหรับแฮชต้องถูกยกเลิกด้วยอักขระ null ดูเหมือนว่า Spring Security จะทำอย่างถูกต้อง ฉันคิดว่า htpasswd ทำงานไม่ถูกต้อง
k_o_

@k_o_: คุณเจาะจงมากขึ้นเกี่ยวกับ "มีปัญหา" หรือไม่? การประยุกต์ใช้ bcrypt ทั้งหมดใช้เทอร์มินอลตัวละครแบบ null บางอย่างเช่น py-bcrypt มีการตรวจสอบเพิ่มเติมเพื่อให้แน่ใจว่าอักขระแบบ null ไม่ได้เป็นส่วนหนึ่งของรหัสผ่าน คุณสามารถตรวจสอบการดำเนินงาน Apache บน GitHub ฉันใช้ htpasswd กับ sed เพิ่มเติมเพื่อเติมเรคคอร์ดฐานข้อมูลสำหรับแอปพลิเคชั่น Spring หลาย ๆ ตัวโดยไม่มีปัญหา
ถอดแยกชิ้นส่วน

ฉันสันนิษฐานว่าการละทิ้งตัวละครแบบ null นั้นเป็นปัญหาของ htpasswd เพื่ออธิบายการเข้ารหัสที่แตกต่างกันระหว่าง Spring และ htpasswd เอาต์พุตจาก bcrypt โดยใช้วิธี Python ของคำตอบอื่น ๆ ให้ผลลัพธ์เหมือนกันใน Spring แต่ htpasswd ไม่ได้ บางทีรุ่น htpasswd ของฉันยังค่อนข้างเก่าฉันคิดว่าไบนารีไม่ได้รับการอัปเดตตั้งแต่ 2 ปี
k_o_

11

คุณสามารถใช้ไลบรารี Python ในระบบ Fedora ของฉันฉันทำ:

sudo dnf search bcrypt

(sudo เป็นเพียงเพื่อหลีกเลี่ยงการสูญเสียพื้นที่สำหรับแคชของผู้ใช้ dnf) และจากผลลัพธ์สามารถดูได้ว่ามีแพ็คเกจ Python2 และ 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

ติดตั้งเวอร์ชั่น Python2 และแสดงรายการไฟล์ในแพ็คเกจ:

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

นี่แสดงให้เห็นว่ามีไฟล์อยู่ด้วย/usr/lib64/python2.7/site-packages/bcrypt/__init__.pyดังนั้นฉันสามารถรับเอกสารได้

pydoc bcrypt

นี่แสดงให้ฉันมากพอที่จะเขียนคำสั่งต่อไปนี้ซึ่งจะแฮชสตริง"password":

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

สำหรับรุ่นที่ใหม่กว่าbcryptใช้แทนrounds=log_rounds=


2
+1 FTR ที่คุณไม่จำเป็นต้องsudoเรียกใช้dnf searchมันทำงานได้ดีในฐานะผู้ใช้มาตรฐาน
Stephen Kitt

1
ณ เมษายน 2018 พารามิเตอร์log_roundsดูเหมือนว่าจะมีการเปลี่ยนแปลงที่จะทำให้มันเป็นrounds python -c 'import bcrypt; print(bcrypt.hashpw("password", bcrypt.gensalt(rounds=10)))'
HorstKevin

4

@Disassemblerคำตอบเพิ่มเติมของ:

  • ไม่ใช่ความคิดที่ดีที่จะส่งรหัสผ่านจากบรรทัดคำสั่ง (เนื่องจากรหัสผ่านสามารถดูได้ps)
  • 15 เป็นความสมดุลที่ดีสำหรับความซับซ้อน / ความเร็วในการสร้างรหัสผ่าน

สคริปต์ตัวตัดสำหรับ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 $?

2
และถ้าคุณไม่เริ่มบรรทัดคำสั่งด้วยช่องว่างรหัสผ่านจะไปที่ประวัติเชลล์ของคุณ (ไฟล์ที่อาจไม่ได้เข้ารหัส)
Gabriel Devillers

@GabrielDevillers yup เหมือนกันที่นี่ ฉันเพิ่ม "-i" ลงใน OPTS และ "" ลงในบรรทัดที่ 2 ถึงสุดท้าย
towi

สำหรับการทุบตีและ mySQL ประวัติศาสตร์สำหรับผู้ใช้มันเป็นความคิดที่ดีที่จะสร้างการเชื่อมโยงสัญลักษณ์root /dev/null
Stuart Cardall

1
เกี่ยวกับความคิดเห็นของ @ GabrielDevillers อาจคุ้มค่าที่จะกล่าวถึงว่าการเพิ่มช่องว่างในจุดเริ่มต้นไม่ได้ซ่อนรายการจากประวัติเชลล์เสมอไป - ขึ้นอยู่กับเชลล์และการตั้งค่า
tremby
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.