.NET中的加密哈希技术的使用

来源:互联网 发布:人工智能学什么语言 编辑:程序博客网 时间:2024/06/06 01:17

在日常生活中,数据安全越来越受用户的重视。在日常生活中,涉及加密的情况很常见,比如,银行查询余额时或在网上进行购物时需要输入密码,而且密码的长度还有一定的规范,有时相关文件还必须输入密码才能进行解压缩。

目前,比较流行的加密技术有:对称加密、不对称加密、加密签名和加密哈希,有时也可以通过自己编写算法达到隐藏敏感信息的目的。本文主要描述.NET中加密哈希技术的使用。

加密哈希是指通过哈希算法将任意长的二进制值映射为固定长度的并且较小的二进制。从理论上说,不同的二进制散列之后的结果并不一样,所以,一个二进制值,只要改动其中的一个值,那么散列之后的值也会跟着变动,这样起散列的结果就会不同。加密哈希函数有这样一个属性:在计算上不大可能找到散列为相同的值的两个不同的输入;也就是说,两组数据的哈希值仅在对应的数据也匹配时才会匹配。数据的少量更改会在哈希值中产生不可预知的大量更改。所以你很难从加密后的文字中找到蛛丝马迹。哈希算法比较适合于进行身份验证,例如:需要进行身份验证的系统中并不直接将用户的密码保存到数据库中,常用的方法是使用哈希算法将用户的密码散列之后再保存到数据库中,以后每次进行身份验证的时候将用户输入的密码散列后再与数据库中保存的进行匹配。

在.NET Framework中提供的实现哈希算法的类有:

(1)HMACSHA1:使用SHA1哈希函数计算基于哈希值的消息验证代码(HMAC)。SHA1的全称是Secure Hash Algorithm(安全哈希算法),HMACSHA1接受任何大小的密钥,并产生长度为160位的哈希序列。

(2)MACTripleDES:使用TripleDES计算输入数据CryptoStream的消息验证代码(MAC).MACTripleDES使用长度为16或24字节的密钥,并产生长度为8字节的哈希序列。

(3)MD5CryptoServiceProvider:使用加密服务提供程序(CSP)提供的实现,计算输入数据的MD5哈希值。MD5CryptoServiceProvider类的哈希大小为128位,某些MD5实现会生成32字节的十六进制格式哈希值。

(4)SHA1Managed:使用托管库计算输入数据的SHA1哈希值。SHA1Managed算法的哈希值大小为160位。

(5)SHA256Managed:使用托管库计算输入数据的SHA256哈希值。SHA256Managed算法的哈希值大小为256位。

(6)SHA384Managed:使用托管库计算输入数据的SHA384哈希值。SHA384Managed算法的哈希值大小为384位。

(5)SHA512Managed:使用托管库计算输入数据的SHA512哈希值。SHA512Managed算法的哈希值大小为512位。

尽管MD5加密哈希算法不安全,但依然是很多网站默认采用的用户密码加密算法。例如,下面的是MD5加密哈希算法的代码。

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Security.Cryptography;///<summary>///MD5Provider的摘要说明///</summary>public class MD5Provider{    private MD5Provider()    {     }    /// <summary>    /// 用MD5用算法进行加密哈希    /// </summary>    /// <param name="message"></param>    /// <returns></returns>    public static string Hash(string message)    {        if (string.IsNullOrEmpty(message))        {            return string.Empty;        }        else         {            //创建MD5算法的默认实例            MD5 md5 = MD5.Create();            //将要加密的字符串按照UTF-8编码转换成字节数组            byte[] source = Encoding.UTF8.GetBytes(message);            //计算自己数组的哈希值            byte[] result = md5.ComputeHash(source);            StringBuilder buffer = new StringBuilder();            for (int i = 0; i < result.Length; i++)            {                //将自己数组中的每个元素转换成十六进制形式                buffer.Append(result[i].ToString("X"));            }            return buffer.ToString();        }    }}

对应的逻辑代码如下:

using System;using System.Collections;using System.Configuration;using System.Data;using System.Linq;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.HtmlControls;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Xml.Linq;public partial class day20_MD5Demo : System.Web.UI.Page {    protected void Page_Load(object sender, EventArgs e)    {          }    protected void btnHash_Click(object sender, EventArgs e)    {        string text = txtMD5Source.Text;        string result = MD5Provider.Hash(text);            txtMD5Result.Text = result;                 }}

这样哪怕对字符进行很小的变动,它哈希之后得到的结果相差依然会很大,这样就很好的起到了保护数据的作用。

原创粉丝点击