2012-11-23 13 views
34

.NET 4.5 में अपग्रेड करने के बाद, अब मुझे चेतावनी मिल रही है कि "System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile अप्रचलित है" और सुझाव इसके बजाय सदस्यता API का उपयोग करना है।फॉर्म्स प्रमाणीकरण के लिए प्रतिस्थापन में ड्रॉप। हैशपैसवर्डफोरस्टोरिंग कॉन्फ़िगरफाइल?

यह सभी नई परियोजनाओं के लिए बहुत अच्छा और अच्छा है, लेकिन इस स्तर पर (उपयोगकर्ता डेटा और मौजूदा पासवर्ड मौजूद हैं) के साथ, मैं कस्टम सदस्यता प्रदाता को हैशिंग के संभावित तरीकों से बहुत अच्छी तरह से बदल नहीं सकता।

इस तरह के मुद्दों के लिए अनुशंसित तरीका क्या है? "अप्रचलित" कॉल का उपयोग करना जारी रखना स्पष्ट रूप से सुझाया गया पथ नहीं है, इसलिए इसे "सदस्यता एपीआई का उपयोग करने" के अलावा किसी अन्य चीज़ द्वारा प्रतिस्थापित किया गया है?

+0

HashPasswordForStoringInConfigFile पुराना है, का उपयोग क्यों नहीं कर सकते हैं और किसी के लिए एक स्थानापन्न विकल्प तो सुझाव देने के लिए वे जानना चाहते हैं 2 पैरामीटर यह "MD5" या "SHA1" है? हां, मुझे पता है कि यह पोस्ट ओल्ड है लेकिन मैं इसे भर में ठोकर खाई क्योंकि मैंने कई वर्षों में 'हैशपास्वर्डफॉरस्टोरिंग कॉन्फिफफाइल' का उपयोग नहीं किया था। नमक + पासवर्ड के लिए SHA1 प्रतिस्थापन ठीक हैं - लेकिन 2016 में इस बिंदु पर SHA1 के साथ रहना सिर्फ एक बुरा विचार है भयानक MD5 –

उत्तर

43

यह SHA1 संस्करण के लिए एक समाधान है।

 public static string GetSwcSHA1(string value) 
    { 
     SHA1 algorithm = SHA1.Create(); 
     byte[] data = algorithm.ComputeHash(Encoding.UTF8.GetBytes(value)); 
     string sh1 = ""; 
     for (int i = 0; i < data.Length; i++) 
     { 
      sh1 += data[i].ToString("x2").ToUpperInvariant(); 
     } 
     return sh1; 
    } 

MD5 के लिए आप केवल करने के लिए एल्गोरिथ्म को बदलने की जरूरत:

MD5 algorithm = MD5.Create(); 

आशा है कि आप कोई आपत्ति नहीं है, बस ऊपर अपने कोड की एक VB.NET संस्करण जोड़ने जा रहा:

Public Shared Function CreateHash(saltAndPassword) As String 
     Dim Algorithm As SHA1 = SHA1.Create() 
     Dim Data As Byte() = Algorithm.ComputeHash(Encoding.UTF8.GetBytes(saltAndPassword)) 
     Dim Hashed As String = "" 

     For i As Integer = 0 To Data.Length - 1 
      Hashed &= Data(i).ToString("x2").ToUpperInvariant() 
     Next 

     Return Hashed 
    End Function 
+0

बहुत उपयोगी, धन्यवाद! क्या यह ठीक होगा अगर मैंने आपके वीबी.Net को फ़ंक्शन घोषणा शामिल करने के लिए अपडेट किया है और इसी तरह? –

+0

GetSwcSH1 में Swc का क्या अर्थ है? – Wes

2

रिचर्ड के उत्तर ने मेरे लिए बहुत अच्छा काम किया। यह कोड .NET Framework 4.5 से संकलित कोड है। यदि कोई चीज बेहतर है तो कृपया इसका इस्तेमाल करें। मुझे लगता है कि यह थोड़ा तेज हो सकता है।

 public static string BinaryToHex(byte[] data) 
     { 
      if (data == null) 
      { 
       return null; 
      } 
      char[] hex = new char[checked((int)data.Length * 2)]; 
      for (int i = 0; i < (int)data.Length; i++) 
      { 
       byte num = data[i]; 
       hex[2 * i] = NibbleToHex((byte)(num >> 4)); 
       hex[2 * i + 1] = NibbleToHex((byte)(num & 15)); 
      } 
      return new string(hex); 
     } 

     private static char NibbleToHex(byte nibble) 
     { 
      int aChar = (nibble < 10 ? nibble + 48 : nibble - 10 + 65); 
      return (char)aChar; 
     } 
9

क्या इस तरह की समस्या के लिए आगे का रास्ता सिफारिश की? "अप्रचलित" कॉल का उपयोग करना जारी रखना स्पष्ट रूप से सुझाया गया पथ नहीं है, इसलिए इसे "सदस्यता एपीआई का उपयोग करने" के अलावा किसी अन्य चीज़ द्वारा प्रतिस्थापित किया गया है?

सबसे अच्छा तरीका है (जो आप की संभावना से इनकार किया है) विशुद्ध रूप से .नेट फ्रेमवर्क के भीतर पासवर्ड PBKDF2, Bcrypt, या Scrypt द्वारा टुकड़ों में बांटा है करने के लिए सब कुछ के साथ बदल रहा है। पीबीकेडीएफ 2 को Rfc2898DeriveBytes Class द्वारा .NET में प्रदान किया गया है।

