मैं डेटाबेस में उपयोगकर्ता इनपुट (पासवर्ड) कैसे हैश कर सकता हूं और बाद में लॉगिन के दौरान हैशेड पासवर्ड पढ़ सकता हूं?

मेरा मानना ​​​​है कि समाधान रजिस्टर पर पासवर्ड हैश करना है, जहां पासवर्ड डीबी के अंदर हैश के रूप में सहेजा जाता है। बाद में लॉग इन करने पर, इसे अन-हैश करना चाहिए और अपने पासवर्ड की तुलना उपयोगकर्ता के पासवर्ड-इनपुट से करना चाहिए। लेकिन मुझे नहीं पता कि यह कैसे करना है।

मैंने पासवर्ड को nvarchar(MAX)डीबी में रखने की अनुमति दी है क्योंकि हैशेड पासवर्ड आमतौर पर लंबे होते हैं।

        [Required]
        [StringLength(MAX, MinimumLength = 3, ErrorMessage = "min 3, max 50 letters")]
        public string Password { get; set; }

रजिस्टर करें:

        [HttpPost]
        public ActionResult Register(User user) {
            if (ModelState.IsValid) {

                        var u = new User {
                            UserName = user.UserName,                               
                            Password = user.Password
                        };

                        db.Users.Add(u);
                        db.SaveChanges();

                    return RedirectToAction("Login");
                }
            }return View();    
        }

