zoukankan      html  css  js  c++  java
  • C#对用户密码使用MD5加密与解密

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

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

    1)16位的MD5加密

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /// <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加密

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    /// <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加密

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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为用户密码加密

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    /// <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是不可逆的,所以加密之后就无法解密,取用户名和密码时候,需要再加密一边用户输入的数据与数据库中已加密的数据进行比对。如果比对结果一致,则可以判定登陆成功!代码如下所示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    /// <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对象对字符串进行加密解密

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    /// <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();
    }

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    /// <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加密与解密的全部叙述,希望大家喜欢。

  • 相关阅读:
    同一个IIS绑定多个Htts 站点问题
    开发小程序心得
    在阿里云里申请免费Https证书SSL
    request:fail 小程序要求的 TLS 版本必须大于等于 1.2
    js封装Cookie操作
    数据库日志文件(databasename_log.ldf)太大 如何清除
    sql with(lock) 与事务
    java.lang.VerifyError: com/google/android/gms/measurement/internal/zzw
    Eclipse 导入 Android studio Exception Ljava/lang/UnsatisfiedLinkEror
    Eclipse工程 导入 Android Studio
  • 原文地址:https://www.cnblogs.com/wanzhongjun/p/6583180.html
Copyright © 2011-2022 走看看