Hash,一般翻译为散列,但多数是音译过来的:哈希(例如常用的哈希表Hashtable(.net))。它把预映射(pre-image)通过散列算法(哈希算法),变换成固定长度的输出,这个输出就叫散列值也就是哈希值。它就是一种将任意长度的消息压缩到某一固定长度的消息(消息摘要)的方法。
(一)SHA加密
SHA,就是安全散列算法,Secure Hash Algorithm。它能计算出一个数据消息所对应的固定长度的字串。SHA家族有5个算法,SHA-1,SHA-224,SHA-256,SHA-384,SHA-512。其中后4者总称SHA2
SHA1
SHA1在2005年被咱们国家的王小红等人破译。在2的63次方计算复杂度内找到碰撞。
在System.Security.Cryptography下的SHA1类提供了对SHA1的加密算法:
ComputeHash(array<Byte>[]()[]) 计算指定字节数组的哈希值。
ComputeHash(Stream) 计算指定 Stream 对象的哈希值。
ComputeHash(array<Byte>[]()[], Int32, Int32) 计算指定字节数组的指定区域的哈希值。
例如第一个:
{
string strContent = "123456";
Encoding _encoding = Encoding.Default;
byte[] bb=_encoding.GetBytes(strContent);
byte[] result;
SHA1 sha = new SHA1CryptoServiceProvider();
result = sha.ComputeHash(bb);
string strResult=BitConverter.ToString(result);
Console.WriteLine(strResult);
}
它的值为:
SHA1类是个抽象类,看它的派生关系:
System.Security.Cryptography.HA1
System.Security.Cryptography.SHA1CryptoServiceProvider
System.Security.Cryptography.SHA1Managed
System.Security.Cryptography.SHA1Cng
(1)SHA1CryptoServiceProvider
使用加密服务提供程序 (CSP) 提供的实现计算输入数据的 SHA1 哈希值
(2)SHA1Managed
使用托管库计算输入数据的 SHA1 哈希值
(3)SHA1Cng
提供安全哈希算法 (SHA) 的下一代加密技术 (CNG) 实现。
SHA2
SHA-224,SHA-256,SHA-384,SHA-512
同样在这个名字空间,提供了对应的类。以sha384为例子:
它的派生关系为:
System.Security.Cryptography.SHA384
System.Security.Cryptography.SHA384Managed
System.Security.Cryptography.SHA384Cng
System.Security.Cryptography.SHA384CryptoServiceProvider
以第一个为例:
{
string strContent = "123456";
Encoding _encoding = Encoding.Default;
byte[] bb = _encoding.GetBytes(strContent);
byte[] result;
SHA384 sha = new SHA384Managed();
result = sha.ComputeHash(bb);
string strResult = BitConverter.ToString(result);
Console.WriteLine(strResult);
}
2984B7ECC6D446D4B61EA9991B
(二)MD5
MD5就是消息摘要算法第5版,Message Digest Algorithm。它主要用于提供消息的完整性保护。例如电驴下载的文件的md
在.net中,md5类也在这个名字空间内:
System.Security.Cryptography.MD5
System.Security.Cryptography.MD5CryptoServiceProvider
System.Security.Cryptography.MD5Cng
{
string strContent = "123456";
Encoding _encoding = Encoding.Default;
byte[] bb = _encoding.GetBytes(strContent);
byte[] result;
MD5 md = new MD5CryptoServiceProvider();
result = md.ComputeHash(bb);
string strResult = BitConverter.ToString(result);
Console.WriteLine(strResult);
}
E10ADC3949BA59ABBE56E
(三)HMAC
HMAC 进程将密钥与消息数据混合,使用哈希函数对混合结果进行哈希计算,将所得哈希值与该密钥混合,然后再次应用哈希函数。输出的哈希值长度为 160 位(这里说明一下:160位就是20个字节。对于sha1来说是160位的,也就是20个字节,但打印的是40个字符,这里的40个是16进制数,2个为一字节即20个字节。)
计算hmac,先要一个hash值,然后一个密钥key。
其中hash值的字符串长用L表示,数据块长度用B表示。密钥key长度小于等于B,如果长度大于数据块长度,则通过hash函数对key进行散列转换,结果就是一个L长的key。
然后创建2个B长的不同字串:
str1=长度为B的0xa0
str2=长度为B的0xb1
然后字串str的hmac就是
hash(key^str2,hash(key^str1,str)
System.Security.Cryptography.HMAC
System.Security.Cryptography.HMACMD5
System.Security.Cryptography.HMACRIPEMD160
System.Security.Cryptography.HMACSHA1
System.Security.Cryptography.HMACSHA256
System.Security.Cryptography.HMACSHA384
System.Security.Cryptography.HMACSHA512
(四)MACTripleDES
使用 TripleDES 计算输入数据 CryptoStream 的消息验证代码 (MAC)。
在发送方和接收方共享密钥的前提下,MAC 可用于确定通过不安全信道发送的消息是否已被篡改。发送方计算原始数据的 MAC,然后将 MAC 和原始数据作为单个消息发送。接收方重新计算接收到的消息的 MAC,检查计算所得的 MAC 是否与传送的 MAC 匹配。MACTripleDES 使用长度为 16 或 24 字节的密钥,并产生长度为 8 字节的哈希序列。
{
//key
Encoding _encoding = Encoding.ASCII;
string strKey = "selfkey001000000";
byte[] key = _encoding.GetBytes(strKey);
string strContent = "message content";
byte[] data = _encoding.GetBytes(strContent);
MACTripleDES mac3des = new MACTripleDES(key);
byte[] result = mac3des.ComputeHash(data);
Console.WriteLine(BitConverter.ToString(result));
}