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

作者:Healer007 时间:2022-11-24 23:05:23 

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

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

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(); //实例化一个md5对像
 // 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择
 byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl));
 // 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得
 for (int i = 0; i < s.Length; i++)
 {
   // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符
   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(); //实例化一个md5对像
 // 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择
 byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl));
 return Convert.ToBase64String(s);
}

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


/// <summary>
/// 加密用户密码
/// </summary>
/// <param name="password">密码</param>
/// <param name="codeLength">加密位数</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是不可逆的,所以加密之后就无法解密,取用户名和密码时候,需要再加密一边用户输入的数据与数据库中已加密的数据进行比对。如果比对结果一致,则可以判定登陆成功!代码如下所示:


/// <summary>
/// 登陆
/// </summary>
public Model.UserInfo UserLogOn(string USERID, string pwd, out string statusCode)
{
 //假设已经通过用户ID获取到UserInfo的Model对象
 Model.UserInfo model = GetModel(USERID);
 if (model != null)
 {
   if (model.PASSWORD == MD5Encrypt64(pwd))
   {
     statusCode = "登陆成功";
   }
   else {
     statusCode = “密码错误”;
   }
 }
 else
 {
   statusCode = "用户不存在!";
   model = null;
 }  
 return model;
}

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


/// <summary>
/// DES数据加密
/// </summary>
/// <param name="targetValue">目标值</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);
 // 通过两次哈希密码设置对称算法的初始化向量  
 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));
 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();
}

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


/// <summary>
/// DES数据解密
/// </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加密对象
 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;
 }
 // 通过两次哈希密码设置对称算法的初始化向量  
 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));
 // 定义内存流
 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());
}

以上内容是基于C#对用户密码使用MD5加密与解密的全部叙述,希望大家喜欢。

标签:md5,加密,解密
0
投稿

猜你喜欢

  • Android studio报错:The emulator process for AVD (xxx) was killed

    2023-09-19 02:33:23
  • android实现注册页面开发

    2023-09-09 14:37:12
  • Springboot使用redis实现接口Api限流的示例代码

    2023-11-29 02:11:05
  • springboot+zookeeper实现分布式锁的示例代码

    2022-02-05 08:48:48
  • winform开发使用通用多线程基类分享(以队列形式)

    2023-05-26 14:22:27
  • Java扑克牌速算24的方法

    2022-10-13 22:17:18
  • java为什么不建议用equals判断对象相等

    2022-07-14 17:17:39
  • android利用ContentResolver访问者获取手机短信信息

    2022-02-02 15:02:37
  • Android ActionBar完全解析使用官方推荐的最佳导航栏(下)

    2022-04-27 02:35:03
  • C#实现XML文件与DataTable、Dataset互转

    2021-06-07 04:00:27
  • android 进度条组件ProgressBar

    2023-10-20 15:05:33
  • Springboot如何根据实体类生成数据库表

    2023-11-20 13:54:39
  • springboot如何获取相对路径文件夹下静态资源的方法

    2023-07-12 06:23:09
  • C#中参数个数可变的方法实例分析

    2022-12-16 20:02:32
  • mybatis中数据加密与解密的实现

    2022-04-21 22:49:16
  • 解读@RequestBody与post请求的关系

    2022-10-07 02:02:51
  • Spring定时任务使用及如何使用邮件监控服务器

    2023-01-12 16:38:58
  • 使用springboot跳转到指定页面和(重定向,请求转发的实例)

    2021-10-21 11:09:24
  • Java设置PDF跨页表格重复显示表头行的步骤详解

    2023-09-21 23:50:33
  • Android生成带圆角的Bitmap图片

    2022-09-08 11:18:19
  • asp之家 软件编程 m.aspxhome.com