सी # में हैश स्ट्रिंग


90

जब कोई हैश स्ट्रिंग प्राप्त करने की कोशिश करता है तो मुझे एक समस्या होती है c#

मैंने पहले से ही कुछ वेबसाइटों की कोशिश की, लेकिन उनमें से अधिकांश हैश पाने के लिए फाइलों का उपयोग कर रहे हैं। अन्य जो तार के लिए हैं वे थोड़ा बहुत जटिल हैं। मुझे इस तरह वेब के लिए विंडोज प्रमाणीकरण के लिए उदाहरण मिले:

FormsAuthentication.HashPasswordForStoringInConfigFile(tbxPassword.Text.Trim(), "md5")

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

उदाहरण:

string file  = "username";
string hash = ??????(username); 

मैं एक और हैशिंग एल्गोरिथ्म का उपयोग करना चाहिए और "md5" नहीं?

जवाबों:


183
using System.Security.Cryptography;

public static byte[] GetHash(string inputString)
{
    using (HashAlgorithm algorithm = SHA256.Create())
        return algorithm.ComputeHash(Encoding.UTF8.GetBytes(inputString));
}

public static string GetHashString(string inputString)
{
    StringBuilder sb = new StringBuilder();
    foreach (byte b in GetHash(inputString))
        sb.Append(b.ToString("X2"));

    return sb.ToString();
}

अतिरिक्त नोट्स

  • चूंकि MD5 और SHA1 अप्रचलित और असुरक्षित एल्गोरिदम हैं, इसलिए यह समाधान SHA256 का उपयोग करता है। वैकल्पिक रूप से, आप BCrypt या Scrypt का उपयोग कर सकते हैं जैसा कि टिप्पणियों में बताया गया है।
  • इसके अलावा, अपने हैश पर " नमस्कार " पर विचार करें और सिद्ध क्रिप्टोग्राफ़िक एल्गोरिदम का उपयोग करें, जैसा कि टिप्पणियों में बताया गया है।

46
MD5 OR SHA1 का उपयोग न करें , वे अप्रचलित और असुरक्षित एल्गोरिदम हैं। SHA256 का उपयोग कम से कम या इससे भी बेहतर उपयोग करें BCrypt या Scrypt।
मुहम्मद रेहान सईद

1
SCrypt का उपयोग करने का यह उदाहरण देखें: stackoverflow.com/questions/20042977/…
मुहम्मद रेहान सईद

6
@Mhh यह आसानी से चेकसम के लिए इस्तेमाल किया जा सकता है, क्योंकि इसकी SHA512 की तुलना में बहुत तेज है। लेकिन वास्तव में Passwords को स्टोर करने के लिए, यह अनुशंसित नहीं है, जो सही है।
लकीलीके

5
इसका क्या b.ToString("X2")मतलब है?
बिलाल फजलानी

1
Hezi

60

पासवर्ड स्टोर के प्रयोजनों के लिए हैश स्ट्रिंग प्राप्त करने का सबसे तेज़ तरीका, निम्नलिखित कोड है:

    internal static string GetStringSha256Hash(string text)
    {
        if (String.IsNullOrEmpty(text))
            return String.Empty;

        using (var sha = new System.Security.Cryptography.SHA256Managed())
        {
            byte[] textData = System.Text.Encoding.UTF8.GetBytes(text);
            byte[] hash = sha.ComputeHash(textData);
            return BitConverter.ToString(hash).Replace("-", String.Empty);
        }
    }

टिप्पणियों:

  • यदि विधि को अक्सर लागू किया जाता है, तो shaचर का निर्माण एक वर्ग क्षेत्र में वापस किया जाना चाहिए;
  • आउटपुट को एन्कोडेड हेक्स स्ट्रिंग के रूप में प्रस्तुत किया जाता है;

SHA1Managedक्लास बहुत महंगा नहीं है। यह लगभग 130 बाइट्स का उपभोग करता है और उन्हें कुछ स्थिर मूल्य के लिए प्रारंभ करता है, लेकिन यह सब है। इसलिए ज्यादातर मामलों में प्रदर्शन की समस्या नहीं होनी चाहिए।
पृथ्वी इंजन

1
इसके अलावा SHA1Managed, IDisposableइसके उपयोग को usingब्लॉक में लपेटने की आवश्यकता है ।
पृथ्वी इंजन

उद्देश्य Disposeविधि आंतरिक बफर को साफ़ करना है। ऐसा करने में विफल होने पर मेमोरी अटैक का खतरा होगा।
पृथ्वी इंजन

3
@MuhammadRehanSaeed जब मैंने कहा SHA1Managedमहंगा नहीं है, मेरा मतलब है कि इसका निर्माण नहीं है। इसके अलावा, एक हैशिंग एल्गोरिथ्म महंगा नहीं है। यह केवल (अत्यंत) महंगा होना चाहिए जब आप एक टकराव खोजना चाहते हैं।
पृथ्वी इंजन