दूसरा सबसे अच्छा तरीका है पासवर्ड के दो "संस्करण" के साथ खत्म करने के लिए है:

  • संस्करण 0 वर्ष HashPasswordForStoringInConfigFile हो गया होता, लेकिन आप संस्करण 1 के लिए थोक, ऑफ़लाइन में उन लोगों के, को अद्यतन करने और निकाल सकते हैं किसी भी व्यक्ति ने उन्हें चुरा लेने से पहले उन पुराने हैंश को पूरा किया है और आप 9 0 के पुरानी पासवर्ड हैशिंग के रूप में व्यापार समाचार में समाप्त हो गए हैं।
  • संस्करण 1, जो मौजूदा हैशपासवर्डफोरस्टोरिंग कॉन्फ़िगरफ़ाइल मूल्य का पीबीकेडीएफ 2 है! अर्थात। आप अपने वर्तमान पुराने पुराने हैंश, और पीबीकेडीएफ 2 उन्हें एक नए यादृच्छिक नमक और पुनरावृत्तियों की एक बड़ी संख्या के साथ लेते हैं, और परिणाम संग्रहित करते हैं। फिर, जब कोई उपयोगकर्ता लॉग इन करना चाहता है, तो आप अपने पासवर्ड को रिचर्डबैजेंट कोड पर फ़ीड करते हैं, इसलिए आपके पास हैशपैसवर्डफोरस्टोरिंग कॉन्फिफफाइल वापस आ गया होगा, और फिर आप उस परिणाम के लिए पीबीकेडीएफ 2 लागू करते हैं!
    • अर्थात यह वास्तव में Rfc2898DeriveBytes (HashPasswordForStoringInConfigFile (पासवर्ड)), PerUserSalt, YourIterations)
  • संस्करण 2 है, जो जो संस्करण 1 हैश है उन करने के लिए उन्नत कर रहे हैं।"संस्करण" को छोड़कर सभी कॉलम समान हैं, लेकिन जब आप संस्करण 1 की गणना और सत्यापन करते हैं, तो आप Rfc2898DeriveBytes (पासवर्ड), PerUserSalt, YourIterations) की गणना करते हैं और संस्करण 2 हैश को संस्करण 2 हैश के साथ प्रतिस्थापित करते हैं (और संस्करण को 2 में बदलते हैं, बेशक)।

तीसरे सबसे अच्छा तरीका है दूसरा सबसे अच्छा तरीका है, लेकिन केवल संस्करण 1. से सावधान रहें, इस तरह से निहित है DCC2 पागलपन - आप नए एल्गोरिदम के अंदर अपने पुराने उत्पादन लपेटकर

दोनों ही मामलों में रखने के लिए, आप ' करूँगा डेटाबेस में PBKDF2-HMAC-SHA-1 परिणाम भंडारण किया है, तो आप की आवश्यकता होगी:

  • पासवर्ड हैश (बाइनरी (20)) - PBKDF2 उत्पादन यानी।
  • आपका नमक (बाइनरी (16), RNGCryptoServiceProvider Class द्वारा प्रति-उपयोगकर्ता उत्पन्न)
  • वैकल्पिक: PBKDF2 पुनरावृत्तियों की संख्या (INT, हजारों में शुरू करने और ऊपर जाने के लिए बस से पहले अपने सर्वर सीपीयू अधिकतम पर बाध्य हो जाएगा भार; बढ़ोतरी के रूप में वृद्धि करें क्योंकि आपके हार्डवेयर को अपग्रेड किया गया है)
    • यह हर बार जब कोई उपयोगकर्ता अपने (सही) पासवर्ड में प्रवेश करता है तो यह आपके सुरक्षा स्तर को पारदर्शी रूप से बढ़ाने की अनुमति देता है। पहले इसे सही करने के लिए सही है, फिर इसे उच्च पुनरावृत्ति गणना
    • के साथ फिर से धोना
  • वैकल्पिक: एक "संस्करण" (TINYINT) ताकि बाद में एक और एल्गोरिदम में अपग्रेड करना आसान हो, पाप सीई आप एक बार में एक से अधिक संस्करण सक्रिय हो सकते हैं।

पीएस संस्करण 1 या संस्करण 2 के लिए नए एल्गोरिथ के लिए, या तो पीबीकेडीएफ 2-एचएमएसी-एसएचए 256, पीबीकेडीएफ 2-एचएमएसी-एसएचए 512, और इसी तरह से सक्षम एक .NET लाइब्रेरी बनाई गई; my Github repository में परीक्षण वैक्टरों के एक उचित सेट के साथ इसका एक संस्करण शामिल है।

2

नेट द्वारा सरल एक

public static string HashString(string inputString, string hashName) 
{ 
    var algorithm = HashAlgorithm.Create(hashName); 
    if (algorithm == null) 
    throw new ArgumentException("Unrecognized hash name", hashName); 

    byte[] hash = algorithm.ComputeHash(Encoding.UTF8.GetBytes(inputString)); 
    return Convert.ToBase64String(hash); 
} 
+0

हां, हैश एल्गोरिदम बहुत लचीला है मैं आपके साथ सहमत हूं। फिर यदि यह SHA1 है तो अनिवार्य रूप से इसे HashAlgorithm.Create ("SHA-1") बनाने की विधि में पारित किया जाएगा। –

संबंधित मुद्दे