欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-07-06 12:46:01
c#中常涉及到对用户密码的加密于解密的算法,其中使用md5加密是最常见的的实现方式。本文总结了通用的算法并结合了自己的一点小经验,分享给大家。 一.使用16位、32位...

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