1
@King_Fisher - यह असंभव है! हैश एक तरह से फ़ंक्शन है, जानकारी खो जाती है। यदि आपको डिक्रिप्ट करने की आवश्यकता है, तो आपको एन्क्रिप्शन विधि का उपयोग करने की आवश्यकता है, हैशिंग नहीं। BTW, पासवर्ड एन्क्रिप्ट करना एक बुरा अभ्यास है।
andrew.fox 8

8

मैं वास्तव में आपके प्रश्न के पूर्ण दायरे को नहीं समझता हूं, लेकिन अगर आप सभी को स्ट्रिंग का एक हैश है, तो इसे प्राप्त करना बहुत आसान है।

बस GetHashCode विधि का उपयोग करें।

इस कदर:

string hash = username.GetHashCode();

1
हाँ, कि यह क्या देख रहा है। लेकिन यह कोड बड़ी गलती है। Int हैश = "उपयोगकर्ता नाम" की तरह लेखन दिखाएँ। GetHasCode ();
Edy Cu

3
आपने दोहरे उद्धरण चिह्नों में उपयोगकर्ता नाम क्यों रखा है? इससे 'उपयोगकर्ता नाम' का हैश मिलेगा और अब उपयोगकर्ता नाम चर में क्या है।
सिरिल गुप्ता

14
GetHashCode से मूल्यों को संग्रहीत न करें, यह 32x और 64x के लिए अलग है
स्लाव

12
यह पासवर्ड हैश बनाने का एक बुरा तरीका है। GetHashCode () के साथ आप यह नहीं मान सकते कि एक ही नंबर अलग कंप्यूटर से उत्पन्न होगा। Sha1 हैश विधि या कुछ का उपयोग करें (मैं बाद में एक उदाहरण पोस्ट करूंगा)
andrew.fox

2
यह ध्यान दिया जाना चाहिए कि GetHashCodeक्रिप्टोग्राफिक रूप से सुरक्षित हैशिंग एल्गोरिथ्म नहीं है। SHA256 का उपयोग कम से कम या इससे भी बेहतर उपयोग करें सुरक्षित एल्गोरिथ्म के लिए BCrypt या Scrypt।
मुहम्मद रेहान सईद

5

मुझे लगता है कि आप जो खोज रहे हैं वह हैशिंग नहीं बल्कि एन्क्रिप्शन है। हैशिंग के साथ, आप "हैश" चर से मूल फ़ाइल नाम को पुनः प्राप्त नहीं कर पाएंगे। एन्क्रिप्शन के साथ आप कर सकते हैं, और यह सुरक्षित है।

.NET में एन्क्रिप्शन के बारे में अधिक जानकारी के लिए VB.NET के साथ ASP.NET में AES देखें ।


हां, मुझे लगता है कि एन्क्रिप्शन है, लेकिन मैं सिर्फ परिणाम हैश की तुलना करना चाहता हूं। रीडायरेक्ट पेज के बाद।
Edy Cu

आप हैशेड फ़ाइल नाम की तुलना किससे करना चाहते हैं?
पीटर वैन गिन्केल

1
//Secure & Encrypte Data
    public static string HashSHA1(string value)
    {
        var sha1 = SHA1.Create();
        var inputBytes = Encoding.ASCII.GetBytes(value);
        var hash = sha1.ComputeHash(inputBytes);
        var sb = new StringBuilder();
        for (var i = 0; i < hash.Length; i++)
        {
            sb.Append(hash[i].ToString("X2"));
        }
        return sb.ToString();
    }

3
इस लिंक से SHE1 का उपयोग न करें , SHA1 एक अप्रचलित और असुरक्षित एल्गोरिदम है। SHA256 का उपयोग कम से कम या इससे भी बेहतर उपयोग करें BCrypt या Scrypt।
मुहम्मद रेहान सईद

SCrypt का उपयोग करने का यह उदाहरण देखें: stackoverflow.com/questions/20042977/…
मुहम्मद रेहान सईद

1

यदि प्रदर्शन कोई बड़ी चिंता नहीं है, तो आप इन विधियों में से किसी का भी उपयोग कर सकते हैं:
(यदि आप चाहते थे कि हैश स्ट्रिंग ऊपरी मामले में हो, तो प्रतिस्थापित "x2"करें "X2")।

public static string SHA256ToString(string s) 
{
    using (var alg = SHA256.Create())
        return string.Join(null, alg.ComputeHash(Encoding.UTF8.GetBytes(s)).Select(x => x.ToString("x2")));
}

या:

public static string SHA256ToString(string s)
{            
    using (var alg = SHA256.Create())
        return alg.ComputeHash(Encoding.UTF8.GetBytes(s)).Aggregate(new StringBuilder(), (sb, x) => sb.Append(x.ToString("x2"))).ToString();
}

0

सबसे छोटा और सबसे तेज़ तरीका। केवल 1 लाइन!

    public static string StringSha256Hash(string text) =>
        string.IsNullOrEmpty(text) ? string.Empty : BitConverter.ToString(new System.Security.Cryptography.SHA256Managed().ComputeHash(System.Text.Encoding.UTF8.GetBytes(text))).Replace("-", string.Empty);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.