使用MD5对用户密码加密与解密
MD5简介 :
MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明,经MD2、MD3和MD4发展而来。MD5将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法。换句话说就是,即使你看到源程序和算法描述,也无法将一个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)), 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());
}
以下是通过Unity实现的一个简单实例:
using UnityEngine;
using System;
using UnityEditor;
using System.Text;
using System.Collections;
using System.Security.Cryptography;public class MD5Algorithm {static string password = "12345678";/// <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;}/// <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;}//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);}[MenuItem("MD5/16位MD5加密")]static void MD5of16Bytes(){string pw = MD5Encrypt16(password);Debug.Log("MD5-16Bytes : " + pw);}[MenuItem("MD5/32位MD5加密")]static void MD5of32Bytes(){string pw = MD5Encrypt32(password);Debug.Log("MD5-32Bytes : " + pw);}[MenuItem("MD5/64位MD5加密")]static void MD5of64Bytes(){string pw = MD5Encrypt64(password);Debug.Log("MD5-64Bytes : " + pw);}}
运行结果如下:
使用MD5对用户密码加密与解密相关推荐
- C#中使用MD5对用户密码加密与解密
C#中常涉及到对用户密码的加密于解密的算法,其中使用MD5加密是最常见的的实现方式.本文总结了通用的算法并结合了自己的一点小经验,分享给大家. 一.使用16位.32位.64位MD5方法对用户名加密 1 ...
- 新增用户-用户密码加密-无解密
新增用户-用户密码加密 加密方式 需求 做法 加密方式 加密方式有多种,如1加密后可解密得到原文得.2加密后无解密方式,只能通过加密密文比对得.本文采取得就是第2种无解密方式加密 需求 springb ...
- 用户密码加密存储十问十答,一文说透密码安全存储
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者 | 程序员赵鑫 来源 | cnblogs.com/xinzh ...
- [转]常见的用户密码加密方式以及破解方法
[作者]张辉,就职于携程技术中心信息安全部,负责安全产品的设计与研发. 作为互联网公司的信息安全从业人员经常要处理撞库扫号事件,产生撞库扫号的根本原因是一些企业发生了信息泄露事件,且这些泄露数据未加密 ...
- MD5之C#密码加密-备忘录
MD5算法说明: 加密算法都是对字节数组或流进行加密的.MD5的算法则是对原始的字节数组随机(有算法的随机)抽取几个字节,经过运算后返回新的字节(加密以后的字节).它不 仅可以对字符串进行加密,也可 ...
- python - 密码加密与解密
Python之密码加密与解密 - 对称算法 一.对称加密 1.1 安装第三方库 - PyCrypto 1.2 加密实现 二.非对称加密 三.摘要算法 3.1 md5加密 3.2 sha1加密 3.3 ...
- 5.3使用凯撒密码加密和解密英文文件python
1本关任务:使用凯撒密码加密和解密英文文件.具体要求如下: (1)接收一个字符串为参数,如果参数值为加密,要求用户输入一个要加密的文件名,再输入一个单词做为密钥发生器,用于计算偏移量,对文件中的内容进 ...
- Edusoho修改注册的用户密码加密机制规则
一.简介 1.修改生成$salt的机制规则. 2.修改生成$password的机制规则. 二.edusoho的默认用户密码加密机制规则 1.系统默认生成$salt的方式: edusoho\src\Bi ...
- 详解密码学中几种常见密码加密与解密
目录 题目 凯撒加密法 代码实现 维吉尼亚密码 栅栏密码 矩阵置换密码 点击直接资料领取 题目 11.已知明文:MEET ME AFITER THE TOGO PARTY,分别用以下方法加密,写出加密 ...
最新文章
- Qt Creator 常用快捷键
- 成功解决pandas读取文件中不读取第一索引列
- 如何处理SAP Fiori Launchpad KPI tile点击后出现的错误消息
- python学习笔记(十 三)、网络编程
- 漫步数学分析十七——连续映射上的运算
- windows10安装Visual Studio 2017
- GitHub热榜第四!这套Python机器学习课,免费获取还易吸收 | 资源
- Discuz修改笔记-Discuz代码的使用
- Oracle教程之管理UNDO(九)--如何解决Oracle ORA-01555错误
- 购物车代码(html+css)
- Devcpp(Dev-C++)代码编辑的快捷键
- 面向佩戴口罩的人脸识别系统
- UE4.26 水插件参数介绍
- 黑群DS3617xs 6.2.3套件中心无法添加第三方源/添加第三方源失败解决方案/群晖套件中心无效的位置解决
- 腾龙视觉设计学院孙姣老师讲pscs6艺术照片课录屏
- 外卖行业现状分析_2018年中国在线外卖行业市场现状及发展趋势分析 产品本地差异化细分或将为破局点...
- 今晚7:30 | 结构化知识的统一建模和多任务学习
- R countcolors包:像素级分析处理图片
- 00.敏捷项目管理——前序笔记
- CAT实时监控预警系统
热门文章
- 单链表实现图书管理系统(销售系统,马踏棋盘)
- [附源码]java毕业设计小区物业管理系统论文
- SQL-Server的链接服务器的应用
- Sixth week blog2
- 基于LQR的倒立摆控制——python代码——dlqr步骤推导
- Python实例003:海龟绘图——小猪佩奇祝大家“2019新春快乐”
- 【LaTex】LaTex 极简安装教程
- 大数据基础(一)openmpi,mpich,mpi4py在ubuntu 16.04下的安装指南
- 计算机 何志东 论文,2017年湘潭教学论文评比结果.doc
- 传奇怎么修改服务器启动天数,传奇服务端加入有天数会员系统方法