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

c# 对用户密码加密解密的更多相关文章

  1. Openfire用户密码加密解密

    需求要求审核过程中都用匿名进行用户注册登录,注册用户审核通过后才使用openfire内置表 如何做到用户密码统一 Openfire是通过org.jivesoftware.util.Blowfish.j ...

  2. openfire 用户密码加密解密

    1.openfire采用的加密方法 Blowfish.java /** * $RCSfile$ * $Revision: 3657 $ * $Date: 2002-09-09 08:31:31 -07 ...

  3. C#:使用MD5对用户密码加密与解密

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

  4. 转 C#:使用MD5对用户密码加密与解密

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

  5. Maven-009-Nexus 用户密码加密(安全必须)

    信息数据大爆发的时代,我们关心什么?没错,数据安全!数据安全!数据安全!(重要事情说三遍,哈哈哈...) 之前我们存放在 maven settings.xml 文件中的 Nexus 私服用户密码都是明 ...

  6. Cognos权限认证CJP方式之用户密码加密

    在项目开发过程中,用户往往对系统的安全都有明确的要求,下面针对cognos门户认证用户密码如何加密来提供一个简单的wf 1Cognos权限认证方式:CJP 2Cognos用户数据库类型:Oracle ...

  7. 使用bcrypt进行用户密码加密的简单实现

    Bcrypt百度百科: bcrypt,是一个跨平台的文件加密工具.由它加密的文件可在所有支持的操作系统和处理器上进行转移.它的口令必须是8至56个字符,并将在内部被转化为448位的密钥. 除了对您的数 ...

  8. Druid 数据库用户密码加密 代码实现

    druid-1.0.16.jar 阿里巴巴的开源数据连接池 jar包 明文密码+私钥(privateKey)加密=加密密码 加密密码+公钥(publicKey)解密=明文密码 程序代码如下: pack ...

  9. php提供的用户密码加密函数

    在实际项目中,对用户的密码加密基本上采用的  md5加盐的方式, php5.5后提供了一个加密函数,不需要手动加盐,不需要去维护盐值, $str = "123456"; $pwd ...

随机推荐

  1. HDU 5616 Jam's balance 背包DP

    Jam's balance Problem Description Jim has a balance and N weights. (1≤N≤20)The balance can only tell ...

  2. ES跨版本升级?——难道升级集群发生shard allocation是因为要分配replica节点???

    Full cluster restart upgrade Elasticsearch requires a full cluster restart when upgrading across maj ...

  3. nyoj--84--阶乘的0(数学技巧)

    阶乘的0 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 计算n!的十进制表示最后有多少个0 输入 第一行输入一个整数N表示测试数据的组数(1<=N<=100 ...

  4. Binary Indexed Tree

    我借鉴了这个视频中的讲解的填坑法,我认为非常易于理解.有FQ能力和基本英语听力能力请直接去看视频,并不需要继续阅读. naive 算法 考虑一个这样的场景: 给定一个int数组, 我们想知道它的连续子 ...

  5. xBIM 实战04 在WinForm窗体中实现IFC模型的加载与浏览

    系列目录    [已更新最新开发文章,点击查看详细]  WPF底层使用 DirectX 进行图形渲染.DirectX  能理解可由显卡直接渲染的高层元素,如纹理和渐变,所以 DirectX 效率更高. ...

  6. 你不知道的JavaScript(十)with关键字

    with关键字在JavaScript中不太常用,用来定义一个和对象相关的作用域,在该作用域中可以访问对象的属性或方法而前面无需加上对象名,以达到简化代码的目的. <script type=&qu ...

  7. The Structure of an App-ios应用架构-MVC

    During startup, the UIApplicationMain function sets up several key objects and starts the app runnin ...

  8. swift语言点评一

    一.变量定义 1.常量与变量 Use let to make a constant and var to make a variable. 2.类型与推测 However, you don’t alw ...

  9. Mojo For Chromium Developers

    Overview This document contains the minimum amount of information needed for a developer to start us ...

  10. [NOIP2003提高组]侦探推理

    题目:洛谷P1039.Vijos P1106.codevs1089. 题目大意:给你一系列证词,要你求出谁是凶手.具体题目见原题. 解题思路:我们枚举犯人和星期,一个一个进行判断.如果成功则记录答案, ...