解決方案:采用MD5 不可逆哈希算法,對用戶密碼運算后再加隨機碼的加密方式進行數據庫密碼存儲,避免類似CSDN、天涯網等數據庫泄密事件。切忌數據庫密碼明文存儲!!!
1、定義獲取Md5字符串的方法
1 /// <summary> 2 /// 根據字符串獲取MD5值 3 /// </summary> 4 /// <param name="str">要轉換的字符串</param> 5 /// <returns>MD5字符串</returns> 6 public static string GetMD5(string str) 7 { 8 byte[] bytes = System.Text.Encoding.Default.GetBytes(str); 9 MD5 md5 = MD5.Create(); 10 byte[] resultBytes = md5.ComputeHash(bytes); 11 12 string md5Result = ""; 13 for (int i = 0; i < resultBytes.Length; i++) 14 { 15 md5Result += resultBytes[i].ToString("X2"); 16 } 17 return md5Result; 18 }
2、定義加密方法
1 /// <summary> 2 /// 獲取加密后的密碼,用於數據庫中存放 3 /// </summary> 4 /// <param name="txtPwd">用戶輸入的密碼</param> 5 /// <returns>加密后的密碼</returns> 6 public static string GetEncMD5(string txtPwd) 7 { 8 string strRandom; 9 10 //獲取3位隨機字母 11 Random r = new Random(); 12 strRandom = ((char)(r.Next(65, 65 + 26))).ToString() + ((char)(r.Next(65, 65 + 26))).ToString() + ((char)(r.Next(65, 65 + 26))).ToString(); 13 14 return strRandom + GetMD5(strRandom + txtPwd);//設定加密方式,也可以在此進行多次Md5加強密碼安全度 15 }
3、定義驗證方法
1 /// <summary> 2 /// 判斷密碼是否正確 3 /// </summary> 4 /// <param name="sqlPwd">數據庫中存放的密碼</param> 5 /// <param name="txtPwd">用戶輸入的密碼</param> 6 /// <returns>正確返回true</returns> 7 public static bool PwdIsRight(string sqlPwd, string txtPwd) 8 { 9 string str = sqlPwd.Substring(0, 3); 10 string tmp = str + GetMD5(str + txtPwd); 11 return sqlPwd == tmp ? true : false; 12 }
通過這種加密方式,數據庫中存放的用戶密碼就一組大於32位的字符串,並確保了即使用戶密碼相同但數據庫存入的密碼字符串也是不相同的,有效解決了反Md5窮舉法。