2009-05-15 11 views
5

का उपयोग कर MySQL के पासवर्ड() एन्क्रिप्शन को सिमुलेट करना मैं एएसपी.NET/MS एसक्यूएल में एक पुराना एएसपी/माइस्क्ल वेबपैप अपडेट कर रहा हूं।.NET या MS SQL

हम नए ऐप में काम कर रहे पुराने वेबसाइट से लॉग इन रखना चाहते हैं।

दुर्भाग्य से पासवर्ड MySQL डीबी में MySQL के पासवर्ड() फ़ंक्शन का उपयोग करके संग्रहीत किए गए थे।

क्या MySQL के पासवर्ड() फ़ंक्शन को .NET या एमएस एसक्यूएल में अनुकरण करना संभव है?

किसी भी मदद/लिंक की सराहना की जाती है।

+1

क्या आप MySQL का उपयोग कर रहे हैं? ऐसा लगता है कि यह संभव होना चाहिए यदि आप जानते हैं कि आप किस संस्करण का उपयोग कर रहे हैं। MySQL पासवर्ड को एन्कोड करने के लिए डबल SHA1 हैश एल्गोरिदम का उपयोग करता है। –

+0

यह जांच करेगा जब मुझे mysql डीबी तक पहुंच प्राप्त हो जाएगी। पोस्ट समाधान के लिए धन्यवाद! –

उत्तर

12

MySQL दस्तावेज़ के अनुसार, एल्गोरिदम एक डबल SHA1 हैश है। MySQL स्रोत कोड की जांच करते समय, आपको libmysql/password.c में make_scrambled_password() नामक एक फ़ंक्शन मिलता है।

/* 
    MySQL 4.1.1 password hashing: SHA conversion (see RFC 2289, 3174) twice 
    applied to the password string, and then produced octet sequence is 
    converted to hex string. 
    The result of this function is used as return value from PASSWORD() and 
    is stored in the database. 
    SYNOPSIS 
    make_scrambled_password() 
    buf  OUT buffer of size 2*SHA1_HASH_SIZE + 2 to store hex string 
    password IN NULL-terminated password string 
*/ 

void 
make_scrambled_password(char *to, const char *password) 
{ 
    SHA1_CONTEXT sha1_context; 
    uint8 hash_stage2[SHA1_HASH_SIZE]; 

    mysql_sha1_reset(&sha1_context); 
    /* stage 1: hash password */ 
    mysql_sha1_input(&sha1_context, (uint8 *) password, (uint) strlen(password)); 
    mysql_sha1_result(&sha1_context, (uint8 *) to); 
    /* stage 2: hash stage1 output */ 
    mysql_sha1_reset(&sha1_context); 
    mysql_sha1_input(&sha1_context, (uint8 *) to, SHA1_HASH_SIZE); 
    /* separate buffer is used to pass 'to' in octet2hex */ 
    mysql_sha1_result(&sha1_context, hash_stage2); 
    /* convert hash_stage2 to hex string */ 
    *to++= PVERSION41_CHAR; 
    octet2hex(to, (const char*) hash_stage2, SHA1_HASH_SIZE); 
} 

इस विधि को देखते हुए, आप एक .NET समकक्ष है कि मूल रूप से एक ही बात करता है बना सकते हैं: समारोह के रूप में निम्नानुसार परिभाषित किया गया है। यहां मैं क्या आया हूं। जब मैं चयन पासवर्ड ('परीक्षण') चलाता हूं; MySQL के अपने स्थानीय प्रतिलिपि के खिलाफ, दिए गए मान है:

*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29

स्रोत कोड (password.c में फिर से) के मुताबिक, शुरुआत तारांकन इंगित करता है कि इस एन्क्रिप्ट करने के बाद MySQL 4.1 विधि है पारण शब्द। जब मैं वीबी में कार्यक्षमता अनुकरण करता हूं।

Public Function GenerateMySQLHash(ByVal strKey As String) As String 
    Dim keyArray As Byte() = Encoding.UTF8.GetBytes(strKey) 
    Dim enc = New SHA1Managed() 
    Dim encodedKey = enc.ComputeHash(enc.ComputeHash(keyArray)) 
    Dim myBuilder As New StringBuilder(encodedKey.Length) 

    For Each b As Byte In encodedKey 
     myBuilder.Append(b.ToString("X2")) 
    Next 

    Return "*" & myBuilder.ToString() 
End Function 

ध्यान रखें कि SHA1Managed रखें() System.Security.Cryptography नाम स्थान में है: नेट उदाहरण के लिए, यह है कि क्या मैं के साथ आ रहा है। यह विधि MySQL में PASSWORD() कॉल के समान आउटपुट देता है। मुझे उम्मीद है कि यह आपके लिए मदद करता है।

संपादित करें: यहाँ सी #

