मैं डेटाबेस में उपयोगकर्ता इनपुट (पासवर्ड) कैसे हैश कर सकता हूं और बाद में लॉगिन के दौरान हैशेड पासवर्ड पढ़ सकता हूं?
मेरा मानना है कि समाधान रजिस्टर पर पासवर्ड हैश करना है, जहां पासवर्ड डीबी के अंदर हैश के रूप में सहेजा जाता है। बाद में लॉग इन करने पर, इसे अन-हैश करना चाहिए और अपने पासवर्ड की तुलना उपयोगकर्ता के पासवर्ड-इनपुट से करना चाहिए। लेकिन मुझे नहीं पता कि यह कैसे करना है।
मैंने पासवर्ड को 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);
}
मैं पहले डेटाबेस का उपयोग कर रहा हूं।
3 जवाब
आपको कभी भी पासवर्ड को अनहैश करने की आवश्यकता नहीं होनी चाहिए। एक क्रिप्टोग्राफ़िक हैश फ़ंक्शन को एकतरफा कार्रवाई माना जाता है।
(और यही कारण है कि इसे हैशिंग कहा जाता है न कि एन्क्रिप्टिंग। , यह एन्क्रिप्टिंग और डिक्रिप्टिंग होगा। इसलिए, हैशिंग एन्क्रिप्शन से अलग चीज है, ठीक है क्योंकि अनहैशिंग कभी नहीं होनी चाहिए।)
हैशिंग सुरक्षा प्रदान करता है, क्योंकि कोई भी आपके उपयोगकर्ता के पासवर्ड को चोरी नहीं कर सकता, भले ही वे आपके डेटाबेस की सामग्री को देखने का प्रबंधन करते हों।
जब उपयोगकर्ता पंजीकरण करता है, तो उनके पासवर्ड के हैश की गणना करें, हैश को डेटाबेस में संग्रहीत करें, और पासवर्ड को हमेशा के लिए भूल जाएं।
जब उपयोगकर्ता लॉग इन करता है, तो उनके द्वारा दर्ज किए गए पासवर्ड के हैश की गणना करें, (उस पासवर्ड को भी भूल जाएं) और देखें कि हैश डेटाबेस में संग्रहीत हैश से मेल खाता है या नहीं।
यह अधिकांश वेबसाइटों द्वारा उपयोग किया जाने वाला तंत्र है, और यही कारण है कि यदि आप सफलतापूर्वक "मैं अपना पासवर्ड भूल गया" प्रक्रिया से गुजरते हैं, तो वे आपको अपना पासवर्ड अभी भी नहीं दिखाएंगे: उनके पास ऐसा नहीं है यह; वे चाहते हुए भी इसे पुनः प्राप्त नहीं कर सकते। इसके बजाय, वे आपको एक पासवर्ड रीसेट लिंक भेजते हैं।
जहां तक स्ट्रिंग से हैश की गणना करने का सवाल है, इंटरवेबज़ उस प्रश्न के उत्तर के साथ प्रचुर मात्रा में है, उदाहरण के लिए: MD5 (MSDN); SHA-256 (MSDN); SHA-512 ( एमएसडीएन)
जब सुरक्षा की बात आती है तो पहिए को फिर से बनाने की कोशिश न करें। दावे आधारित प्रमाणीकरण का उपयोग करें।
यदि आपको अभी भी उपयोगकर्ता नाम और पासवर्ड प्रबंधित करना है, तो हैश-आधारित संदेश प्रमाणीकरण कोड का उपयोग करें (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));
नोट: नमक को गुप्त रखने की आवश्यकता नहीं है और हैश के साथ ही संग्रहीत किया जा सकता है। यह इंद्रधनुष तालिका हमले से सुरक्षा बढ़ाने के लिए है। कृपया एक ही प्रश्न को दो बार पोस्ट न करें। यहां से डुप्लिकेट करें।
Microsoft के System.Web.Helpers.Crypto
NuGet पैकेज का उपयोग करें।
आपके पास इस तरह का पासवर्ड है: var hash = Crypto.HashPassword("foo");
आप इस तरह एक पासवर्ड सत्यापित करते हैं: var verified = Crypto.VerifyHashedPassword(hash, "foo");
संबंधित सवाल
नए सवाल
c#
C # (उच्चारण "तेज देखें") Microsoft द्वारा विकसित एक उच्च स्तरीय, सांख्यिकीय रूप से टाइप किया हुआ, बहु-प्रतिमान प्रोग्रामिंग भाषा है। C # कोड आमतौर पर Microsoft के .NET परिवार के टूल और रन-टाइम को लक्षित करता है, जिसमें .NET फ्रेमवर्क, .NET कोर और Xamarin अन्य शामिल हैं। C # या C # के औपचारिक विनिर्देश में लिखे गए कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें।
PBKDF2
,password_hash
,Bcrypt
और इसी तरह के कार्यों जैसे कार्यों का उपयोग करें। मुद्दा यह है कि हमलावर को क्रूर बल द्वारा पासवर्ड खोजने में काफी समय व्यतीत करना पड़ता है।