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对用户密码加密与解密相关推荐

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

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

  2. 新增用户-用户密码加密-无解密

    新增用户-用户密码加密 加密方式 需求 做法 加密方式 加密方式有多种,如1加密后可解密得到原文得.2加密后无解密方式,只能通过加密密文比对得.本文采取得就是第2种无解密方式加密 需求 springb ...

  3. 用户密码加密存储十问十答,一文说透密码安全存储

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者 | 程序员赵鑫 来源 | cnblogs.com/xinzh ...

  4. [转]常见的用户密码加密方式以及破解方法

    [作者]张辉,就职于携程技术中心信息安全部,负责安全产品的设计与研发. 作为互联网公司的信息安全从业人员经常要处理撞库扫号事件,产生撞库扫号的根本原因是一些企业发生了信息泄露事件,且这些泄露数据未加密 ...

  5. MD5之C#密码加密-备忘录

    MD5算法说明:  加密算法都是对字节数组或流进行加密的.MD5的算法则是对原始的字节数组随机(有算法的随机)抽取几个字节,经过运算后返回新的字节(加密以后的字节).它不 仅可以对字符串进行加密,也可 ...

  6. python - 密码加密与解密

    Python之密码加密与解密 - 对称算法 一.对称加密 1.1 安装第三方库 - PyCrypto 1.2 加密实现 二.非对称加密 三.摘要算法 3.1 md5加密 3.2 sha1加密 3.3 ...

  7. 5.3使用凯撒密码加密和解密英文文件python

    1本关任务:使用凯撒密码加密和解密英文文件.具体要求如下: (1)接收一个字符串为参数,如果参数值为加密,要求用户输入一个要加密的文件名,再输入一个单词做为密钥发生器,用于计算偏移量,对文件中的内容进 ...

  8. Edusoho修改注册的用户密码加密机制规则

    一.简介 1.修改生成$salt的机制规则. 2.修改生成$password的机制规则. 二.edusoho的默认用户密码加密机制规则 1.系统默认生成$salt的方式: edusoho\src\Bi ...

  9. 详解密码学中几种常见密码加密与解密

    目录 题目 凯撒加密法 代码实现 维吉尼亚密码 栅栏密码 矩阵置换密码 点击直接资料领取 题目 11.已知明文:MEET ME AFITER THE TOGO PARTY,分别用以下方法加密,写出加密 ...

最新文章

  1. Qt Creator 常用快捷键
  2. 成功解决pandas读取文件中不读取第一索引列
  3. 如何处理SAP Fiori Launchpad KPI tile点击后出现的错误消息
  4. python学习笔记(十 三)、网络编程
  5. 漫步数学分析十七——连续映射上的运算
  6. windows10安装Visual Studio 2017
  7. GitHub热榜第四!这套Python机器学习课,免费获取还易吸收 | 资源
  8. Discuz修改笔记-Discuz代码的使用
  9. Oracle教程之管理UNDO(九)--如何解决Oracle ORA-01555错误
  10. 购物车代码(html+css)
  11. Devcpp(Dev-C++)代码编辑的快捷键
  12. 面向佩戴口罩的人脸识别系统
  13. UE4.26 水插件参数介绍
  14. 黑群DS3617xs 6.2.3套件中心无法添加第三方源/添加第三方源失败解决方案/群晖套件中心无效的位置解决
  15. 腾龙视觉设计学院孙姣老师讲pscs6艺术照片课录屏
  16. 外卖行业现状分析_2018年中国在线外卖行业市场现状及发展趋势分析 产品本地差异化细分或将为破局点...
  17. 今晚7:30 | 结构化知识的统一建模和多任务学习
  18. R countcolors包:像素级分析处理图片
  19. 00.敏捷项目管理——前序笔记
  20. CAT实时监控预警系统

热门文章

  1. 单链表实现图书管理系统(销售系统,马踏棋盘)
  2. [附源码]java毕业设计小区物业管理系统论文
  3. SQL-Server的链接服务器的应用
  4. Sixth week blog2
  5. 基于LQR的倒立摆控制——python代码——dlqr步骤推导
  6. Python实例003:海龟绘图——小猪佩奇祝大家“2019新春快乐”
  7. 【LaTex】LaTex 极简安装教程
  8. 大数据基础(一)openmpi,mpich,mpi4py在ubuntu 16.04下的安装指南
  9. 计算机 何志东 论文,2017年湘潭教学论文评比结果.doc
  10. 传奇怎么修改服务器启动天数,传奇服务端加入有天数会员系统方法