public string GenerateMySQLHash(string key) 
{ 
    byte[] keyArray = Encoding.UTF8.GetBytes(key); 
    SHA1Managed enc = new SHA1Managed(); 
    byte[] encodedKey = enc.ComputeHash(enc.ComputeHash(keyArray)); 
    StringBuilder myBuilder = new StringBuilder(encodedKey.Length); 

    foreach (byte b in encodedKey) 
     myBuilder.Append(b.ToString("X2")); 

    return "*" + myBuilder.ToString(); 
} 
+0

बहुत बढ़िया, धन्यवाद! कोशिश करेगा अगर यह mysql के मेरे संस्करण के लिए काम करता है (इस समय इसे जांच नहीं सकता है) और आपको बताएगा। अनुसंधान और महान समाधान के लिए बहुत धन्यवाद। –

+0

यदि आप 4.1.1 के पिछले संस्करण का उपयोग कर रहे हैं, तो एन्क्रिप्शन के लिए एक पुरानी विधि है। मैं भी उस विधि को लिखने में आपकी सहायता कर सकता हूं। मुझे बताएं और मुझे सहायता करने में खुशी होगी। सौभाग्य! –

+0

मुझे वास्तव में टी-एसक्यूएल के साथ ऐसा करने का एक तरीका मिला। यह बहुत बदसूरत दिख रहा है, लेकिन यह काम करता है! चुनें '*' + सबस्ट्रिंग (master.dbo.fn_varbintohexstr (हैशबेट्स ('SHA1', हैशबेट्स ('SHA1', 'VALUE-TO-ENCRYPT-GOES-HERE')), 1,42) –

1

आप .NET में MD5 या SHA1 का उपयोग करके तारों को एन्क्रिप्ट कर सकते हैं, लेकिन MySQL द्वारा उपयोग किए गए वास्तविक एल्गोरिदम शायद इन दो तरीकों से अलग है। मुझे संदेह है कि यह सर्वर के उदाहरण के आधार पर किसी प्रकार के 'नमक' पर आधारित है, लेकिन मुझे नहीं पता।

सिद्धांत रूप में, मेरा मानना ​​है कि मेरा मानना ​​है कि MySQL खुला स्रोत है, आप स्रोत की जांच कर सकते हैं और यह निर्धारित कर सकते हैं कि यह कैसे किया जाता है।

http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html#function_password

संपादित करें 1: मेरा मानना ​​है कि इस्तेमाल किया एल्गोरिथ्म अन्य 'तोड़ मरोड़' (this ब्लॉग पोस्ट के अनुसार) के साथ एक डबल SHA1 है।

+0

मुझे पता है, मुझे पता है ... उस जानकारी को भी शोध करने में सक्षम था लेकिन यह वास्तव में मेरे प्रश्न का उत्तर नहीं देता :-) वैसे भी धन्यवाद। –

+0

मैंने स्रोत को देखा, और मुझे लगता है कि यह SHA1 पर आधारित है, लेकिन विभिन्न नमक और यादृच्छिकरण प्रौद्योगिकियों के साथ। मुझे बहुत मददगार नहीं है, इसलिए मुझे लगता है कि उत्तर कहीं और देखना है :( – samjudson

+0

धन्यवाद। स्रोत की जांच के लिए +1 :-) –

-3

आप MySQL पासवर्ड() फ़ंक्शन को अनुकरण करने में सक्षम नहीं होंगे। कम से कम काम और भाग्य के बिना नहीं। चूंकि MySQL अपने स्वयं के एल्गोरिदम का उपयोग एक तरफा एन्क्रिप्टेड तारों में करता है, वे यह नहीं बताएंगे कि वे किस एल्गोरिदम का उपयोग करते हैं; जिसका मतलब है कि आप, परीक्षण और त्रुटि करना जिसके परिणामस्वरूप तार की तुलना, आदि

आपकी समस्या का समाधान करने के लिए करना होगा:

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

मुझे पता है कि यह दर्द की तरह लगता है, लेकिन यह सबसे अच्छा है कि आप MySQL एन्क्रिप्शन एल्गोरिदम को समझने में अपना रास्ता हैक करने की कोशिश करने से कम कर सकते हैं।

शुभकामनाएं!

+0

जानकारी के लिए धन्यवाद।मैं आंशिक रूप से आपके समाधान का उपयोग करूंगा: पहला चरण, उपयोगकर्ताओं को एमएस एसक्यूएल में आयात करें और "HasMysqlPassword" बिट को "1" पर सेट करें। दूसरा चरण, लॉगिन पर मैं एमएस एसक्यूएल उपयोगकर्ता विवरण पुनर्प्राप्त करता हूं और जांचता हूं कि HasMysqlPassword = 1 है या नहीं। यदि ऐसा नहीं है, तो मैं एमएस एसक्यूएल में "पासवर्ड" फ़ील्ड की जांच करता हूं। यदि ऐसा है, तो मैं mysql में पासवर्ड जांचूंगा। यदि यह मेल खाता है, तो मैं SHA1 का उपयोग करके दर्ज पासवर्ड को एन्क्रिप्ट करता हूं, इसे MSMysqlPassword को 0 पर सेट करते समय एमएस एसक्यूएल में संग्रहीत करता हूं। थोड़ी देर के बाद मुझे mysql डेटाबेस को अलग करने में सक्षम होना चाहिए और शेष उपयोगकर्ताओं को सूचित करना चाहिए कि उनका नया पासवर्ड * स्वत: उत्पन्न * –

