DotNet加密方式解析--散列加密
没时间扯淡了,赶紧上车吧。
在现代社会中,信息安全对于每一个人都是至关重要的,例如我们的银行账户安全、支付宝和微信账户安全、以及邮箱等等,说到信息安全,那就必须得提到加密技术,至于加密的一些相关概念,在这里就不说了。
这一次将会主要讲解.NET的加密方式,接下来将会分别介绍散列加密,对称加密,非对称加密等等加密方式在.NET中的应用,本文主要讲解散列加密在.NET中的应用实例。
一.DotNet散列算法概述:
说到散列应该都不会陌生,并且首先都会想到MD5加密,但是对于散列更加深入的了解,恐怕知道的人就不会那么多了。散列算法创建了一个散列码,也叫做“消息摘要”或“消息指纹”,看到“消息指纹”这个词,我首先想到的是可以唯一识别一个消息或者说可以唯一的标识一个人。
1.散列算法原理概述:
散列算法的核心是一个数学函数,在两个固定大小的数据块中运行它可以创建一个散列码。在散列算法中需要指定一个“种子值”,该值和第一块消息数据一同载入散列函数这就生成了第一个散列码,按照上一步的方式,散列码依次进入下一个散列函数运算,最后获得散列码,如下图所示:

散列码是采用重复调用散列函数的链创建的,散列码依赖于消息的单个位的值。散列函数是通过操作两块固定长度的二进制数据来生成散列码,散列算法则描述类使用散列函数为消息创建散列码的过程,散列算法是使用散列函数的协议,指定类如何分解消息及如何链接之前消息快产生的结果。散列码的长度也有所限制,散列码长度较长时,需要的破解时间就会较长,这就是暴力破解的方式,但是散列码较长,生成散列码的时间就是比较长,任何策略都是需要付出代价的。
2.DotNet的散列算法种类:
在.NET中,常用的散列算法种类有如下几种:

在以上列举的几种散列算法中,MD5是.NET含有的最快的散列算法。如果基础算法有缺陷,越长的散列码并不一定能够提供越好的安全。
二.DotNet散列算法应用解析:
以上对散列算法,以及散列算法在.NET中分类做了一个简单的介绍,接下来我们具体看一下再.NET中实现这几种散列算法的类。
在.NET中System.Security.Cryptography命名空间下的HashAlgorithm类,表示所有加密哈希算法实现均必须从中派生的基类。有如下类结构:

