पासवर्ड उसी तरह एन्क्रिप्ट करें जिस तरह से mysql करता है


16

मैंने एक उपयोगकर्ता बनाया है ... लेकिन पासवर्ड भूल गया

mysql> उपयोगकर्ता 'blayo' @ '%' को 'सही' द्वारा पहचाना;

कौन सा लिनक्स कमांड लाइन टूल पासवर्ड को उसी तरह एन्क्रिप्ट कर सकता है जिस तरह mysql 5.5 करता है?

mysql> select पासवर्ड, mysql.user से उपयोगकर्ता
------------------------------------------ + ------- +
* 920018161824B14A1067A69626595E68CB8284CB | ब्लेयो |

... यह सुनिश्चित करने के लिए कि मैं सही का उपयोग करता हूं

$ उपकरण सही
* 920018161824B14A1067A69626595E68CB8284CB

2
आप केवल व्यवस्थापक के रूप में लॉग इन क्यों नहीं कर सकते और इसके लिए एक नया पासवर्ड क्यों निर्धारित कर सकते हैं blayo? यह सही चरित्र खोजने के लिए संभव चरित्र संयोजनों के खरबों से चलने की तुलना में निश्चित रूप से तेज़ है।
nohillside

कृपया एकाधिक स्टैक एक्सचेंज साइटों पर एक ही प्रश्न पोस्ट न करें । डीबीए संस्करण को भी उत्तर दिया गया है, जो प्रयास की बर्बादी है।
गिल्स एसओ- बुराई को रोकना '

जवाबों:


13

अच्छी तरह से, तुच्छ (शायद धोखा देने वाला ) तरीका होगा:

mysql -NBe "select password('right')"

यह एक पासवर्ड का उपयोग करेगा जो भी पासवर्ड हैशिंग योजना का उपयोग करता है जो आपके संस्करण mysql का उपयोग करता है। [ संपादित करें : जोड़ा गया -NB, जो कॉलम नाम और अस्की टेबल आर्ट से छुटकारा दिलाता है।]


6
और, हाथ से, यह आपके चमकदार नए पासवर्ड को आपके MySQL लॉग और आपके बैश अकाउंट हिस्ट्री लॉग में स्पष्ट पाठ में संग्रहीत करेगा।
क्रेग

@ क्रैग को रोकने के लिए आप mysqlबैश इतिहास से इसे छिपाने के लिए सही से पहले '' (स्पेस) प्रीपेंड कर सकते हैं और इसे माईएसक्यूएल लॉग से छिपाने SET sql_log_off=ON;के SELECT ...लिए सही इस्तेमाल कर सकते हैं ।
मुरली

1
@ अपडेट के लिए हमारा धन्यवाद! बेशक, यह पासवर्ड लॉगिंग नहीं करने के लिए डिफ़ॉल्ट होना चाहिए। सुरक्षा हमेशा डिफ़ॉल्ट सेटिंग होनी चाहिए।
क्रेग

@ क्रेग निष्पक्ष होने के लिए, यह पहले से ही mysql (v5.7 द्वारा किया जाता है, अंतिम संस्करण जो इस फ़ंक्शन में मौजूद है, v8.0.11 के साथ हटा दिया गया है ): 1. क्लाइंटसाइड (प्रभावित .mysql_history) सभी कथानक मिलान की अनदेखी *PASSWORD*और 2. सर्वर के लिए कई stmts (को छोड़कर SELECT)। देखें: MySQL 5.7 नियमावली - पासवर्ड और लॉगिंग और MySQL 5.7 - मैनुअल - mysql क्लाइंट लॉगिंग
14१

यह अच्छी प्रतिक्रिया है! दुर्भाग्य से, अभी भी काफी लोग ऐसे हैं जो विभिन्न कारणों से (स्वयं शामिल हैं) अभी भी 5.7 से अधिक पुराने mysql संस्करणों का उपयोग करके अटके हुए हैं।
क्रेग

12

कुछ एक-लाइनर:

MySQL (आपको ऐड-यू (उपयोगकर्ता) -p की आवश्यकता हो सकती है):

mysql -NBe "select password('right')"

अजगर :

python -c 'from hashlib import sha1; print "*" + sha1(sha1("right").digest()).hexdigest().upper()'

पर्ल :

perl -MDigest::SHA1=sha1_hex -MDigest::SHA1=sha1 -le 'print "*". uc sha1_hex(sha1("right"))'

PHP :

php -r 'echo "*" . strtoupper(sha1(sha1("right", TRUE))). "\n";'

रूबी :

ruby -e 'require "digest/sha1"; puts "*" + Digest::SHA1.hexdigest(Digest::SHA1.digest("right")).upcase'

सभी आउटपुट:

* 920018161824B14A1067A69626595E68CB8284CB


धन्यवाद, मैंने आपके जवाब को serverfault.com/a/846281/236916
mwfearnley

@alexjhart क्या मुझे नए mysql 5.7.8 पासवर्ड हैशिंग एल्गोरिथ्म :) के लिए अपडेट मिल सकता है? (शायद थोड़ा विस्तार से कि आपको यह कैसे पता चला?)
थोरसुमोनर