लॉग इन करें:

  public ActionResult Login() {
        return View();
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Login(User u) {
        if (ModelState.IsValid) 
        {
            using (UserEntities db = new UserEntities()) {

                //un-hash password?

                var v = db.Users.Where(a => a.UserName.Equals(u.UserName) && a.Password.Equals(u.Password)).FirstOrDefault();
                if (v != null) {

                    return RedirectToAction("Index", "Home"); //after login
                }
            }
        }return View(u);
    }

मैं पहले डेटाबेस का उपयोग कर रहा हूं।

7
Ezony 1 अक्टूबर 2016, 04:31
2
आप पासवर्ड को एन्क्रिप्ट नहीं करते हैं। आपने उन्हें हैश किया।
 – 
user3559349
1 अक्टूबर 2016, 04:32
धन्यवाद! मैंने ठीक कर दिया।
 – 
Ezony
1 अक्टूबर 2016, 04:36
1
आप पहचान का उपयोग क्यों नहीं कर रहे हैं जो यह सब बॉक्स से बाहर कर देगा? यदि आप यह सब मैन्युअल रूप से करना चाहते हैं, तो यह ब्लॉग देखें
 – 
user3559349
1 अक्टूबर 2016, 04:38
आपने एक ही प्रश्न को दो बार क्यों पोस्ट किया? क्या आपने यहां उत्तरों को देखा है? stackoverflow.com/questions/39802862/mvc- कैसे-से-हैश-और-नमक
 – 
Farukh
1 अक्टूबर 2016, 08:37
केवल हैश फ़ंक्शन का उपयोग करना पर्याप्त नहीं है और केवल नमक जोड़ने से सुरक्षा में सुधार करने के लिए बहुत कम है। इसके बजाय लगभग 100ms अवधि के लिए एक यादृच्छिक नमक के साथ एक HMAC पर iIterate करें और नमक को हैश से बचाएं। PBKDF2, password_hash, Bcrypt और इसी तरह के कार्यों जैसे कार्यों का उपयोग करें। मुद्दा यह है कि हमलावर को क्रूर बल द्वारा पासवर्ड खोजने में काफी समय व्यतीत करना पड़ता है।
 – 
zaph
1 अक्टूबर 2016, 14:39

3 जवाब

सबसे बढ़िया उत्तर

आपको कभी भी पासवर्ड को अनहैश करने की आवश्यकता नहीं होनी चाहिए। एक क्रिप्टोग्राफ़िक हैश फ़ंक्शन को एकतरफा कार्रवाई माना जाता है।

(और यही कारण है कि इसे हैशिंग कहा जाता है न कि एन्क्रिप्टिंग। , यह एन्क्रिप्टिंग और डिक्रिप्टिंग होगा। इसलिए, हैशिंग एन्क्रिप्शन से अलग चीज है, ठीक है क्योंकि अनहैशिंग कभी नहीं होनी चाहिए।)

हैशिंग सुरक्षा प्रदान करता है, क्योंकि कोई भी आपके उपयोगकर्ता के पासवर्ड को चोरी नहीं कर सकता, भले ही वे आपके डेटाबेस की सामग्री को देखने का प्रबंधन करते हों।

  • जब उपयोगकर्ता पंजीकरण करता है, तो उनके पासवर्ड के हैश की गणना करें, हैश को डेटाबेस में संग्रहीत करें, और पासवर्ड को हमेशा के लिए भूल जाएं।

  • जब उपयोगकर्ता लॉग इन करता है, तो उनके द्वारा दर्ज किए गए पासवर्ड के हैश की गणना करें, (उस पासवर्ड को भी भूल जाएं) और देखें कि हैश डेटाबेस में संग्रहीत हैश से मेल खाता है या नहीं।

यह अधिकांश वेबसाइटों द्वारा उपयोग किया जाने वाला तंत्र है, और यही कारण है कि यदि आप सफलतापूर्वक "मैं अपना पासवर्ड भूल गया" प्रक्रिया से गुजरते हैं, तो वे आपको अपना पासवर्ड अभी भी नहीं दिखाएंगे: उनके पास ऐसा नहीं है यह; वे चाहते हुए भी इसे पुनः प्राप्त नहीं कर सकते। इसके बजाय, वे आपको एक पासवर्ड रीसेट लिंक भेजते हैं।

जहां तक ​​स्ट्रिंग से हैश की गणना करने का सवाल है, इंटरवेबज़ उस प्रश्न के उत्तर के साथ प्रचुर मात्रा में है, उदाहरण के लिए: MD5 (MSDN); SHA-256 (MSDN); SHA-512 ( एमएसडीएन)

18
Mike Nakis 6 अप्रैल 2018, 20:15
अगर मैं "पासवर्ड" लिखता हूं और यह हैश हो जाता है और मैंने एक और "पासवर्ड" लिखा है, तो क्या उन दोनों का हैश-वैल्यू समान होगा? या वे हर बार यादृच्छिक हैश-मूल्य प्राप्त कर रहे हैं? यदि यादृच्छिक रूप से, तो उपयोगकर्ता लॉग इन करते समय पासवर्ड की तुलना करना कैसे संभव है? यदि बेतरतीब ढंग से नहीं, तो क्या उपयोगकर्ताओं के हैश-वैल्यू को चुराना और इसके साथ लॉग इन करना संभव है (किसी तरह चोरी किए गए हैश-पासवर्ड को बायपास/हैशिंग से बचें)?
 – 
Ezony
1 अक्टूबर 2016, 05:10
2
उनके पास हर बार एक ही हैश होगा। यहाँ बढ़िया जवाब माइक।
 – 
Jonesopolis
1 अक्टूबर 2016, 05:14
उनके पास एक ही हैश होगा। यही कारण है कि आप एक नमक बनाते हैं जो अंत तक निपटने के लिए यादृच्छिक वर्णों की एक स्ट्रिंग है। फिर आप नमक और हैश स्टोर करें। जब वे पासवर्ड टाइप करते हैं तो आप नमक डालते हैं फिर हैश करते हैं यह देखने के लिए कि क्या यह आपके द्वारा संग्रहीत नमकीन हैश से तुलना करता है। प्रत्येक पासवर्ड को एक अलग नमक मिलता है; इसलिए, पासवर्ड समान होने पर भी सभी हैश अद्वितीय हैं।
 – 
tphx
1 अक्टूबर 2016, 05:15
आह दिलचस्प। क्या कोई आसान प्रदर्शन है जिसे आप जानते हैं कि मैं अनुसरण कर सकता हूं? हैश और नमक के लिए।
 – 
Ezony
1 अक्टूबर 2016, 05:35
1
यदि आप स्वयं पासवर्ड स्टोर करने जा रहे हैं, तो कम से कम bcrypt जैसे अच्छे हैशिंग एल्गोरिथम का उपयोग करें। एमडी 5 नहीं।
 – 
juunas
1 अक्टूबर 2016, 09:34

जब सुरक्षा की बात आती है तो पहिए को फिर से बनाने की कोशिश न करें। दावे आधारित प्रमाणीकरण का उपयोग करें।

यदि आपको अभी भी उपयोगकर्ता नाम और पासवर्ड प्रबंधित करना है, तो हैश-आधारित संदेश प्रमाणीकरण कोड का उपयोग करें (HMAC)

मैं कुछ समय निवेश करने और एंटरप्राइज़ सुरक्षा सर्वोत्तम अभ्यास पढ़ने की भी अनुशंसा करता हूं। पहले से ही होशियार लोग हैं जिन्होंने इस समस्या को हल किया कि पहिया को फिर से क्यों बनाया जाए। और .NET में सभी अच्छाइयाँ हैं।

नीचे उदाहरण:

using System.Security.Cryptography;
using System.Text;

//--------------------MyHmac.cs-------------------
public static class MyHmac
{
    private const int SaltSize = 32;

    public static byte[] GenerateSalt()
    {
        using (var rng = new RNGCryptoServiceProvider())
        {
            var randomNumber = new byte[SaltSize];

            rng.GetBytes(randomNumber);

            return randomNumber;

        }
    }

    public static byte[] ComputeHMAC_SHA256(byte[] data, byte[] salt)
    {
        using (var hmac = new HMACSHA256(salt))
        {
            return hmac.ComputeHash(data);
        }
    }
}



//-------------------Program.cs---------------------------
string orgMsg = "Original Message";
        string otherMsg = "Other Message";


        Console.WriteLine("HMAC SHA256 Demo in .NET");

        Console.WriteLine("----------------------");
        Console.WriteLine();

        var salt = MyHmac.GenerateSalt();

        var hmac1 = MyHmac.ComputeHMAC_SHA256(Encoding.UTF8.GetBytes(orgMsg), salt);
        var hmac2 = MyHmac.ComputeHMAC_SHA256(Encoding.UTF8.GetBytes(otherMsg), salt);


        Console.WriteLine("Original Message Hash:{0}", Convert.ToBase64String(hmac1));
        Console.WriteLine("Other Message Hash:{0}", Convert.ToBase64String(hmac2));

नोट: नमक को गुप्त रखने की आवश्यकता नहीं है और हैश के साथ ही संग्रहीत किया जा सकता है। यह इंद्रधनुष तालिका हमले से सुरक्षा बढ़ाने के लिए है। कृपया एक ही प्रश्न को दो बार पोस्ट न करें। यहां से डुप्लिकेट करें।

4
Travis J 30 जिंदा 2019, 07:58

Microsoft के System.Web.Helpers.Crypto NuGet पैकेज का उपयोग करें।

आपके पास इस तरह का पासवर्ड है: var hash = Crypto.HashPassword("foo");

आप इस तरह एक पासवर्ड सत्यापित करते हैं: var verified = Crypto.VerifyHashedPassword(hash, "foo");

6
Kai Hartmann 23 जुलाई 2019, 10:51