在.NET中有两种类型的实现类,一个是以“Managed”结尾,这些类都被写入托管.NET语言,一种是以“CryptoServiceProvider”结尾,这些类是基于Windows CryptoAPI的。接下来我们具体的了解一下HashAlgorithm类的一些方法:
1.HashAlgorithm类方法和属性解析:
(1).Hash属性:获取计算所得的哈希代码的值。
public virtual byte[] Hash
{
get
{
if (this.m_bDisposed)
throw new ObjectDisposedException((string) null);
if (this.State != )
throw new CryptographicUnexpectedOperationException(Environment.GetResourceString("Cryptography_HashNotYetFinalized"));
return (byte[]) this.HashValue.Clone();
}
}
该属性返回类计算机的散列码值,该属性是一个字节数组,由代码可以看出该属性是只读的,返回计算所得的哈希代码的当前值。
(2).Create()方法:创建哈希算法的指定实现的实例。
public static HashAlgorithm Create(string hashName)
{
return (HashAlgorithm) CryptoConfig.CreateFromName(hashName);
}
由代码可知,指定哈希算法的新实例,如果hashName不是有效哈希算法,则为 null,该方法使用名称创建一个HashAlgorithm对象的新实例。
(3).ComputeHash()方法:从字节数组和数据流中创建散列码。
public byte[] ComputeHash(byte[] buffer)
{
if (this.m_bDisposed)
throw new ObjectDisposedException((string) null);
if (buffer == null)
throw new ArgumentNullException("buffer");
this.HashCore(buffer, , buffer.Length);
this.HashValue = this.HashFinal();
byte[] numArray = (byte[]) this.HashValue.Clone();
this.Initialize();
return numArray;
}
以上是ComputeHash()方法的一个重载版本,使用字节数组来创建一个散列码,该方法返回一个字节数组,该数组含有消息数据的散列码。HashCore()将写入对象的数据路由到哈希算法以计算哈希值,HashFinal()在加密流对象处理完最后的数据后完成哈希计算。
2.HMAC类: 表示基于哈希的消息验证代码 (HMAC) 的所有实现必须从中派生的抽象类。
创建加密散列码(消息验证码MACs)有两种方式:
第一种:先合并类密钥和消息数据,再使用通常的加密散列算法来为该并集创建散列码。常用的是HMAC标准。
第二种:使用对称算法来加密消息数据,除了最后几位之外,所有的加密数据位都将被舍弃。
HMAC标准制定了如何合并消息数据和密钥,但是没有指定应该使用那种散列算法来创建散列码,这也就意味着该标准可以应用于任何算法。
(1).Key属性:获取或设置用于哈希算法的密钥。
public override byte[] Key
{
get
{
return (byte[]) this.KeyValue.Clone();
}
set
{
if (this.m_hashing)
throw new CryptographicException(Environment.GetResourceString("Cryptography_HashKeySet"));
this.InitializeKey(value);
}
}
该属性在这里进行类重写,该属性是一个字节数组,属性可读写。
(2).Create()方法:创建基于哈希的消息验证代码 (HMAC) 指定实现的实例。
public static HMAC Create(string algorithmName)
{
return (HMAC) CryptoConfig.CreateFromName(algorithmName);
}
该方法指定的 HMAC 实现的新实例,该方法跟HashAlgorithm类的Create方法类似,这里就不做深入的解析。
(3).HashCore()方法:将写入对象的数据路由给默认 HMAC 哈希算法以计算哈希值。
protected override void HashCore(byte[] rgb, int ib, int cb)
{
if (!this.m_hashing)
{
this.m_hash1.TransformBlock(this.m_inner, , this.m_inner.Length, this.m_inner, );
this.m_hashing = true;
}
this.m_hash1.TransformBlock(rgb, ib, cb, rgb, ib);
}
该方法在这里被重写,将写入对象的数据路由给默认 HMAC 哈希算法以计算哈希值。TransformBlock()计算输入字节数组的指定区域的哈希值,将输入字节数组的指定区域复制到指定的区域,输出字节数组。
三.DotNet散列算法实现实例:
以上介绍在.NET下的散列加密的主要类,接下来看一下MD5的具体实现代码:
/// <summary>
/// 表示 MD5哈希算法的所有实现均从中继承的抽象类。
/// </summary>
[ComVisible(true)]
public abstract class MD5 : HashAlgorithm
{
/// <summary>
/// 初始化 MD5 的新实例。
/// </summary>
protected MD5()
{
this.HashSizeValue = ;
} /// <summary>
/// 创建MD5 哈希算法的默认实现的实例。
/// </summary>
/// <returns>
/// <see cref="T:System.Security.Cryptography.MD5"/> 哈希算法的新实例。
/// </returns>
public static MD5 Create()
{
return MD5.Create("System.Security.Cryptography.MD5");
} /// <summary>
/// 创建MD5 哈希算法的指定实现的实例。
/// </summary>
/// <returns>
public static MD5 Create(string algName)
{
return (MD5) CryptoConfig.CreateFromName(algName);
}
}
由以上的代码可以看住,在MD5类中,具体的实现方法都是由HashAlgorithm类的Create方法实现,在这里就不再做介绍。
1.SHA1算法实例:
public static string GetSha1(string str)
{
if (string.IsNullOrEmpty(str))
{
throw new ArgumentNullException(str);
}
try
{
//建立SHA1对象
SHA1 sha = new SHA1CryptoServiceProvider();
//将mystr转换成byte[]
var enc = new ASCIIEncoding();
var dataToHash = enc.GetBytes(str);
//Hash运算
var dataHashed = sha.ComputeHash(dataToHash);
//将运算结果转换成string
var hash = BitConverter.ToString(dataHashed).Replace("-", "");
return hash;
}
catch (ArgumentNullException ex)
{
throw ex;
}
catch (ArgumentException arex)
{
throw arex;
}
catch (ObjectDisposedException obex)
{
throw obex;
}
2.MD5加密实例:
/// <summary>
/// 32位大写
/// </summary>
/// <returns></returns>
public static string Upper32(string s)
{
var hashPasswordForStoringInConfigFile = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(s, "md5");
if (hashPasswordForStoringInConfigFile != null)
s = hashPasswordForStoringInConfigFile;
return s.ToUpper();
} /// <summary>
/// 32位小写
/// </summary>
/// <returns></returns>
public static string Lower32(string s)
{
var hashPasswordForStoringInConfigFile = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(s, "md5");
if (hashPasswordForStoringInConfigFile != null)
s = hashPasswordForStoringInConfigFile;
return s.ToLower();
} /// <summary>
/// 16位大写
/// </summary>
/// <returns></returns>
public static string Upper16(string s)
{
var hashPasswordForStoringInConfigFile = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(s, "md5");
if (hashPasswordForStoringInConfigFile != null)
s = hashPasswordForStoringInConfigFile.ToString();
return s.ToUpper().Substring(, );
} /// <summary>
/// 16位小写
/// </summary>
/// <returns></returns>
public static string Lower16(string s)
{
var hashPasswordForStoringInConfigFile = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(s, "md5");
if (hashPasswordForStoringInConfigFile != null)
s = hashPasswordForStoringInConfigFile.ToString();
return s.ToLower().Substring(, );
}
四.总结:
以上介绍了散列算法在.NET的应用和原理,希望可以帮到一些人,如果文章中有写的错误和不到位的地方,还望大家多多批评指正。
友情添加一个加密的helper方法:http://www.cnblogs.com/liqingwen/p/6155694.html
加密算法系列:
DotNet加密方式解析--散列加密:http://www.cnblogs.com/pengze0902/p/6268700.html
DotNet加密方式解析--对称加密:http://www.cnblogs.com/pengze0902/p/6268702.html
DotNet加密方式解析--数字签名:http://www.cnblogs.com/pengze0902/p/6268709.html
DotNet加密方式解析--非对称加密:http://www.cnblogs.com/pengze0902/p/6268705.html
DotNet加密方式解析--散列加密的更多相关文章
- .NET加密方式解析--散列加密
在现代社会中,信息安全对于每一个人都是至关重要的,例如我们的银行账户安全.支付宝和微信账户安全.以及邮箱等等,说到信息安全,那就必须得提到加密技术,至于加密的一些相关概念,在这里就不说了. 这一次将会 ...
- DotNet加密方式解析--对称加密
离过年又近了一天,回家已是近在咫尺,有人欢喜有人愁,因为过几天就得经历每年一度的装逼大戏,亲戚朋友加同学的各方显摆,所以得靠一剂年终奖来装饰一个安稳的年,在这里我想起了一个题目“论装逼的技术性和重要性 ...
- DotNet加密方式解析--数字签名
马上就要过年回村里了,村里没有wifi,没有4G,没有流量,更加重要的是过几天电脑就得卖掉换车票了,得赶紧写几篇博客. 数据安全的相关技术在现在愈来愈变得重要,因为人们对于自身的信息都有一种保护的欲望 ...
- DotNet加密方式解析--非对称加密
新年新气象,也希望新年可以挣大钱.不管今年年底会不会跟去年一样,满怀抱负却又壮志未酬.(不过没事,我已为各位卜上一卦,卦象显示各位都能挣钱...).已经上班两天了,公司大部分人还在休假,而我早已上班, ...
- 【DotNet加密方式解析】-- 好文收藏
By -- 彭泽 一. DotNet加密方式解析--散列加密 笔记: 散列加密种类: 1.MD5 128位 2.SHA-1 160位 3.SHA-256 256位 4.SHA-384 384位 ...
- 【转】DotNet加密方式解析--非对称加密
[转]DotNet加密方式解析--非对称加密 新年新气象,也希望新年可以挣大钱.不管今年年底会不会跟去年一样,满怀抱负却又壮志未酬.(不过没事,我已为各位卜上一卦,卦象显示各位都能挣钱...).已经上 ...
- MD5和sha1加密算法--散列加密技术 MD5:128bit的大整数
在很多电子商务和社区应用中,我们都要存放很多的客户的资料,其中包括了很多的隐私信息和客户不愿被别人看到的信息,当然好有客户执行各种操作的密码,此时就需要对客户的信息进行加密再存储,目前有两种比较好的加 ...
- Android数据加密概述及多种加密方式 聊天记录及账户加密 提供高质量的数据保护
Android数据加密概述及多种加密方式 聊天记录及账户加密 提供高质量的数据保护 数据加密又称password学,它是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文.而解密则是通过解密 ...
- 【Java-加密算法】对称加密、非对称加密、单向散列(转)
一提到加密,就会联想到数字签名,这两个经常被混淆的概念到底是什么呢? 加密:加密是一种以密码方式发送信息的方法.只有拥有正确密钥的人才能解开这个信息的密码.对于其他人来说,这个信息看起来就像是一系列随 ...
随机推荐
- 关于js中 document.body.scrollTop 不能返回正确值的原因
本来是为了通过document.body.scrollTop来获取浏览器垂直滚动条向下滚动的像素,但是不管滚动条在什么位置总是返回是0,造成这样的原因和html的头部声明有关,如果头部声明 为:< ...
- C#中静态构造函数含义及使用
static以前都接触过,可是最近才发现了还有静态类的写法,也可能是以前没太注意了,所以自己去研究了一下! 1.什么是构造函数: 1.1 例如:static Class{} 1.2 使用静态函数的注 ...
- C#中的委托是什么?
概述 委托类似C++中的函数指针,但是又有所不同.在C++中,函数指针不是类型安全的,它指向的是内存中的某一个位置,我们无法判断这个指针实际指向什么,对于参数和返回类型就更难以知晓.而.NET的委托则 ...
- zepto源码研究 - deferred.js(jquery-deferred.js)
简要:zepto的deferred.js 并不遵守promise/A+ 规范,而在jquery v3.0.0中的defer在一定程度上实现了promise/A+ ,因此本文主要研究jquery v3. ...
- uva 280 - Vertex
#include <iostream> #include <cstdio> using namespace std; #include <vector> #defi ...
- Linux下查看Apache的请求数
在Linux下查看Apache的负载情况,以前也说过,最简单有有效的方式就是查看Apache Server Status(如何开启Apache Server Status点这里),在没有开启Apach ...
- Android再学习-便签开发小结-20141119
这几天的便签开发,首先遇到的问题就是数据库操作问题.现在已经可以读写数据库了,并能将数据放在正确的位置显示. 专门建立了一个数据库操作的包,命名为"...database".新建一 ...
- vim的命令集合
命令历史 以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令.启动vim 在命令行窗口中输入以下命令即可 vim 直接启动vim vim filename 打开vim并 ...
- 原生js和jquery实现图片轮播特效
本文给大家分享的是使用原生JS和JQ两种方法分别实现相同的图片轮播特效,十分的实用,也非常方便大家对比学习原生js和jQuery,有需要的小伙伴可以参考下. 1)首先是页面的结构部分对于我这种左右切换 ...
- zlog小试(C语言日志工具)
test.c #include <stdio.h> #include "zlog.h" int main(int argc, char** argv) { int rc ...