6

यह अभी भी मेरे दिमाग को मारता है कि MySQL कमांड लाइन और लॉग्स में पासवर्ड को बाधित करने से परेशान नहीं करता है। और यह एकमात्र कारण है कि मैं केवल @Gilles उत्तर पर टिप्पणी करने के बजाय एक उत्तर जोड़ रहा हूं।

तो, ज़ाहिर है, आप बस MySQL में एक व्यवस्थापक के रूप में लॉग इन कर सकते हैं और अपने ब्लेयो उपयोगकर्ता के लिए एक नया पासवर्ड सेट कर सकते हैं, जैसा कि @patrix ने सुझाव दिया है।

हालाँकि, ऐसा करने का मानक तरीका MySQL के पासवर्ड () फ़ंक्शन का उपयोग करके है, जो एक प्लेटेक्स्ट पासवर्ड को एक तर्क (गंभीरता से?) के रूप में लेता है।

यदि आप ऐसा करते हैं, तो आप अपने MySQL उपयोगकर्ता के पासवर्ड को अपने बैश इतिहास में और आपके MySQL लॉग में बैठे रहने के लिए छोड़ देते हैं, जो बाद में उन लॉग फ़ाइलों तक पहुँच प्राप्त करने का प्रबंधन करता है।

क्या यह बेहतर नहीं होगा कि थोड़ी उपयोगिता हो, जो पासवर्ड के लिए संकेत दे, उसे स्क्रीन पर या आपके लॉग में जाने के बिना, फिर आपको परिणामी MySQL- संगत हैश प्रदान करे?

तो, @ गिल्स के उत्तर को थोड़ा संशोधित करते हुए, कैसे थोड़ा शेल स्क्रिप्ट के बारे में जो पायथन का उपयोग करता है, निम्न की तरह। आप एक बार में पासवर्ड सेट करने के लिए अपने MySQL डेटाबेस के खिलाफ SQL स्टेटमेंट चलाने के लिए इसे आसानी से संशोधित कर सकते हैं। लेकिन यहां तक ​​कि बिना जाने, बस यूज़र्स टेबल को अपडेट करने के लिए परिणामस्वरूप हैश को SQL स्टेटमेंट में कॉपी और पेस्ट करें:

#!/bin/bash

mysqlpwd=$(/usr/bin/python -c 'from hashlib import sha1; import getpass; print "*" + sha1(sha1(getpass.getpass("New MySQL Password:")).digest()).hexdigest()')

echo $mysqlpwd

@HalosGhost; संपादन किस बारे में था? यह कुछ भी नहीं बदला? ;-)
क्रेग

यह सिंटैक्स हाइलाइटिंग को लागू करता है (जैसा कि संपादन सारांश में नोट किया गया है) और संपादन के वास्तविक पाठ द्वारा स्पष्ट किया गया है।
हेलोजगॉस्ट

3
आह इतना। ईमानदारी से एहसास नहीं हुआ कि आपने क्या किया है (आपने स्पष्ट रूप से <!-- language: lang-bsh -->लाइन जोड़ी है )। हैंडी! मुझें यह पसंद है। धन्यवाद!
क्रेग

5

शेल का उपयोग करते हुए एक और:

echo -n 'right' | sha1sum | xxd -r -p |\
sha1sum | tr '[a-z]' '[A-Z]' | awk '{printf "*%s", $1}'

स्पष्टीकरण:

  1. echo -n बिना लाइनब्रेक के प्रिंट करें
  2. sha1sum पहला SHA1
  3. xxd -r -p हैश को नंगा करें
  4. sha1sum दूसरा SHA1
  5. tr '[a-z]' '[A-Z]' अपरकेस में परिवर्तित करें
  6. awk '{print "*" $1}' प्रमुख जोड़ें *

अधिक जानकारी:

2. और 3. के बीच एक वैकल्पिक awk '{printf "%s", $1}'कदम newline- और हाइफ़न हटाने के लिए डाला जा सकता है। लेकिन xxd उन्हें वैसे भी अनदेखा करेगा (धन्यवाद dave_thompson_085 के लिए)।

इसके अलावा चरण 5 और 6 को एक बार में उनके साथ प्रतिस्थापित किया जा सकता है {print "*" toupper($1)}(धन्यवाद dave_thompson_085)।


1
awkअपरकेस कर सकते हैं, और एक अधूरी (अंतिम) टर्मिनल के लिए लाइन outputting incovenient है: .. | sha1sum | awk '{print "*" toupper($1)}'। और आपको NL और यहां तक ​​कि हाइफ़न के बारे में चिंता करने की ज़रूरत नहीं है xxd -r -p, उन्हें अनदेखा किया जाता है।
dave_thompson_085

4

हैश sha1 (sha1 (पासवर्ड)) है । चूंकि नमक नहीं है (जो गंभीर सुरक्षा दोष है), आप एक तालिका में हैश देख सकते हैं