+0

क्या है उस दृष्टिकोण के बारे में अच्छा यह है कि उपयोगकर्ता एक चीज़ नहीं देखेगा। –

+0

यह गलत है। मैंने .NET में मान्य पासवर्ड हैश में कनवर्ट करने के लिए एक विधि लिखी है ... –

0

में एक ही कोड वीबी नेट के लिए, 0 के साथ इस पैड है छोड़ दिया है ताकि जब हेक्स कोड [उदाहरण के लिए] 'ई' है, इस समारोह सही ढंग से जोड़ देंगे, परिणाम स्ट्रिंग के लिए '0E'। ताकि सहित अंत, में पूर्व pended '*' जिसके परिणामस्वरूप स्ट्रिंग 41 वर्ण लंबा हो जाएगा, के रूप में MySQL में आवश्यक है

Public Function GenerateMySQLHash(ByVal strKey As String) As String 

    Dim keyArray As Byte() = System.Text.UTF8Encoding.UTF8.GetBytes(strKey) 
    Dim enc = New Security.Cryptography.SHA1Managed() 
    Dim encodedKey = enc.ComputeHash(enc.ComputeHash(keyArray)) 
    Dim myBuilder As New System.Text.StringBuilder(encodedKey.ToString.Length) 

    For Each b As Byte In encodedKey 
     myBuilder.Append(Strings.Right("0" & b.ToString("X"), 2)) 
    Next 

    Return "*" & myBuilder.ToString() 
End Function 
1

"वे खुलासा करने के लिए क्या एल्गोरिथ्म वे का उपयोग नहीं जा रहे हैं"

ईआरएम ... किसी जगा और आपको बता दूँ कि MySQL खुली स्रोत है ... वे न क्योंकि हर डेटाबेस की बहुत संरचना पढ़ सकते हैं कुछ "खुलासा" करना होगा - बस सूत्रों डाउनलोड, एन्क्रिप्शन-फ़ंक्शंस की खोज करें (मुझे लगता है कि वे सी ++ का उपयोग कर रहे हैं) और शुरुआत शुरू करें stigating ... SHA1 अब बहुत असुरक्षित प्रतीत होता है - हाल ही में कुछ वैज्ञानिकों ने साबित कर दिया है कि बिना किसी सीमा के 20% का चयन करना संभव है और उसी हैश का उत्पादन करना है ताकि किसी को एईएस का उपयोग करने की सलाह दी जाएगी या SHA2 (इसलिए नहीं MySQL- पासवर्ड -func)

0

mysql पासवर्ड कार्यों विशेष रूप से सुरक्षित नहीं है केवल कारणों (जैसे कोई नमक या मिलान हैश की तलाश के खिलाफ सुरक्षा की अन्य विधि नहीं है) मैं देख सकता हूँ एल्गोरिदम को डुप्लिकेट करना चाहते हैं 1: आपके पास mysql पासवर्ड() sवाले उपयोगकर्ताओं की एक सूची/तालिका है 0 2: आप उपयोगकर्ता तालिका में हैंश से mysql पासवर्ड क्रैक करना चाहते हैं।

अन्य कुछ अलग उपयोग करें, उदाहरण के लिए एक हैश जो उपयोगकर्ता के नाम (और/या कुछ अन्य पंक्ति invariant) और उनके पासवर्ड दोनों को जोड़ती है। अगर दो उपयोगकर्ता एक ही पासवर्ड चुनते हैं तो यह स्पष्ट नहीं होगा। और यदि तालिका का खुलासा हो जाता है तो सुरक्षा उसी दर पर कम नहीं होती है (उदाहरण के लिए 446a12100c856ce9 के लिए Google जो एक बहुत लोकप्रिय पासवर्ड का पासवर्ड() हैश है)

1

सी # संस्करण पैडिंग समस्या को सही करने के लिए संशोधित किया गया है।
[टेस्ट] सार्वजनिक शून्य जेनरेट MySQLHashX2() { स्ट्रिंग पासवर्ड = "20iva05";

 byte[] keyArray = Encoding.UTF8.GetBytes(password); 
     SHA1Managed enc = new SHA1Managed(); 
     byte[] encodedKey = enc.ComputeHash(enc.ComputeHash(keyArray)); 
     StringBuilder myBuilder = new StringBuilder(encodedKey.Length); 

     foreach (byte b in encodedKey) 
     { 
      log.Debug(b.ToString() + " -> " + b.ToString("X2")); 
      myBuilder.Append(b.ToString("X2")); 
     } 

     Assert.AreEqual("*8C2029A96507478FD1720F6B713ADD57C66EED49", "*" + myBuilder.ToString()); 
    } 
संबंधित मुद्दे