C#では、MD5またはSHA1の方法、MD5及びSHA1ハッシュデータがハッシュアルゴリズムである、MD5は、128ビットの出力であり、出力が速くより160ビットSHA1、MD5、SHA1、MD5 SHA1よりも高強度です。
1.1 SHA-1およびMD5比較
MD4、SHA-1によって誘導され、MD5は互いに非常に類似しているので、両方。したがって、彼らの強さとその他の特性も似ていますが、異なる以下があります。
- セキュリティフォース攻撃:最も重要かつ最も重要な違いは、SHA-1ダイジェストMD5は32よりも長いダイジェストということです。SHA-1は、2 ^ 160の操作の順序であるが、任意の所与のメッセージは、2 ^ 128の動作のための等しい困難MD5ダイジェストを消化するように力、パケットを用いる技術。したがって、SHA-1力の対とは、高い強度を攻撃します。
- 暗号解読の安全性:により暗号解読攻撃に対して脆弱MD5の設計に、SHA-1は、このような攻撃に対してより脆弱であることが表示されます。
- スピード:MD5よりも遅く、同じハードウェア上で、SHA-1動作速度。
1.2 SHA-1およびMD5は、C#で実装されています
/// <summary>
/// Hash辅助类
/// </summary>
public class HashHelper
{
/// <summary>
/// 计算文件的 MD5 值
/// </summary>
/// <param name="fileName">要计算 MD5 值的文件名和路径</param>
/// <returns>MD5 值16进制字符串</returns>
public static string MD5File(string fileName)
{
return HashFile(fileName, "md5");
}
/// <summary>
/// 计算文件的 sha1 值
/// </summary>
/// <param name="fileName">要计算 sha1 值的文件名和路径</param>
/// <returns>sha1 值16进制字符串</returns>
public static string SHA1File(string fileName)
{
return HashFile(fileName, "sha1");
}
/// <summary>
/// 计算文件的哈希值
/// </summary>
/// <param name="fileName">要计算哈希值的文件名和路径</param>
/// <param name="algName">算法:sha1,md5</param>
/// <returns>哈希值16进制字符串</returns>
private static string HashFile(string fileName, string algName)
{
if (!System.IO.File.Exists(fileName))
{
return string.Empty;
}
System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read);
byte[] hashBytes = HashData(fs, algName);
fs.Close();
return ByteArrayToHexString(hashBytes);
}
/// <summary>
/// 计算哈希值
/// </summary>
/// <param name="stream">要计算哈希值的 Stream</param>
/// <param name="algName">算法:sha1,md5</param>
/// <returns>哈希值字节数组</returns>
private static byte[] HashData(System.IO.Stream stream, string algName)
{
System.Security.Cryptography.HashAlgorithm algorithm;
if (algName == null)
{
throw new ArgumentNullException("algName 不能为 null");
}
if (string.Compare(algName, "sha1", true) == 0)
{
algorithm = System.Security.Cryptography.SHA1.Create();
}
else
{
if (string.Compare(algName, "md5", true) != 0)
{
throw new Exception("algName 只能使用 sha1 或 md5");
}
algorithm = System.Security.Cryptography.MD5.Create();
}
return algorithm.ComputeHash(stream);
}
/// <summary>
/// 字节数组转换为16进制表示的字符串
/// </summary>
private static string ByteArrayToHexString(byte[] buf)
{
return BitConverter.ToString(buf).Replace("-", "");
}
}
C#のテストケースに実装1.3SHA-1およびMD5
[TestClass]
public class HashHelperUnitTest
{
[TestMethod]
public void TestMethod1()
{
string fileName = @"D:\TempTest\RDIFramework.BizLogic.dll";
Assert.AreEqual(0, 0);
//01.计算文件的 MD5 值
Console.WriteLine(string.Format("计算文件的 MD5 值:{0}", HashHelper.MD5File(fileName)));
//02.计算文件的 sha1 值
Console.WriteLine(string.Format("计算文件的 sha1 值:{0}", HashHelper.SHA1File(fileName)));
}
}