C#:使用MD5对用户密码加密与解密
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)), , );
- 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 = ; 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 == )
- {
- return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password, "MD5").ToLower().Substring(, );
- }
- // 32位加密
- if (codeLength == )
- {
- 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(, ), "sha1").Substring(, ));
- // 通过两次哈希密码设置算法的机密密钥
- des.IV = Encoding.ASCII.GetBytes(FormsAuthentication.HashPasswordForStoringInConfigFile
- (FormsAuthentication.HashPasswordForStoringInConfigFile(key, "md5")
- .Substring(, ), "md5").Substring(, ));
- var ms = new MemoryStream();
- var cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
- cs.Write(inputByteArray, , 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 / ;
- var inputByteArray = new byte[len];
- int x, i;
- for (x = ; x < len; x++)
- {
- i = Convert.ToInt32(targetValue.Substring(x * , ), );
- inputByteArray[x] = (byte)i;
- }
- // 通过两次哈希密码设置对称算法的初始化向量
- des.Key = Encoding.ASCII.GetBytes(FormsAuthentication.HashPasswordForStoringInConfigFile
- (FormsAuthentication.HashPasswordForStoringInConfigFile(key, "md5").
- Substring(, ), "sha1").Substring(, ));
- // 通过两次哈希密码设置算法的机密密钥
- des.IV = Encoding.ASCII.GetBytes(FormsAuthentication.HashPasswordForStoringInConfigFile
- (FormsAuthentication.HashPasswordForStoringInConfigFile(key, "md5")
- .Substring(, ), "md5").Substring(, ));
- // 定义内存流
- var ms = new MemoryStream();
- // 定义加密流
- var cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
- cs.Write(inputByteArray, , inputByteArray.Length);
- cs.FlushFinalBlock();
- return Encoding.Default.GetString(ms.ToArray());
- }
说明:本文章系Healer007原创,署名:小萝卜!部分资料来自互联网,如需转载请注明出处!
C#:使用MD5对用户密码加密与解密的更多相关文章
- 转 C#:使用MD5对用户密码加密与解密
C#中常涉及到对用户密码的加密于解密的算法,其中使用MD5加密是最常见的的实现方式.本文总结了通用的算法并结合了自己的一点小经验,分享给大家. 一.使用16位.32位.64位MD5方法对用户名加密 1 ...
- c# 对用户密码加密解密
一.使用16位.32位.64位MD5方法对用户名加密 1)16位的MD5加密 ? 1 2 3 4 5 6 7 8 9 10 11 12 /// <summary> /// 16位MD5加密 ...
- Cognos权限认证CJP方式之用户密码加密
在项目开发过程中,用户往往对系统的安全都有明确的要求,下面针对cognos门户认证用户密码如何加密来提供一个简单的wf 1Cognos权限认证方式:CJP 2Cognos用户数据库类型:Oracle ...
- Maven-009-Nexus 用户密码加密(安全必须)
信息数据大爆发的时代,我们关心什么?没错,数据安全!数据安全!数据安全!(重要事情说三遍,哈哈哈...) 之前我们存放在 maven settings.xml 文件中的 Nexus 私服用户密码都是明 ...
- jdk自带的MD5进行数据的加密与解密
package com.tools.util; import java.io.IOException; import java.io.UnsupportedEncodingException; imp ...
- 13.MD5对用户密码进行加密
MD5概述 用户名密码保存在客户端是一种十分危险的行为.所以需要进行加密后保存. 其中MD5就是一种比较常用的加密算法. 与其说MD5算法是一种加密算法,不如说是一种数据指纹(数据摘要)算法. 其特点 ...
- MD5用户密码加密工具类 MD5Util
一般记录用户密码,我们都是通过MD5加密配置的形式.这里记录一下,MD5加密的工具类. package com.mms.utils; import java.security.MessageDiges ...
- php提供的用户密码加密函数
在实际项目中,对用户的密码加密基本上采用的 md5加盐的方式, php5.5后提供了一个加密函数,不需要手动加盐,不需要去维护盐值, $str = "123456"; $pwd ...
- java工具类学习,系统中用户密码加密总结
现在项目,用户注册登录部分很少有涉及到了,原因:现在热门开发框架都已经在底层帮我们做了一套用户注册,密码加密,登录认证,权限控制,缓存数据等基本功能. 这有利于项目的快速完成,只需要搬砖码畜们专注于业 ...
随机推荐
- 《机器学习实战》学习笔记——第14章 利用SVD简化数据
一. SVD 1. 基本概念: (1)定义:提取信息的方法:奇异值分解Singular Value Decomposition(SVD) (2)优点:简化数据, 去除噪声,提高算法的结果 (3)缺点: ...
- Select查询语句2
一.模糊查询 1.语法结构 select*from table_name where column like '%context%' 在使用like运算符时如果不使用通配符“%”,则like的作用与= ...
- 从php脚本到浏览器,编码方式浅析
今天简单看了一下php,服务器,浏览器如何设定编码 1.php 在php配置文件php.ini中,可以设置字符编码 ; PHP's default character set is set to em ...
- Infobright存储引擎的特点
Infobright的优点: (1)高压缩比率 (2)快速响应复杂的分析查询语句 (3)随着数据库的逐渐增大,查询和装载性能基本保持稳定 (4)没有特殊的数据仓库模型(比如星状模型.雪花模型)要求 ( ...
- angualrjs
$rootScope是angularJS中最接近全局作用域的对象.在$rootScope上附加太多业务逻辑并不是好主意,这与污染JavaScript的全局作用域是一样的. $scope对象就是一个普通 ...
- Gossip protocol(zz)
Gossip protocol 这是一系列用于P2P的通信协议.简单来说,就是模拟人类社会中流言传播的方式.每个节点随机地把消息发给它的邻居,接到消息的节点,如果之前没收到这个消息,则会继续随机地转发 ...
- win8 下 IIS APPPOOL\DefaultAppPool 登录失败的解决方法
来源:网络 添加ASP.NET网站时,选择添加"添加应用程序"连接sql server 2005(2008)可能会报始下的错误:(说明:2005必报错,2008选报错)" ...
- three.js 之旅 (五)--跟场景scene相关的函数
1.scene.add(obj); 在场景中添加物体 2.scene.remove(obj); 在场景中移除物体 3.scene.children(); 获取场景中所有子对象的列表 4.sc ...
- php Memcache/Memcached操作手册
php Memcache/Memcached使用教程 Memcache和Memcached 其实是一个东西,只是php中要是用的扩展不一样, 2009年左右有人丰富memcache的用法和性能,编写了 ...
- Python缩进
今天练习代码的时候发现一个问题,练习类,我在notepad++上写的代码运行后,复制到pycharm上运行然后报错,看代码 #---coding:utf-8--- #定义一个Person类然后实例化 ...