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

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

1)16位的MD5加密

  1. /// <summary>
  2. /// 16位MD5加密
  3. /// </summary>
  4. /// <param name="password"></param>
  5. /// <returns></returns>
  6. public static string MD5Encrypt16(string password)
  7. {
  8. var md5 = new MD5CryptoServiceProvider();
  9. string t2 = BitConverter.ToString(md5.ComputeHash(Encoding.Default.GetBytes(password)), , );
  10. t2 = t2.Replace("-", "");
  11. return t2;
  12. }

2)32位的MD5加密

  1. /// <summary>
  2. /// 32位MD5加密
  3. /// </summary>
  4. /// <param name="password"></param>
  5. /// <returns></returns>
  6. public static string MD5Encrypt32(string password)
  7. {
  8. string cl = password;
  9. string pwd = "";
  10. MD5 md5 = MD5.Create(); //实例化一个md5对像
  11. // 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择 
  12. byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl));
  13. // 通过使用循环,将字节类型的数组转换为字符串,此字符串是常规字符格式化所得
  14. for (int i = ; i < s.Length; i++)
  15. {
  16. // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母,如果使用大写(X)则格式后的字符是大写字符
  17. pwd = pwd + s[i].ToString("X");
  18. }
  19. return pwd;
  20. }

3)64位的MD5加密

  1. public static string MD5Encrypt64(string password)
  2. {
  3. string cl = password;
  4. //string pwd = "";
  5. MD5 md5 = MD5.Create(); //实例化一个md5对像
  6. // 加密后是一个字节类型的数组,这里要注意编码UTF8/Unicode等的选择 
  7. byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl));
  8. return Convert.ToBase64String(s);
  9. }

4)使用MD5为用户密码加密

  1. /// <summary>
  2. /// 加密用户密码
  3. /// </summary>
  4. /// <param name="password">密码</param>
  5. /// <param name="codeLength">加密位数</param>
  6. /// <returns>加密密码</returns>
  7. public static string md5(string password, int codeLength)
  8. {
  9. if (!string.IsNullOrEmpty(password))
  10. {
  11. // 16位MD5加密(取32位加密的9~25字符)
  12. if (codeLength == )
  13. {
  14. return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password, "MD5").ToLower().Substring(, );
  15. }
  16.  
  17. // 32位加密
  18. if (codeLength == )
  19. {
  20. return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password, "MD5").ToLower();
  21. }
  22. }
  23. return string.Empty;
  24. }

      由于MD5是不可逆的,所以加密之后就无法解密,取用户名和密码时候,需要再加密一边用户输入的数据与数据库中已加密的数据进行比对。如果比对结果一致,则可以判定登陆成功!代码如下所示:

  1. /// <summary>
  2. /// 登陆
  3. /// </summary>
  4. public Model.UserInfo UserLogOn(string USERID, string pwd, out string statusCode)
  5. {
  6. //假设已经通过用户ID获取到UserInfo的Model对象
  7. Model.UserInfo model = GetModel(USERID);
  8. if (model != null)
  9. {
  10. if (model.PASSWORD == MD5Encrypt64(pwd))
  11. {
  12. statusCode = "登陆成功";
  13. }
  14. else {
  15. statusCode = “密码错误”;
  16. }
  17. }
  18. else
  19. {
  20. statusCode = "用户不存在!";
  21. model = null;
  22. }
  23. return model;
  24. }

5)通过DESCryptoServiceProvider对象对字符串进行加密解密

  1. /// <summary>
  2. /// DES数据加密
  3. /// </summary>
  4. /// <param name="targetValue">目标值</param>
  5. /// <param name="key">密钥</param>
  6. /// <returns>加密值</returns>
  7. public static string Encrypt(string targetValue, string key)
  8. {
  9. if (string.IsNullOrEmpty(targetValue))
  10. {
  11. return string.Empty;
  12. }
  13.  
  14. var returnValue = new StringBuilder();
  15. var des = new DESCryptoServiceProvider();
  16. byte[] inputByteArray = Encoding.Default.GetBytes(targetValue);
  17. // 通过两次哈希密码设置对称算法的初始化向量
  18. des.Key = Encoding.ASCII.GetBytes(FormsAuthentication.HashPasswordForStoringInConfigFile
  19. (FormsAuthentication.HashPasswordForStoringInConfigFile(key, "md5").
  20. Substring(, ), "sha1").Substring(, ));
  21. // 通过两次哈希密码设置算法的机密密钥
  22. des.IV = Encoding.ASCII.GetBytes(FormsAuthentication.HashPasswordForStoringInConfigFile
  23. (FormsAuthentication.HashPasswordForStoringInConfigFile(key, "md5")
  24. .Substring(, ), "md5").Substring(, ));
  25. var ms = new MemoryStream();
  26. var cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
  27. cs.Write(inputByteArray, , inputByteArray.Length);
  28. cs.FlushFinalBlock();
  29. foreach (byte b in ms.ToArray())
  30. {
  31. returnValue.AppendFormat("{0:X2}", b);
  32. }
  33. return returnValue.ToString();
  34. }

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

  1. /// <summary>
  2. /// DES数据解密
  3. /// </summary>
  4. /// <param name="targetValue"></param>
  5. /// <param name="key"></param>
  6. /// <returns></returns>
  7. public static string Decrypt(string targetValue, string key)
  8. {
  9. if (string.IsNullOrEmpty(targetValue))
  10. {
  11. return string.Empty;
  12. }
  13. // 定义DES加密对象
  14. var des = new DESCryptoServiceProvider();
  15. int len = targetValue.Length / ;
  16. var inputByteArray = new byte[len];
  17. int x, i;
  18. for (x = ; x < len; x++)
  19. {
  20. i = Convert.ToInt32(targetValue.Substring(x * , ), );
  21. inputByteArray[x] = (byte)i;
  22. }
  23. // 通过两次哈希密码设置对称算法的初始化向量
  24. des.Key = Encoding.ASCII.GetBytes(FormsAuthentication.HashPasswordForStoringInConfigFile
  25. (FormsAuthentication.HashPasswordForStoringInConfigFile(key, "md5").
  26. Substring(, ), "sha1").Substring(, ));
  27. // 通过两次哈希密码设置算法的机密密钥
  28. des.IV = Encoding.ASCII.GetBytes(FormsAuthentication.HashPasswordForStoringInConfigFile
  29. (FormsAuthentication.HashPasswordForStoringInConfigFile(key, "md5")
  30. .Substring(, ), "md5").Substring(, ));
  31. // 定义内存流
  32. var ms = new MemoryStream();
  33. // 定义加密流
  34. var cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
  35. cs.Write(inputByteArray, , inputByteArray.Length);
  36. cs.FlushFinalBlock();
  37. return Encoding.Default.GetString(ms.ToArray());
  38. }

