दिलचस्प पोस्ट
कंडीशनल बाइनरी डेटाटायेबल पैकेज का उपयोग करके संदर्भ में शामिल होने और अपडेट करें स्ट्रिंग को पार्स करें जैसे कि यह रेल पर रूबी में एक क्वेरी स्ट्रिंग थे सी # में कैनवास पर एक पंक्ति को कैसे सजीव करना है? सुरक्षित एसक्यूएल नामों का उपयोग कैसे करें? जावा में विधि के बराबर कैसे ओवरराइड करें कॉन्फ़िगरेशन फ़ाइल को कैसे स्टोर करें और इसे रीएक्ट के जरिए पढ़ें MongoDB – सॉकेट के लिए अनुमति अस्वीकृत: /tmp/mongodb-27017.sock जीडब्ल्यूटी: टाइमर और शेड्यूलर क्लासेस CMakeLists.txt पर CMake त्रुटि: 30 (परियोजना): कोई CMAKE_C_COMPILER पाया नहीं जा सकता इनो सेटअप का उपयोग करके फ़ाइल पर 'व्यवस्थापक के रूप में चलाएं' को कैसे सेट करें यदि वह मौजूद नहीं है तो एक निर्देशिका बनाएं कार्य को रद्द करना एक अपवाद फेंक रहा है mmap () बनाम पढ़ने के ब्लॉक एक स्ट्रिंग में कई स्थानों को हटाने का आसान तरीका? टैब बार पर निष्क्रिय आइकन / पाठ रंग कैसे बदल सकता है?

कैसे एक पासवर्ड हैश करने के लिए

हे, मैं फ़ोन पर एक पासवर्ड के हैश को संग्रहीत करना चाहता हूं, लेकिन मुझे यकीन नहीं है कि यह कैसे करना है। मैं केवल एन्क्रिप्शन विधियों को ढूंढने के लिए प्रतीत होता है पासवर्ड को हैश करने का सबसे अच्छा तरीका क्या है? धन्यवाद

Solutions Collecting From Web of "कैसे एक पासवर्ड हैश करने के लिए"

अद्यतनः यह जवाब गंभीर रूप से बहिष्कृत है I कृपया इसके बजाय https://stackoverflow.com/a/10402129/251311 से अनुशंसाओं का उपयोग करें

आप या तो उपयोग कर सकते हैं

var md5 = new MD5CryptoServiceProvider(); var md5data = md5.ComputeHash(data); 

या

 var sha1 = new SHA1CryptoServiceProvider(); var sha1data = sha1.ComputeHash(data); 

बाइट सरणी के रूप में data प्राप्त करने के लिए आप उपयोग कर सकते हैं

 var data = Encoding.ASCII.GetBytes(password); 

और वापस md5data या sha1data से स्ट्रिंग पाने के लिए

 var hashedPassword = ASCIIEncoding.GetString(md5data); 

यहां के अधिकांश अन्य उत्तर यहां की सर्वोत्तम पद्धतियों के साथ-साथ कुछ पुराना हैं। जैसे कि यहां पासवर्ड की दुकान और सत्यापित करने के लिए पीबीकेडीएफ 2 / आरएफसी 28 9 8 डायरेवइबेट्स का इस्तेमाल करने का आवेदन है। निम्न कोड इस पोस्ट में एक स्टैंडअलोन क्लास में है: एक नमक पासवर्ड हैश को स्टोर करने का दूसरा उदाहरण मूल बातें वास्तव में आसान हैं, इसलिए यहां यह टूट गया है:

चरण 1 क्रिप्टोग्राफिक पीआरएनजी के साथ नमक मूल्य बनाएँ:

 byte[] salt; new RNGCryptoServiceProvider().GetBytes(salt = new byte[16]); 

STEP 2 Rfc2898DeriveBytes बनाएँ और हैश मान प्राप्त करें:

 var pbkdf2 = new Rfc2898DeriveBytes(password, salt, 10000); byte[] hash = pbkdf2.GetBytes(20); 

चरण 3 बाद में उपयोग के लिए नमक और पासवर्ड बाइट्स का मिश्रण करें:

 byte[] hashBytes = new byte[36]; Array.Copy(salt, 0, hashBytes, 0, 16); Array.Copy(hash, 0, hashBytes, 16, 20); 

चरण 4 संयुक्त नमक + हैश को स्टोरेज के लिए स्ट्रिंग में बदलें

 string savedPasswordHash = Convert.ToBase64String(hashBytes); DBContext.AddUser(new User { ..., Password = savedPasswordHash }); 

