MD5作为一种散列算法,广泛用于密码传输过程中的“加密”(引号的意思是这并不是真正的加密,而是形成密码的散列值)过程。MD顾名思义Message Digest(报文摘要),可以将输入的密码,一般来说为一个字符串,进行HASH(这里简称为加密,其实是报文摘要),并且这个HASH值是单向的,理论上说是不能反向破解(“解密”)的,当然个别网站通过搜集大家简单的字符串输入形成所谓的“数据字典”,然后根据大家习惯,进行破解,这个其实就是统计形成的结果,通过比对实现,与MD5算法的理论基础没有太大的关系。最近几年,王小云教授在研究MD5算法的破解,并且通过一些算法给出破解的方法,也只是理论上的,但仅仅局限于简单的字符串。所以,目前来说,MD5的算法还是单向的,不可逆推。具体大家可以参考博文:http://www.williamlong.info/archives/1882.html

  一般来说,对于未经处理的密码传输,“黑客”有两种方式获得你的密码,一种是传输拦截,一种是攻击服务器,不管哪种都能获取指定用户的密码。通过MD5算法HASH后,即使黑客截取了用户的密码,也不能破解(HASH单向)。另外,大家会纠结一个问题,既然MD5算法不能反向破解,也就不能验证(假设成立),对于密码HASH来说还有什么作用呢?用户登录账户一般来说是通过和服务器比对账户和密码来决定是否具有权限登录的,密码HASH值保存在服务器数据库,下次用户再次输入密码就进行HASH值比对就行了。

  这样就遇到一个问题,万一用户的密码丢失了,用户岂不是找不回原来的密码?是的,这时候一般的网站做法是用别的途径进行身份验证(例如:手机号等),然后进行密码重置。那为什么网站会提示新密码不能和原密码相同,其实这也就是进行密码HASH值比对的结果。

  需要说明的是,MD5算法,更多的用处是形成报文摘要,经私钥加密后进行数字签名,这个是公钥加密体系中的内容,感兴趣也可以了解一下。

  以下是MD5算法在.NET平台下的实现:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text; namespace MD5Encrypted
{
class Program
{
static void Main(string[] args)
{
//加密123
//MD5网站上给出的加密结果:202cb962ac59075b964b07152d234b70
string s = GetMD5("");
Console.WriteLine("123MD5加密值:" + s);
Console.ReadKey();
}
public static string GetMD5(string str)
{
//创建MD5对象
MD5 md5 = MD5.Create(); //开始加密 //需要将字符串转换成字节数组
byte[] buffer = Encoding.UTF8.GetBytes(str); //返回一个加密好的字节数组
byte[] MD5Buffer= md5.ComputeHash(buffer); /*字节数组装换成字符串的三种格式
将字节数组中的而每个元素按照指定的编码格式解析成字符串
* 直接将数组toString(); 189 123 645--- 我爱你
* 将字节数组中的每个元素toString() .
*
*/ //将字节数组转换成字符串
//return Encoding.UTF8.GetString(MD5Buffer); string strNew = "";
for (int i = ; i < MD5Buffer.Length; i++)
{
strNew += MD5Buffer[i].ToString("x2"); //将十进制字符串转换成16进制
}
return strNew;
}
}
}

关于以上的代码需要解释的几个地方:

1、关于字节数组转换成字符串在MD5算法实现过程中会引起的问题。

  因为如代码中所说字节数组转换成字符串一般有三种形式。然而对于在计算机中存储的都是二进制,对于一串二进制数可以表示一串汉字、一串英文字符等,那么字节数组的每个字节的解释就会不一样,所以这时候要注意。

2、strNew += MD5Buffer[i].ToString("x2");对于该句,toString的用法大家可以查一下API。其中的“x”表示16进制。其中“x”和“x2”的区别就在于,对于0x01,“x”解释出来的是0x1;而“x2”解释出来的是0x01;  

  ToString("X2") 为C#中的字符串格式控制符

  X为     十六进制
  2为     每次都是两位数

  比如   0x0A ,若没有2,就只会输出0xA 
  假设有两个数10和26,正常情况十六进制显示0xA、0x1A,这样看起来不整齐,为了好看,可以指定"X2",这样显示出来就是:0x0A、0x1A。 
  参考网址:http://www.cnblogs.com/kuang906/articles/2301361.html

