C#:使用MD5对用户密码加密与解密

王朝学院·作者佚名  2016-08-28
窄屏简体版  字體: 小  |  中  |  大  |  超大  

C#中常涉及到对用户密码的加密于解密的算法,其中使用md5加密是最常见的的实现方式。本文总结了通用的算法并结合了自己的一点小经验,分享给大家。

一.使用16位、32位、64位MD5方法对用户名加密

1)16位的MD5加密

///<summary>///16位MD5加密///</summary>///<param name="passWord"></param>///<returns></returns>publicstaticstringMD5Encrypt16(stringpassword)

{varmd5 =newMD5CryptoServicePRovider();stringt2 = BitConverter.ToString(md5.ComputeHash(Encoding.Default.GetBytes(password)),4,8);

t2= t2.Replace("-","");returnt2;

}

2)32位的MD5加密

///<summary>///32位MD5加密///</summary>///<param name="password"></param>///<returns></returns>publicstaticstringMD5Encrypt32(stringpassword)

{stringcl =password;stringpwd ="";

MD5 md5= MD5.Create();//实例化一个md5对像//加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择byte[] s =md5.ComputeHash(Encoding.UTF8.GetBytes(cl));//通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得for(inti =0; i < s.Length; i++)

{//将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符pwd = pwd + s[i].ToString("X");

}returnpwd;

}

3)64位的MD5加密

publicstaticstringMD5Encrypt64(stringpassword)

{stringcl =password;//string pwd = "";MD5 md5 = MD5.Create();//实例化一个md5对像//加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择byte[] s =md5.ComputeHash(Encoding.UTF8.GetBytes(cl));returnConvert.ToBase64String(s);

}

4)使用MD5为用户密码加密

///<summary>///加密用户密码///</summary>///<param name="password">密码</param>///<param name="codeLength">加密位数</param>///<returns>加密密码</returns>publicstaticstringmd5(stringpassword,intcodeLength)

{if(!string.IsNullOrEmpty(password))

{//16位MD5加密(取32位加密的9~25字符)if(codeLength ==16)

{returnSystem.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password,"MD5").ToLower().Substring(8,16);

}//32位加密if(codeLength ==32)

{returnSystem.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password,"MD5").ToLower();

}

}returnstring.Empty;

}

由于MD5是不可逆的,所以加密之后就无法解密,取用户名和密码时候,需要再加密一边用户输入的数据与数据库中已加密的数据进行比对。如果比对结果一致,则可以判定登陆成功!代码如下所示:

///<summary>///登陆///</summary>publicModel.UserInfo UserLogOn(stringUSERID,stringpwd,outstringstatusCode)

{//假设已经通过用户ID获取到UserInfo的Model对象Model.UserInfo model =GetModel(USERID);if(model !=null)

{if(model.PASSWORD ==MD5Encrypt64(pwd))

{

statusCode="登陆成功";

}else{

statusCode=“密码错误”;

}

}else{

statusCode="用户不存在!";

model=null;

}returnmodel;

}

5)通过DESCryptoServiceProvider对象对字符串进行加密解密

///<summary>///DES数据加密///</summary>///<param name="targetValue">目标值</param>///<param name="key">密钥</param>///<returns>加密值</returns>publicstaticstringEncrypt(stringtargetValue,stringkey)

{if(string.IsNullOrEmpty(targetValue))

{returnstring.Empty;

}varreturnValue =newStringBuilder();vardes =newDESCryptoServiceProvider();byte[] inputByteArray =Encoding.Default.GetBytes(targetValue);//通过两次哈希密码设置对称算法的初始化向量des.Key =Encoding.ASCII.GetBytes(FormsAuthentication.HashPasswordForStoringInConfigFile

(FormsAuthentication.HashPasswordForStoringInConfigFile(key,"md5").

Substring(0,8),"sha1").Substring(0,8));//通过两次哈希密码设置算法的机密密钥des.IV =Encoding.ASCII.GetBytes(FormsAuthentication.HashPasswordForStoringInConfigFile

(FormsAuthentication.HashPasswordForStoringInConfigFile(key,"md5")

.Substring(0,8),"md5").Substring(0,8));varms =newMemoryStream();varcs =newCryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);

cs.Write(inputByteArray,0, inputByteArray.Length);

cs.FlushFinalBlock();foreach(bytebinms.ToArray())

{

returnValue.AppendFormat("{0:X2}", b);

}returnreturnValue.ToString();

}

此种算法可以通过加密密钥进行解密,解密方法如下:

///<summary>///DES数据解密///</summary>///<param name="targetValue"></param>///<param name="key"></param>///<returns></returns>publicstaticstringDecrypt(stringtargetValue,stringkey)

{if(string.IsNullOrEmpty(targetValue))

{returnstring.Empty;

}//定义DES加密对象vardes =newDESCryptoServiceProvider();intlen = targetValue.Length /2;varinputByteArray =newbyte[len];intx, i;for(x =0; x < len; x++)

{

i= Convert.ToInt32(targetValue.Substring(x *2,2),16);

inputByteArray[x]= (byte)i;

}//通过两次哈希密码设置对称算法的初始化向量des.Key =Encoding.ASCII.GetBytes(FormsAuthentication.HashPasswordForStoringInConfigFile

(FormsAuthentication.HashPasswordForStoringInConfigFile(key,"md5").

Substring(0,8),"sha1").Substring(0,8));//通过两次哈希密码设置算法的机密密钥des.IV =Encoding.ASCII.GetBytes(FormsAuthentication.HashPasswordForStoringInConfigFile

(FormsAuthentication.HashPasswordForStoringInConfigFile(key,"md5")

.Substring(0,8),"md5").Substring(0,8));//定义内存流varms =newMemoryStream();//定义加密流varcs =newCryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);

cs.Write(inputByteArray,0, inputByteArray.Length);

cs.FlushFinalBlock();returnEncoding.Default.GetString(ms.ToArray());

}

说明:本文章系Healer007原创,署名:小萝卜!部分资料来自互联网,如需转载请注明出处!

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航