STEP 5 उपयोगकर्ता द्वारा दर्ज पासवर्ड को एक संग्रहीत पासवर्ड के खिलाफ सत्यापित करें

 /* Fetch the stored value */ string savedPasswordHash = DBContext.GetUser(u => u.UserName == user).Password; /* Extract the bytes */ byte[] hashBytes = Convert.FromBase64String(savedPasswordHash); /* Get the salt */ byte[] salt = new byte[16]; Array.Copy(hashBytes, 0, salt, 0, 16); /* Compute the hash on the password the user entered */ var pbkdf2 = new Rfc2898DeriveBytes(password, salt, 10000); byte[] hash = pbkdf2.GetBytes(20); /* Compare the results */ for (int i=0; i < 20; i++) if (hashBytes[i+16] != hash[i]) throw new UnauthorizedAccessException(); 

नोट: आपके विशिष्ट एप्लिकेशन की प्रदर्शन आवश्यकताओं के आधार पर, '10000' का मूल्य घटाया जा सकता है। एक न्यूनतम मूल्य 1000 के आसपास होना चाहिए।

Csharptest.net के महान उत्तर के आधार पर, मैंने इसके लिए एक कक्षा लिखा है:

 public sealed class SecurePasswordHasher { /// <summary> /// Size of salt /// </summary> private const int SaltSize = 16; /// <summary> /// Size of hash /// </summary> private const int HashSize = 20; /// <summary> /// Creates a hash from a password /// </summary> /// <param name="password">the password</param> /// <param name="iterations">number of iterations</param> /// <returns>the hash</returns> public static string Hash(string password, int iterations) { //create salt byte[] salt; new RNGCryptoServiceProvider().GetBytes(salt = new byte[SaltSize]); //create hash var pbkdf2 = new Rfc2898DeriveBytes(password, salt, iterations); var hash = pbkdf2.GetBytes(HashSize); //combine salt and hash var hashBytes = new byte[SaltSize + HashSize]; Array.Copy(salt, 0, hashBytes, 0, SaltSize); Array.Copy(hash, 0, hashBytes, SaltSize, HashSize); //convert to base64 var base64Hash = Convert.ToBase64String(hashBytes); //format hash with extra information return string.Format("$MYHASH$V1${0}${1}", iterations, base64Hash); } /// <summary> /// Creates a hash from a password with 10000 iterations /// </summary> /// <param name="password">the password</param> /// <returns>the hash</returns> public static string Hash(string password) { return Hash(password, 10000); } /// <summary> /// Check if hash is supported /// </summary> /// <param name="hashString">the hash</param> /// <returns>is supported?</returns> public static bool IsHashSupported(string hashString) { return hashString.Contains("$MYHASH$V1$"); } /// <summary> /// verify a password against a hash /// </summary> /// <param name="password">the password</param> /// <param name="hashedPassword">the hash</param> /// <returns>could be verified?</returns> public static bool Verify(string password, string hashedPassword) { //check hash if (!IsHashSupported(hashedPassword)) { throw new NotSupportedException("The hashtype is not supported"); } //extract iteration and Base64 string var splittedHashString = hashedPassword.Replace("$MYHASH$V1$", "").Split('$'); var iterations = int.Parse(splittedHashString[0]); var base64Hash = splittedHashString[1]; //get hashbytes var hashBytes = Convert.FromBase64String(base64Hash); //get salt var salt = new byte[SaltSize]; Array.Copy(hashBytes, 0, salt, 0, SaltSize); //create hash with given salt var pbkdf2 = new Rfc2898DeriveBytes(password, salt, iterations); byte[] hash = pbkdf2.GetBytes(HashSize); //get result for (var i = 0; i < HashSize; i++) { if (hashBytes[i + SaltSize] != hash[i]) { return false; } } return true; } } 

उपयोग:

 //Hash var hash = SecurePasswordHasher.Hash("mypassword"); //Verify var result = SecurePasswordHasher.Verify("mypassword", hash); 

एक नमूना हैश यह हो सकता है:

 $MYHASH$V1$10000$Qhxzi6GNu/Lpy3iUqkeqR/J1hh8y/h5KPDjrv89KzfCVrubn 

जैसा कि आप देख सकते हैं, मैंने भी आसान उपयोग के लिए हैश में पुनरावृत्तियों को शामिल किया है और यह अपग्रेड करने की संभावना है, अगर हमें अपग्रेड करने की आवश्यकता है।

मैं अपने पासवर्ड एन्क्रिप्शन के लिए एक हैश और एक नमक का उपयोग करता हूं (यह उसी हैश है कि asp.Net सदस्यता का उपयोग करता है):

 private string PasswordSalt { get { var rng = new RNGCryptoServiceProvider(); var buff = new byte[32]; rng.GetBytes(buff); return Convert.ToBase64String(buff); } } private string EncodePassword(string password, string salt) { byte[] bytes = Encoding.Unicode.GetBytes(password); byte[] src = Encoding.Unicode.GetBytes(salt); byte[] dst = new byte[src.Length + bytes.Length]; Buffer.BlockCopy(src, 0, dst, 0, src.Length); Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length); HashAlgorithm algorithm = HashAlgorithm.Create("SHA1"); byte[] inarray = algorithm.ComputeHash(dst); return Convert.ToBase64String(inarray); }