कमांड लाइन से bcrypt हैश की गणना करें


20

मैं अपने पासवर्ड के bcrypt हैश की गणना करना चाहूंगा

क्या कोई ओपन सोर्स कमांड लाइन टूल है जो ऐसा करेगा?

मैं इस हैश को सिंथक्टिंग कॉन्फ़िगरेशन फ़ाइल में उपयोग करूंगा (भले ही मुझे यहां से पता हो कि मैं उपयोगकर्ता और पासवर्ड को हटाने के लिए कॉन्फ़िगर कर सकता हूं।

जवाबों:


28

आप Apache-utils के पैकेज htpasswdसे (ab) उपयोग कर सकते हैं , बशर्ते आपके पास संस्करण 2.4 या उच्चतर हो।

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

-bदूसरे कमांड तर्क से पासवर्ड लेता है
-n, हैश को
-Bस्टडआउट करने के बजाय इसे एक फाइल पर लिखने के लिए प्रिंट
-C 10करता है bcrypt का उपयोग करने का निर्देश देता है bcrypt लागत को 10 पर सेट करता है

नंगे htpasswd कमांड फॉर्मेट में <name>: <हैश> दो न्यूलाइन्स के बाद आउटपुट देता है। इसलिए trबृहदान्त्र और newlines नाम के लिए खाली स्ट्रिंग और।

कमांड प्रीफ़िक्स के साथ bcrypt को आउटपुट करता है $2y$, जो कुछ उपयोगों के लिए समस्या हो सकती है, लेकिन आसानी से दूसरे द्वारा तय किया जा सकता है sedक्योंकि OpenBSD वेरिएंट का उपयोग करके $2a$फिक्स्ड crypt_blowfish वेरिएंट के साथ संगत है $2y$

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

Htpasswd मैन पेज से लिंक करें: https://httpd.apache.org/docs/2.4/programs/htpasswd.html
bcrypt वेरिएंट के बारे में विवरण: /programming//a/36225192-673209696


इस संस्करण में जावा स्प्रिंग सिक्योरिटी के बीसीक्रिप्ट कार्यान्वयन के साथ एक समस्या है। हैश का पासवर्ड एक अशक्त चरित्र के साथ समाप्त किया जाना चाहिए। स्प्रिंग सिक्योरिटी इसे सही ढंग से करने लगती है। मुझे लगता है कि htpasswd यह सही ढंग से नहीं कर रहा है।
k_o_

@k_o_: क्या आप "समस्या है" पर अधिक विशिष्ट हो सकते हैं? सभी bcrypt कार्यान्वयन नल-वर्ण टर्मिनेटर का उपयोग करते हैं। कुछ, जैसे कि py-bcrypt ने यह सुनिश्चित करने के लिए अतिरिक्त जांच की है कि null-character पासवर्ड का हिस्सा नहीं है। आप गिटहब पर अपाचे कार्यान्वयन की जांच कर सकते हैं । मैं समस्याओं के बिना कई स्प्रिंग अनुप्रयोगों के लिए डेटाबेस रिकॉर्ड को पॉप करने के लिए अतिरिक्त सेड के साथ htpasswd का उपयोग कर रहा हूं (यह वास्तव में मैं कैसे जवाब के लिए आता हूं)।
डिस्सेम्बलर

मैं मान रहा था कि अशक्त चरित्र को छोड़ना वसंत और htpass के बीच अलग-अलग एन्कोडिंग की व्याख्या करने के लिए htpasswd की समस्या थी। अन्य उत्तर के पायथन दृष्टिकोण का उपयोग करके bcrypt से आउटपुट स्प्रिंग की तरह ही परिणाम उत्पन्न कर रहा था, लेकिन htpasswd नहीं था। शायद मेरा htpasswd संस्करण भी काफी पुराना है, मुझे लगता है कि बाइनरी 2 साल से अपडेट नहीं हुई थी।
k_o_

11

आप पायथन लाइब्रेरी का उपयोग कर सकते हैं। अपने फेडोरा सिस्टम पर मैंने किया:

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, यह एक मानक उपयोगकर्ता के रूप में ठीक काम करता है।
स्टीफन किट

1
अप्रैल 2018 तक पैरामीटर इसे बनाने के log_roundsलिए बदल गया roundsहै python -c 'import bcrypt; print(bcrypt.hashpw("password", bcrypt.gensalt(rounds=10)))'
होर्स्टविन

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
और जब तक आप एक स्थान के साथ कमांड लाइन शुरू नहीं करते हैं, तब तक पासवर्ड आपके शेल इतिहास (एक फ़ाइल जो संभवतः एन्क्रिप्ट नहीं किया गया है) पर जाएगा।
गेब्रियल डेविलर्स

@ गैब्रिएलडेविलर्स यूप, यहीं। मैंने "-i" को OPTS और "" को दूसरी-टू-लास्ट लाइन में जोड़ा।
तोवी

उपयोगकर्ता के लिए BASH और mySQL इतिहास के लिए rootएक प्रतीकात्मक लिंक बनाना एक अच्छा विचार है /dev/null
स्टुअर्ट कार्डाल

1
@ GabrielDevillers की टिप्पणी के बारे में, शायद यह ध्यान देने योग्य है कि प्रारंभ में एक स्थान जोड़ना हमेशा शेल इतिहास से एक आइटम को छिपाता नहीं है - शेल और सेटिंग्स पर निर्भर करता है।
कांप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.