说明:本文章系Healer007原创,署名:小萝卜!部分资料来自互联网,如需转载请注明出处!

C#:使用MD5对用户密码加密与解密的更多相关文章

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

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

  2. c# 对用户密码加密解密

    一.使用16位.32位.64位MD5方法对用户名加密 1)16位的MD5加密 ? 1 2 3 4 5 6 7 8 9 10 11 12 /// <summary> /// 16位MD5加密 ...

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

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

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

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

  5. jdk自带的MD5进行数据的加密与解密

    package com.tools.util; import java.io.IOException; import java.io.UnsupportedEncodingException; imp ...

  6. 13.MD5对用户密码进行加密

    MD5概述 用户名密码保存在客户端是一种十分危险的行为.所以需要进行加密后保存. 其中MD5就是一种比较常用的加密算法. 与其说MD5算法是一种加密算法,不如说是一种数据指纹(数据摘要)算法. 其特点 ...

  7. MD5用户密码加密工具类 MD5Util

    一般记录用户密码,我们都是通过MD5加密配置的形式.这里记录一下,MD5加密的工具类. package com.mms.utils; import java.security.MessageDiges ...

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

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

  9. java工具类学习,系统中用户密码加密总结

    现在项目,用户注册登录部分很少有涉及到了,原因:现在热门开发框架都已经在底层帮我们做了一套用户注册,密码加密,登录认证,权限控制,缓存数据等基本功能. 这有利于项目的快速完成,只需要搬砖码畜们专注于业 ...

随机推荐

  1. 《机器学习实战》学习笔记——第14章 利用SVD简化数据

    一. SVD 1. 基本概念: (1)定义:提取信息的方法:奇异值分解Singular Value Decomposition(SVD) (2)优点:简化数据, 去除噪声,提高算法的结果 (3)缺点: ...

  2. Select查询语句2

    一.模糊查询 1.语法结构 select*from table_name where column like '%context%' 在使用like运算符时如果不使用通配符“%”,则like的作用与= ...

  3. 从php脚本到浏览器,编码方式浅析

    今天简单看了一下php,服务器,浏览器如何设定编码 1.php 在php配置文件php.ini中,可以设置字符编码 ; PHP's default character set is set to em ...

  4. Infobright存储引擎的特点

    Infobright的优点: (1)高压缩比率 (2)快速响应复杂的分析查询语句 (3)随着数据库的逐渐增大,查询和装载性能基本保持稳定 (4)没有特殊的数据仓库模型(比如星状模型.雪花模型)要求 ( ...

  5. angualrjs

    $rootScope是angularJS中最接近全局作用域的对象.在$rootScope上附加太多业务逻辑并不是好主意,这与污染JavaScript的全局作用域是一样的. $scope对象就是一个普通 ...

  6. Gossip protocol(zz)

    Gossip protocol 这是一系列用于P2P的通信协议.简单来说,就是模拟人类社会中流言传播的方式.每个节点随机地把消息发给它的邻居,接到消息的节点,如果之前没收到这个消息,则会继续随机地转发 ...

  7. win8 下 IIS APPPOOL\DefaultAppPool 登录失败的解决方法

    来源:网络 添加ASP.NET网站时,选择添加"添加应用程序"连接sql server 2005(2008)可能会报始下的错误:(说明:2005必报错,2008选报错)" ...

  8. three.js 之旅 (五)--跟场景scene相关的函数

    1.scene.add(obj);   在场景中添加物体 2.scene.remove(obj);   在场景中移除物体 3.scene.children();  获取场景中所有子对象的列表 4.sc ...

  9. php Memcache/Memcached操作手册

    php Memcache/Memcached使用教程 Memcache和Memcached 其实是一个东西,只是php中要是用的扩展不一样, 2009年左右有人丰富memcache的用法和性能,编写了 ...

  10. Python缩进

    今天练习代码的时候发现一个问题,练习类,我在notepad++上写的代码运行后,复制到pycharm上运行然后报错,看代码 #---coding:utf-8--- #定义一个Person类然后实例化 ...