sha1sumGNU कोरुटिल्स या बिजीबॉक्स से सिर्फ POSIX टूल्स प्लस के साथ , sha1 (sha1 (पासवर्ड)) गणना करने के लिए कष्टप्रद है क्योंकि sha1sumकमांड हेक्साडेसिमल में डाइजेस्ट को प्रिंट करता है और बाइनरी में बदलने के लिए कोई मानक टूल नहीं है।

awk "$(printf %s 'right' | sha1sum |
       sed -e 's/ .*//' -e 's/../, 0x&/g' \
           -e 's/^/BEGIN {printf "%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c"/' \
           -e 's/$/; exit}/')" | sha1sum

पाइथन के मानक पुस्तकालयों में मानक खुदाई होती है, इसलिए यह एक साधारण वन-लाइनर है।

printf %s 'right' |
python -c 'from hashlib import sha1; import sys; print sha1(sha1(sys.stdin.read()).digest()).hexdigest()'

या वन-लाइनर के अंदर पासवर्ड के साथ:

python -c 'from hashlib import sha1; print sha1(sha1("right").digest()).hexdigest()'

मुझे यह जवाब आत्मा में पसंद है, लेकिन यह काफी काम नहीं कर रहा है। जब मैं एंटर कुंजी दबाता हूं, तब भी यह आगे बढ़ने के बजाय रीडिंग इनपुट रखना चाहता है। इसके अलावा, इनपुट स्क्रीन पर वापस आ जाता है, जो वांछनीय नहीं हो सकता है। हालांकि इस तरह से कुछ के बारे में कैसे? unix.stackexchange.com/a/155583/37401
क्रेग

@ क्रैग कैसे पढ़ें इंटरएक्टिव इनपुट प्रश्न के दायरे से परे है। मुझे लगता है कि स्क्रिप्ट में पहले से ही पासवर्ड है; आमतौर पर यह एक फ़ाइल में संग्रहीत होता है, यह एक डेटाबेस पासवर्ड को अंतःक्रियात्मक रूप से टाइप करने के लिए दुर्लभ है। यदि आप इंटरैक्टिव इनपुट पढ़ना चाहते हैं, तो आप readएक लाइन पढ़ने के लिए शेल बिलिन का उपयोग कर सकते हैं ; stty echoयदि आप प्रतिध्वनि बंद करना चाहते हैं और ssty +echoइसे वापस चालू करना चाहते हैं, तो पहले दौड़ें । पायथन में, आप getpassमॉड्यूल का उपयोग कर सकते हैं ।
गिल्स एसओ- बुराई को रोकें

बेनाम: हाँ, मुझे पता है ... और काफी उचित! मुझे बस सड़क के नीचे जाने वाली भयानक सुरक्षा से नफरत है, और MySQL सुरक्षा सामान्य रूप से बहुत भयानक है, इसलिए मेरे पास यह घुटने की झटका प्रवृत्ति है, जहां भी मुझे मौका मिलता है, थोड़ी सुरक्षा अंतर्दृष्टि को इंजेक्ट करना चाहता हूं। ;-)
क्रेग

1

यदि आपने एक उपयोगकर्ता को क्रेट किया है और पासवर्ड भूल गए हैं तो यह वही है जो आपको करना चाहिए और यह आसान है।

यह भी मेरे साथ एक दर्जन बार हुआ जबकि मैं एक बार में 10 बिलियन काम कर रहा था। मेरा पासवर्ड पुनर्प्राप्त करने का सबसे अच्छा तरीका था:

mysql सर्वर को पहले पूरी तरह से बंद कर दिया

जारी किए गए mysqld_safe --skip- अनुदान तालिकाएँ और

फिर मैंने पासवर्ड जारी किए बिना रूट के रूप में लॉग इन किया, बस mysql -u mysql-user (यह mysqld_safe के बाद आपको देता है)

इसके बाद mysql> यूजर टेबल पर जाएं और यूजर के लिए पासवर्ड अपडेट करें

फिर वापस जाओ और mysql को पुनरारंभ करें

देखें कि क्या काम करता है और हमें बताएं।


यह लगता है जैसे कि यह मामले के लिए अधिक हो सकता है कि आप लॉग इन नहीं कर सकते सब पर है, न कि सिर्फ एक विशिष्ट उपयोगकर्ता के रूप में की तुलना में।
mwfearnley

1

एक और खोल का उपयोग कर

echo -n 'right' | openssl sha1 -binary | openssl sha1 -hex | \
    awk '{print "*"toupper($0)}'

... जो आउटपुट:

*920018161824B14A1067A69626595E68CB8284CB

0

MySQL 4.1+ डबल SHA1 का उपयोग करता है

> SELECT PASSWORD("right")
*920018161824B14A1067A69626595E68CB8284CB

> SELECT SHA1(UNHEX(SHA1("right")))
920018161824B14A1067A69626595E68CB8284CB

sh-3.2# php -r 'echo "*" . sha1(sha1("right", TRUE)). "\n";'
*920018161824b14a1067a69626595e68cb8284cb

इस एल्गोरिथ्म को आसानी से अन्य भाषाओं में पोर्ट किया जा सकता है। एक अंतर यह है कि "चुनिंदा पासवर्ड" में पासवर्ड हैश हमेशा "*" वर्ण से शुरू होता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.