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

 更新时间:2015年12月21日 10:29:41   作者:Healer007  
C#中常涉及到对用户密码的加密于解密的算法,其中使用MD5加密是最常见的的实现方式。本文总结了通用的算法并结合了自己的一点小经验,分享给大家

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加密与解密的全部叙述,希望大家喜欢。

相关文章

  • 使用C#实现简单的线性回归的代码详解

    使用C#实现简单的线性回归的代码详解

    最近注意到了NumSharp,想学习一下,最好的学习方式就是去实践,因此从github上找了一个用python实现的简单线性回归代码,然后基于NumSharp用C#进行了改写,需要的朋友可以参考下
    2024-01-01
  • jQuery uploadify在谷歌和火狐浏览器上传失败的解决方案

    jQuery uploadify在谷歌和火狐浏览器上传失败的解决方案

    jquery.uploadify插件是一个基于jquery来实现上传的,这个插件很好用,每一次向后台发送数据流请求时,ie会自动把本地cookie存储捆绑在一起发送给服务器。但firefox、chrome不会这样做,他们会认为这样不安全,下面介绍下jQuery uploadify上传失败的解决方案
    2015-08-08
  • C#/VB.NET实现创建PDF/UA文件的示例代码

    C#/VB.NET实现创建PDF/UA文件的示例代码

    PDF/UA,即Universally Accessible PDF,该格式的PDF文件是于2012年8月以ISO标准14289-1发布的、具有普遍可访问的PDF文档标准。本文将用C#实现DF/UA文件的创建,需要的可以参考一下
    2022-08-08
  • MVC设定默认路由为指定的Area下的某个action

    MVC设定默认路由为指定的Area下的某个action

    今天小编就为大家分享一篇关于MVC设定默认路由为指定的Area下的某个action,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • C#利用ScriptControl动态执行JS和VBS脚本

    C#利用ScriptControl动态执行JS和VBS脚本

    C#中利用ScriptControl动态执行JS和VBS脚本的实现方法,需要的朋友可以参考下
    2013-04-04
  • 深入理解C#委托delegate的使用

    深入理解C#委托delegate的使用

    本文主要介绍了C#委托delegate的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • C#调用带结构体指针Dll的方法

    C#调用带结构体指针Dll的方法

    在C#到底该如何安全的调用这样的DLL接口函数呢?本文将详细介绍如何调用各种参数的方法,对C#结构体指针DLL相关知识感兴趣的朋友一起看看吧
    2021-07-07
  • C# 邮件发送和接收实现代码

    C# 邮件发送和接收实现代码

    这两个方法很容易理解,只实现了最基本的功能,如果需要可以查看源代码获取更多信息。
    2009-07-07
  • 将文件夹下所有文件输出到日志文件中 c#递归算法学习示例

    将文件夹下所有文件输出到日志文件中 c#递归算法学习示例

    这篇文章主要介绍了将文件夹下所有文件输出到日志文件中,通过这个示例我们学习一下递归算法的使用方法
    2014-01-01
  • C#中File静态类对文件的读取写入

    C#中File静态类对文件的读取写入

    这篇文章介绍了C#中File静态类对文件的读取写入,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05

最新评论