.NET加密方式解析--散列加密

在现代社会中,信息安全对于每一个人都是至关重要的,例如我们的银行账户安全、支付宝和微信账户安全、以及邮箱等等,说到信息安全,那就必须得提到加密技术,至于加密的一些相关概念,在这里就不说了。

这一次将会主要讲解.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 != 0)

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, 0, 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, 0, this.m_inner.Length, this.m_inner, 0);

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 = 128;

}

/// <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加密实例

/// 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(8, 16);

}

/// <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(8, 16);

}

四.总结

以上介绍了散列算法在.NET的应用和原理,希望可以帮到一些人,如果文章中有写的错误和不到位的地方,还望大家多多批评指正。

时间: 2024-08-11 03:30:51

.NET加密方式解析--散列加密的相关文章

【DotNet加密方式解析】-- 好文收藏

By -- 彭泽 DotNet加密方式解析--散列加密 DotNet加密方式解析--对称加密 DotNet加密方式解析--数字签名 DotNet加密方式解析--非对称加密 蒙 2017-08-22 18:50 周二

MD5和sha1加密算法--散列加密技术 MD5:128bit的大整数

在很多电子商务和社区应用中,我们都要存放很多的客户的资料,其中包括了很多的隐私信息和客户不愿被别人看到的信息,当然好有客户执行各种操作的密码,此时就需要对客户的信息进行加密再存储,目前有两种比较好的加密算法:MD5和sha1. 这两种加密算法都属于散列加密技术.所谓散列加密就是无论输入的字符串是什么,有多大,加密后都将变成唯一的定长的加密串. 首先介绍一下MD5,MD5的全称是Message-Digest Algorithm 5,在90年代初由MIT的计算机科学实验室和RSA Data Secu

单向散列加密

开发中有一种场景,就是只需要验证正确性而不需要知道它的原文,只需要知道这个值是否存在是否相等就可以了.比如前端登录将用户的密码加密给服务端并存储到数据库.或者验证文件唯一性等.这时就要用到单向散列加密. 单向散列函数特点 1. 对任意长度的消息散列值是定长的. 2. 散列计算速度快,非常高效. 3. 明文不同,散列加密后的密文一定不同:明文相同,散列加密后密文一定相同. 4. 具备单向性,无法逆推计算. 单向散列函数也被称为哈希函数,摘要函数或者杂凑函数.其经典算法有 md5 | sha | s

Android数据加密概述及多种加密方式 聊天记录及账户加密 提供高质量的数据保护

Android数据加密概述及多种加密方式 聊天记录及账户加密 提供高质量的数据保护 数据加密又称密码学,它是一门历史悠久的技术,指通过加密算法和加密密钥将明文转变为密文,而解密则是通过解密算法和解密密钥将密文恢复为明文.数据加密目前仍是计算机系统对信息进行保护的一种最可靠的办法.它利用密码技术对信息进行加密,实现信息隐蔽,从而起到保护信息的安全的作用. 一.概述 数据加密是指通过加密算法和加密密钥将明文转变为密文,而解密则是通过解密算法和解密密钥将密文恢复为明文.它产生的历史相当久远,它是起源于

【Java-加密算法】对称加密、非对称加密、单向散列

一提到加密,就会联想到数字签名,这两个经常被混淆的概念到底是什么呢? 加密:加密是一种以密码方式发送信息的方法.只有拥有正确密钥的人才能解开这个信息的密码.对于其他人来说,这个信息看起来就像是一系列随机的字母.数字和符号.如果你要发送不应该让其他人看的敏感信息时,加密是特别重要的. 数字签名:数字签名是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法.一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证. 加密与数字签名的区别 加密同数字签名

.Net加密与解密——散列运算

一,散列运算的特点 1,散列运算是不可逆的,可以将散列运算理解为单向的加密: 2,任何两个不相同的文件,哪怕只有一个字节的细微差别,得到的摘要都是完全不同的.这个特点的意义在于,可以用来判断消息是否被篡改,即解决完整性的问题. 3,无论原始消息的大小如何,运算得出的摘要的信息是固定长度,摘要的长度根据散列算法的不同而不同. 二,利用散列运算判断消息是否被篡改的流程 1,发送放对消息进行散列运算,得到消息摘要,发送消息和摘要,并说明获得摘要所使用的散列算法. 2,接收方获得消息和原始摘要,使用相同

php密码加密(密码散列)

php在5.5版本中新增了password_hash.password_verify两个密码散列函数 使用方法: // 散列 $password = '123456'; $hash = password_hash($password, PASSWORD_BCRYPT); // $2y$10$8ob0qXBKuW1.YoAh1xSCFeXeftnsLRgP7XYb9KMG5TpcXNN/M0Q/2 // 验证 if (password_verify($password, $hash)) { ret

iOS代码加密常用加密方式

在今天的面试中,被问到了iOS是采用什么进行加密解密操作的,我的回答是这样的:AES,MD5,Base 64,然后是对这几种加密算法进行了一下简单的介绍和概述和几种算法之间的不同点和优缺点.然而,收到的回答是:这些都不是iOS的加密!我顿时就无语了,这不就是iOS加密所用到的方法么?然后向面试官请教了一下:MD5是一种摘要....什么叫加密呢?加密是客户端对数据加密和服务器端采用秘钥对数据进行解密处理,为了数据的安全考虑.要说加密应该是RSA.幸亏之前有了解过RSA,只是了解的不是很彻底和清楚.

解析php混淆加密解密的手段,如 phpjm,phpdp神盾,php威盾

原文 解析php混淆加密解密的手段,如 phpjm,phpdp神盾,php威盾 php做为一门当下非常流行的web语言,常常看到有人求解密php文件,想当年的asp也是一样.一些人不理解为什么要混淆(加密),甚至鄙视混淆(加密),在我看来混淆加密代码可以用来防一般的小人,会起到一定的保护作用. 加密的原因: 1. 保护代码,防止别人剽窃 2. 保护文件,防止别人发现/查杀(php木马 or 后门) 3. 剽窃了他人代码防止被发现 4. 其他商业或非商业目的 我一直都比较关注代码的加解密,从简单e