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

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

  • 相关阅读:
    Spring Boot (20) 拦截器
    Spring Boot (19) servlet、filter、listener
    Spring Boot (18) @Async异步
    Spring Boot (17) 发送邮件
    Spring Boot (16) logback和access日志
    Spring Boot (15) pom.xml设置
    Spring Boot (14) 数据源配置原理
    Spring Boot (13) druid监控
    Spring boot (12) tomcat jdbc连接池
    Spring Boot (11) mybatis 关联映射
  • 原文地址:https://www.cnblogs.com/yachao1120/p/6559140.html
Copyright © 2011-2022 走看看