資料庫中儲存使用者名稱、密碼時如何處理?
阿新 • • 發佈:2018-12-22
一般的專案都有一個使用者表,請問在這個表中,你的賬號和密碼都是明文儲存的麼?那麼怎麼防止被別人看見使用者的密碼呢?
我見過一個專案是這樣的,在使用者註冊時就對使用者的密碼進行MD5加密,這樣使用者表中儲存的密碼就是加密的資訊,就算管理員也不能看到使用者的密碼,使用者在登入時輸入賬號和密碼,在後臺把使用者密碼驚醒MD5摘要之後和資料庫的密碼就行比對,如果一致就可以登陸,但是使用者忘記密碼之後就沒有任何人能看到密碼了,只能根據使用者的提示問題重新設定。
確切的說,資料庫中儲存的不是”加密“後的密碼,而是密碼的摘要資訊,通過這個摘要資訊是無法還原出密碼的。使用者登入時拿到原密碼之後,按照相同的演算法,再計算一遍摘要資訊,和資料庫中的摘要資訊做一下比較,如果相同,就認為密碼是正確的。
登入時,我們填寫的是明文密碼,但在資料庫裡儲存的是加密後的密碼,登入時這兩者如何比對?
用相同的加密演算法再次加密你的明文密碼,然後比對資料庫中的密文。相同就表示密碼正確。當然這個其中可能會牽涉到碰撞等問題,但是基本可以不考慮。
可以參考下這個: /// <summary> /// 對密碼進行MD5加密的函式(新增鹽值:&%#@?,:* /// </summary> /// <param name="Password"></param> /// <returns></returns> public static string getEncryPassword(string Password) { string EncryedPassword = FormsAuthentication.HashPasswordForStoringInConfigFile( Password + "&%#@?$%)@%($)#_$)*", "md5"); // Or "sha1" return EncryedPassword; } /// <summary> /// 加密 /// </summary> /// <param name="strText"></param> /// <returns></returns> public static string EncryptText(String strText) { return Encrypt(strText, "&%#@?$%)@%($)#_$)*"); // return Encrypt(strText,DateTime.Now.ToString() ); } /// <summary> /// 解密 /// </summary> /// <param name="strText"></param> /// <returns></returns> public static String DecryptText(String strText) { return Decrypt(strText, "&%#@?$%)@%($)#_$)*"); // return Decrypt(strText,DateTime.Now.ToString()); } /// <summary> /// 加密函式 /// </summary> /// <param name="strText"></param> /// <param name="strEncrKey"></param> /// <returns></returns> public static String Encrypt(String strText, String strEncrKey) { Byte[] byKey = { }; Byte[] IV = { 0x01, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; try { byKey = System.Text.Encoding.UTF8.GetBytes(strEncrKey.Substring(0, 8)); DESCryptoServiceProvider des = new DESCryptoServiceProvider(); Byte[] inputByteArray = Encoding.UTF8.GetBytes(strText); MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(byKey, IV), CryptoStreamMode.Write); cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); return Convert.ToBase64String(ms.ToArray()); } catch (Exception ex) { return ex.Message; } } /// <summary> /// 解密函式 /// </summary> /// <param name="strText"></param> /// <param name="sDecrKey"></param> /// <returns></returns> public static String Decrypt(String strText, String sDecrKey) { char[] stBase = strText.ToCharArray(); for (int i = 0; i < stBase.Length; i++) { if (stBase[i] == ' ') { stBase[i] = '+'; } } strText = ""; for (int i = 0; i < stBase.Length; i++) { strText += stBase[i]; } Byte[] byKey = { }; Byte[] IV = { 0x01, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; Byte[] inputByteArray = new byte[strText.Length]; try { byKey = System.Text.Encoding.UTF8.GetBytes(sDecrKey.Substring(0, 8)); DESCryptoServiceProvider des = new DESCryptoServiceProvider(); inputByteArray = Convert.FromBase64String(strText); MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(byKey, IV), CryptoStreamMode.Write); cs.Write(inputByteArray, 0, inputByteArray.Length); cs.FlushFinalBlock(); System.Text.Encoding encoding = System.Text.Encoding.UTF8; return encoding.GetString(ms.ToArray()); } catch (Exception ex) { return ex.Message; } }