MD5加密“破解”在.NET平台实现最基本的理解的更多相关文章

  1. 搜狐视频 登录 md5 加密破解

    这是一个简单的md5加密,可以学习一下js加密的破解流程,当一个入门级的教程 第一步:请求抓包 password是32位的字母和数字组合,猜测可能是md5加密,我们md5在线工具上试一下 发现我们的猜 ...

  2. MD5加密实现类不是Windows平台下联邦信息处理标准验证过的加密算法的一部分

    在.NET应用程序中,MD5CryptoServiceProvider实例化时,造成This implementation is not part of the Windows Platform FI ...

  3. app逆向万能的md5加密hook破解入参方法(其他加密用通用方法原理差不多,小白推荐)

    一.原理 安卓开发调用md5加密时候都会调用到系统类java.security.MessageDigest 加密时候会会调用里面2个关键方法update以及digest 根据这个原理我们开始写代码吧 ...

  4. iOS,一行代码进行RSA、DES 、AES、MD5加密、解密

    本文为投稿文章,作者:Flying_Einstein(简书) 加密的Demo,欢迎下载 JAVA端的加密解密,读者可以看我同事的这篇文章:http://www.jianshu.com/p/98569e ...

  5. Android数据加密之MD5加密

    前言: 项目中无论是密码的存储或者说判断文件是否是同一文件,都会用到MD5算法,今天来总结一下MD5加密算法. 什么是MD5加密? MD5英文全称“Message-Digest Algorithm 5 ...

  6. 一个简单的后台与数据库交互的登录与注册[sql注入处理,以及MD5加密]

    一.工具: vs2013[因为我现在用的也是2013,版本随便你自己开心] sql2008[准备过久升级] 二.用到的语言: HTML+CSS+Jquery+Ajax+sqlserver HTML[相 ...

  7. [开源]用MQL4实现MD5加密

    本文转载自博客园:混沌的世界 原文地址:http://www.cnblogs.com/niniwzw/archive/2009/12/05/1617685.html 在用MQL4进行金融交易的时候,经 ...

  8. 使用crypto模块实现md5加密功能(解决中文加密前后端不一致的问题)

    正常情况下使用md5加密 var crypto = require('crypto'); var md5Sign = function (data) { var md5 = crypto.create ...

  9. Java三行代码搞定MD5加密,测试5c短信网关的demo

    看到之前项目中,关于MD5加密的足足写了一个辅助类. 其实在Java中大部分都帮你实现好了,完成MD5加密,主要就三行代码: /** * 对字符串md5加密 * * @param str * @ret ...

随机推荐

  1. viewDidLayoutSubviews在ios7上导致应用崩溃

    在ios8中使用viewDidLayoutSubviews,应用正常运行,没有问题,但是应用在ios7上运行的时候,报错,导致应用崩溃,错误信息类似: Cannot find executable f ...

  2. NSNotification的几点说明

    1.NSNotification消息的同步性 ①NSNotification使用的是同步操作.即如果你在程序中的A位置post了一个NSNotification,在B位置注册了一个observer,通 ...

  3. jira报错,此域不支持您输入的日期

    jira报错,此域不支持您输入的日期 解决方法: 使用20117-1-1这样的格式输入,不要用选择日期.具体原因未知.

  4. FormatFloat

    http://www.delphibasics.co.uk/RTL.asp?Name=FormatFloat 1  function FormatFloat ( const Formatting : ...

  5. C#中的里氏替换原则

    里氏转换原则 子类可以赋值给父类对象 父类对象可以强制转化为对应的子类对象 里氏替换原则直观理解就是"子类是父类",反过来就说不通了. 就像男人是人对的,但人是男人就不对了. 这样 ...

  6. 出租车Jt/T 905协议与部标1078协议融合的网约车视频监控平台

    出租车jt/t 905协议,是jt/t 808协议的一个变种,设计者将部标808协议拿过来,并不是单纯的增加网约车相关的指令集,而且对原有的指令如定位0×0200指令也进行了修改,经过一通剧烈的修改, ...

  7. VMware网络连接 桥接、NAt、host-only模式

    如果你想利用VMWare安装虚拟机,或想创建一个与网内其他机器相隔离的虚拟系统,进行特殊的调试工作.此时,对虚拟系统网络连接模式的选择就非常重要了.如果你选择的工作模式不正确,就无法实现上述目的,也就 ...

  8. sublime使用技巧(1)-- 下载与插件安装

    一.下载 到官网下载最新的版本 https://www.sublimetext.com/ Sublime官方插件网站 https://packagecontrol.io/ 二.插件安装配置 1.打开S ...

  9. 【Mac + Python】苹果系统之安装Python3.6.x环境

    一.打开终端 输入:uname -a  ,查看电脑系统位数. 输入:python,查看mac系统python版本. 二.为了以后切换版本方便,安装pyenv进行版本切换以及升级. 参考文章:<M ...

  10. JS Map对象

    java和C#等高级语言中都有map这样的键值对,但是js里没有,我们需要这样的,该怎么做呢? 可以自己使用function封装一个map对象,如下所示 function Map() { this.k ...