解决方案:采用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穷举法。