基于C#對(duì)用戶(hù)密碼使用MD5加密與解密
C#中常涉及到對(duì)用戶(hù)密碼的加密于解密的算法,其中使用MD5加密是最常見(jiàn)的的實(shí)現(xiàn)方式。本文總結(jié)了通用的算法并結(jié)合了自己的一點(diǎn)小經(jīng)驗(yàn),分享給大家。
一.使用16位、32位、64位MD5方法對(duì)用戶(hù)名加密
1)16位的MD5加密
/// <summary>
/// 16位MD5加密
/// </summary>
/// <param name="password"></param>
/// <returns></returns>
public static string MD5Encrypt16(string password)
{
var md5 = new MD5CryptoServiceProvider();
string t2 = BitConverter.ToString(md5.ComputeHash(Encoding.Default.GetBytes(password)), 4, 8);
t2 = t2.Replace("-", "");
return t2;
}
2)32位的MD5加密
/// <summary>
/// 32位MD5加密
/// </summary>
/// <param name="password"></param>
/// <returns></returns>
public static string MD5Encrypt32(string password)
{
string cl = password;
string pwd = "";
MD5 md5 = MD5.Create(); //實(shí)例化一個(gè)md5對(duì)像
// 加密后是一個(gè)字節(jié)類(lèi)型的數(shù)組,這里要注意編碼UTF8/Unicode等的選擇
byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl));
// 通過(guò)使用循環(huán),將字節(jié)類(lèi)型的數(shù)組轉(zhuǎn)換為字符串,此字符串是常規(guī)字符格式化所得
for (int i = 0; i < s.Length; i++)
{
// 將得到的字符串使用十六進(jìn)制類(lèi)型格式。格式后的字符是小寫(xiě)的字母,如果使用大寫(xiě)(X)則格式后的字符是大寫(xiě)字符
pwd = pwd + s[i].ToString("X");
}
return pwd;
}
3)64位的MD5加密
public static string MD5Encrypt64(string password)
{
string cl = password;
//string pwd = "";
MD5 md5 = MD5.Create(); //實(shí)例化一個(gè)md5對(duì)像
// 加密后是一個(gè)字節(jié)類(lèi)型的數(shù)組,這里要注意編碼UTF8/Unicode等的選擇
byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl));
return Convert.ToBase64String(s);
}
4)使用MD5為用戶(hù)密碼加密
/// <summary>
/// 加密用戶(hù)密碼
/// </summary>
/// <param name="password">密碼</param>
/// <param name="codeLength">加密位數(shù)</param>
/// <returns>加密密碼</returns>
public static string md5(string password, int codeLength)
{
if (!string.IsNullOrEmpty(password))
{
// 16位MD5加密(取32位加密的9~25字符)
if (codeLength == 16)
{
return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password, "MD5").ToLower().Substring(8, 16);
}
// 32位加密
if (codeLength == 32)
{
return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password, "MD5").ToLower();
}
}
return string.Empty;
}
由于MD5是不可逆的,所以加密之后就無(wú)法解密,取用戶(hù)名和密碼時(shí)候,需要再加密一邊用戶(hù)輸入的數(shù)據(jù)與數(shù)據(jù)庫(kù)中已加密的數(shù)據(jù)進(jìn)行比對(duì)。如果比對(duì)結(jié)果一致,則可以判定登陸成功!代碼如下所示:
/// <summary>
/// 登陸
/// </summary>
public Model.UserInfo UserLogOn(string USERID, string pwd, out string statusCode)
{
//假設(shè)已經(jīng)通過(guò)用戶(hù)ID獲取到UserInfo的Model對(duì)象
Model.UserInfo model = GetModel(USERID);
if (model != null)
{
if (model.PASSWORD == MD5Encrypt64(pwd))
{
statusCode = "登陸成功";
}
else {
statusCode = “密碼錯(cuò)誤”;
}
}
else
{
statusCode = "用戶(hù)不存在!";
model = null;
}
return model;
}
5)通過(guò)DESCryptoServiceProvider對(duì)象對(duì)字符串進(jìn)行加密解密
/// <summary>
/// DES數(shù)據(jù)加密
/// </summary>
/// <param name="targetValue">目標(biāo)值</param>
/// <param name="key">密鑰</param>
/// <returns>加密值</returns>
public static string Encrypt(string targetValue, string key)
{
if (string.IsNullOrEmpty(targetValue))
{
return string.Empty;
}
var returnValue = new StringBuilder();
var des = new DESCryptoServiceProvider();
byte[] inputByteArray = Encoding.Default.GetBytes(targetValue);
// 通過(guò)兩次哈希密碼設(shè)置對(duì)稱(chēng)算法的初始化向量
des.Key = Encoding.ASCII.GetBytes(FormsAuthentication.HashPasswordForStoringInConfigFile
(FormsAuthentication.HashPasswordForStoringInConfigFile(key, "md5").
Substring(0, 8), "sha1").Substring(0, 8));
// 通過(guò)兩次哈希密碼設(shè)置算法的機(jī)密密鑰
des.IV = Encoding.ASCII.GetBytes(FormsAuthentication.HashPasswordForStoringInConfigFile
(FormsAuthentication.HashPasswordForStoringInConfigFile(key, "md5")
.Substring(0, 8), "md5").Substring(0, 8));
var ms = new MemoryStream();
var cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
foreach (byte b in ms.ToArray())
{
returnValue.AppendFormat("{0:X2}", b);
}
return returnValue.ToString();
}
此種算法可以通過(guò)加密密鑰進(jìn)行解密,解密方法如下:
/// <summary>
/// DES數(shù)據(jù)解密
/// </summary>
/// <param name="targetValue"></param>
/// <param name="key"></param>
/// <returns></returns>
public static string Decrypt(string targetValue, string key)
{
if (string.IsNullOrEmpty(targetValue))
{
return string.Empty;
}
// 定義DES加密對(duì)象
var des = new DESCryptoServiceProvider();
int len = targetValue.Length / 2;
var inputByteArray = new byte[len];
int x, i;
for (x = 0; x < len; x++)
{
i = Convert.ToInt32(targetValue.Substring(x * 2, 2), 16);
inputByteArray[x] = (byte)i;
}
// 通過(guò)兩次哈希密碼設(shè)置對(duì)稱(chēng)算法的初始化向量
des.Key = Encoding.ASCII.GetBytes(FormsAuthentication.HashPasswordForStoringInConfigFile
(FormsAuthentication.HashPasswordForStoringInConfigFile(key, "md5").
Substring(0, 8), "sha1").Substring(0, 8));
// 通過(guò)兩次哈希密碼設(shè)置算法的機(jī)密密鑰
des.IV = Encoding.ASCII.GetBytes(FormsAuthentication.HashPasswordForStoringInConfigFile
(FormsAuthentication.HashPasswordForStoringInConfigFile(key, "md5")
.Substring(0, 8), "md5").Substring(0, 8));
// 定義內(nèi)存流
var ms = new MemoryStream();
// 定義加密流
var cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
return Encoding.Default.GetString(ms.ToArray());
}
以上內(nèi)容是基于C#對(duì)用戶(hù)密碼使用MD5加密與解密的全部敘述,希望大家喜歡。
上一篇:基于C#實(shí)現(xiàn)簡(jiǎn)單的隨機(jī)抽獎(jiǎng)小程序
欄 目:C#教程
下一篇:詳解C# 托管資源和非托管資源
本文標(biāo)題:基于C#對(duì)用戶(hù)密碼使用MD5加密與解密
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/6776.html
您可能感興趣的文章
- 01-10C#實(shí)現(xiàn)判斷當(dāng)前操作用戶(hù)管理角色的方法
- 01-10C#使用Dispose模式實(shí)現(xiàn)手動(dòng)對(duì)資源的釋放
- 01-10WinForm判斷關(guān)閉事件來(lái)源于用戶(hù)點(diǎn)擊右上角“關(guān)閉”按鈕的方法
- 01-10C#實(shí)現(xiàn)獲取不同對(duì)象中名稱(chēng)相同屬性的方法
- 01-10基于C#實(shí)現(xiàn)簡(jiǎn)單離線注冊(cè)碼生成與驗(yàn)證
- 01-10C#基于UDP實(shí)現(xiàn)的P2P語(yǔ)音聊天工具
- 01-10C#實(shí)現(xiàn)基于加減按鈕形式控制系統(tǒng)音量及靜音的方法
- 01-10C#編程自學(xué)之類(lèi)和對(duì)象
- 01-10C#編程和Visual Studio使用技巧(上)
- 01-10C#語(yǔ)句先后順序?qū)Τ绦虻慕Y(jié)果有影響嗎


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10C#通過(guò)反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁(yè)無(wú)法打開(kāi)的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過(guò)重寫(xiě)Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 04-02jquery與jsp,用jquery
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置


