C # में SHA1 एल्गोरिथ्म के साथ हैशिंग


86

मैं एल्गोरिथ्म के उपयोग के साथ दिए गए byte[]सरणी को हैश करना चाहता हूं । हैश इकाई परीक्षण से आएगा। उम्मीद हैश (मामला संवेदनशील) है।SHA1SHA1Managed
byte[]
0d71ee4472658cd5874c5578410a9d8611fc9aef

इसे कैसे प्राप्त किया जा सकता है?

public string Hash(byte [] temp)
{
    using (SHA1Managed sha1 = new SHA1Managed())
    {

    }
}

1
आपका एक्सपेक्टेड हैश एक हेक्साडेसिमल मान है, इसलिए यह संवेदनशील होने पर बात नहीं करता है जैसेhex(e) == hex(E)
jAC

जवाबों:


173

उन लोगों के लिए जो हैश का "मानक" टेक्स्ट फ़ॉर्मेटिंग चाहते हैं, आप निम्न जैसे कुछ का उपयोग कर सकते हैं:

static string Hash(string input)
{
    using (SHA1Managed sha1 = new SHA1Managed())
    {
        var hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(input));
        var sb = new StringBuilder(hash.Length * 2);

        foreach (byte b in hash)
        {
            // can be "x2" if you want lowercase
            sb.Append(b.ToString("X2"));
        }

        return sb.ToString();
    }
}

इससे हैश जैसा उत्पादन होगा 0C2E99D0949684278C30B9369B82638E1CEAD415

या एक कोड गोल्फ संस्करण के लिए:

static string Hash(string input)
{
    var hash = new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(input));
    return string.Concat(hash.Select(b => b.ToString("x2")));
}

यह मुझे बताता है कि यह समाधान SHA1Managed ऑब्जेक्ट का निपटान नहीं करता है, क्योंकि यह डिस्पोजेबल के रूप में चिह्नित है। अनुकूलन करते समय यह पोस्ट आसान हो सकती है: stackoverflow.com/a/624379/991863
sky-dev

@ आकाश देव, मैं आमतौर से सहमत हूं IDisposable, लेकिन संदर्भ स्रोत की एक त्वरित यात्रा से पता चलता है कि कुछ भी दिलचस्प नहीं होता है.Dispose()
मिच

हाँ, मैंने डिस्पोज़ल कार्यान्वयन को भी देखा। यह सिर्फ गार्बडक्लेक्शन एक बालक को गति देगा। यह शायद चीजों की भव्य योजना में एक बड़ी बात नहीं है।
आकाश देव

21
@ मिच यदि यह आईडीआईसॉपी इंटरफ़ेस को लागू करता है तो संदर्भ स्रोत में क्या होता है, इससे कोई फर्क नहीं पड़ता। क्या उन्हें कभी भी किसी भी कारण से इसे बदलना चाहिए जैसे कि .Dispose () कॉल महत्वपूर्ण हो जाता है, आपका पूर्ववर्ती कोड अब एक समस्या पैदा कर रहा है। यह सुनिश्चित करने के लिए कि आप किस चीज से दूर हो सकते हैं, एक रूपरेखा के आंत्र में देखने के लिए एक रखरखाव दुःस्वप्न का रास्ता है। मैं बहुत से सुझाव का पालन करता हूं और डिस्पोजेबल वस्तुओं को सही ढंग से संभाल रहा हूं, यह आपको लंबे समय में दर्द से बचाएगा।
unenthusiasticuser

2
@ijt, X2 इसे बाइट के लिए दो हेक्साडेसिमल अंकों का उपयोग करने के लिए कहता है। x2लोअरकेस का मतलब X2है अपरकेस
मिच

38
public string Hash(byte [] temp)
{
    using (SHA1Managed sha1 = new SHA1Managed())
    {
        var hash = sha1.ComputeHash(temp);
        return Convert.ToBase64String(hash);
    }
}

संपादित करें:

बाइट सरणी को स्ट्रिंग में परिवर्तित करते समय आप एन्कोडिंग भी निर्दिष्ट कर सकते हैं:

return System.Text.Encoding.UTF8.GetString(hash);

या

return System.Text.Encoding.Unicode.GetString(hash);

मैं इन कोड से पहले लिखा था, लेकिन यह काम मैं कारण पता नहीं है
Merve काया

1
यदि वे एक हेक्स स्ट्रिंग चाहते हैं तो बेस 64 शायद गलत विकल्प है।
जॉय

@ जॉय: ग्रांट टॉमस द्वारा दिए गए जवाब के खिलाफ, सदस्य ने संकेत दिया कि उन्हें एक स्ट्रिंग वापस करने की आवश्यकता है
जॉन गैथोगो

@MerveKaya: शायद आपको यह समझाना चाहिए कि "काम नहीं किया" से आपका क्या मतलब है। आने वाली बाइट सरणी क्या दर्शाती है? आपने "SHA1Managed" का निर्धारण कैसे किया? आने वाली बाइट सरणी को 0d71ee4472658cd5874c5578410a9d8611fc9aefआउटपुट के रूप में आपको देना चाहिए ?
जॉन गैथोगो

बाइट [] हैश यूनिट टेस्ट से आता है। प्रश्न में उन्होंने लिखा है कि अपेक्षित हैश 0d71ee4472658cd5874c5578410a9d8611fc9aef है। यह यूनिट टेस्ट
मर्व काया

15

यह वही है जिसके साथ मैं गया था। आप में से जो लोग अनुकूलन करना चाहते हैं, उनके लिए https://stackoverflow.com/a/624379/991863 देखें

    public static string Hash(string stringToHash)
    {
        using (var sha1 = new SHA1Managed())
        {
            return BitConverter.ToString(sha1.ComputeHash(Encoding.UTF8.GetBytes(stringToHash)));
        }
    }

मुझे BitConverter.ToString (sha1.ComputeHash (बाइट्स)) का उपयोग करना पड़ा था। मैं BitConverter द्वारा शुरू किए गए डैश नहीं चाहता था, क्योंकि मैं ("-", "") प्रतिस्थापित करता हूं। उसके बाद यह एक आकर्षण की तरह काम करता था! धन्यवाद!
सैम

9

सबसे तेज़ तरीका यह है:

    public static string GetHash(string input)
    {
        return string.Join("", (new SHA1Managed().ComputeHash(Encoding.UTF8.GetBytes(input))).Select(x => x.ToString("X2")).ToArray());
    }

छोटे चरित्र उत्पादन प्रयोग के लिए x2में की की की जगहX2


4
SHA1Managed कार्यान्वित IDis प्रयोज्य, ताकि आप इसे तब निपटाना चाहें जब इसके साथ संसाधनों को मुक्त किया जा सके।
रिकेटेफ़ॉक्स

8

आप "निर्दिष्ट बाइट सरणी के लिए मान का उपयोग कर सकते हैं" ComputeHash:

var hash = sha1.ComputeHash(temp);

यदि आप स्ट्रिंग प्रतिनिधित्व में परिणाम का विश्लेषण करना चाहते हैं, तो आपको {0:X2}प्रारूप विनिर्देशक का उपयोग करके बाइट्स को प्रारूपित करना होगा ।


4

मैं अपनी टोपी यहाँ फेंक दूँगा:

(एक स्थिर वर्ग के हिस्से के रूप में, यह स्निपेट दो एक्सटेंशन है)

//hex encoding of the hash, in uppercase.
public static string Sha1Hash (this string str)
{
    byte[] data = UTF8Encoding.UTF8.GetBytes (str);
    data = data.Sha1Hash ();
    return BitConverter.ToString (data).Replace ("-", "");
}
// Do the actual hashing
public static byte[] Sha1Hash (this byte[] data)
{
    using (SHA1Managed sha1 = new SHA1Managed ()) {
    return sha1.ComputeHash (data);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.