1はじめに
数値ロジックによって計算して得られたデータに基づいて、HASHファイルコンテンツ、得られたハッシュ値の異なるファイル(でも同じファイル名であれば)が異なります。
(等MD5、SHA-1を、代表)特定のハッシュアルゴリズムを介して、データが短い小さなデータのより長い期間にマッピングされ、このデータは、ハッシュ値が大きいほど小さいデータです。彼の最大の特徴は、大規模なデータの変更と、それはマイナーな変更がある場合でも、彼はハッシュ値を変更します、ユニークです。それはDNAであるので、DNAと同様に、それは二つのデータのハッシュ値が同一でないことを保証します。
効果ハッシュ:ハッシュ値、すなわち、ハッシュ値ファイルの内容を暗号化操作を得られるバイナリ値のセットによっては、主な目的は、ファイルのためのものであるか、署名を検証します。そのため、この特性のために、それは多くの場合、2つのファイルが同一かどうかを決定するために使用されます。
2つのファイルが同一であれば、例えば、インターネットからファイル限り、ダウンロードしたファイルを比較して、元のファイルのハッシュ値のハッシュ値をダウンロードし、ファイルのダウンロードプロセスに損傷がない、まったく同じと述べました。いない場合、それはファイルとは別の元のファイルとダウンロードしたファイルがダウンロード中に破損していることを示しています。ハッシュは広く、主に使用し、使用されます。
- ファイルのチェックサム
私たちは、これら2つのデータの種類と、彼らはデータ伝送における正しいチャネルのエラーを検出し、することができますある程度、改ざん抵抗する能力をチェックし、アルゴリズムのパリティとCRCチェックをチェックし、より精通しているが、防ぐことはできませんデータの悪質な破壊。
「デジタル指紋」MD5Hashアルゴリズムの特徴、それ最も広く使用されているファイルの整合性チェックと(チェックサム)アルゴリズムの一つ作り、多くのUnixシステムではmd5checksumはのコマンドを持っている計算提供しています。
-
固有の識別
そこにファイルを与えるために数千のファイルは、愚かな方法は、それぞれが出てファイルを入れ、その後、比較してバイナリ文字列1に従うことです。あなたは10万ファイルがあるかどうかを知りたい、です。しかし、この比較的時間のかかる操作であるとバインドされています。ファイルはハッシュアルゴリズムを使用して計算して、ハッシュ値が同じで比較することができます。そのため、ハッシュ衝突が存在する、あなたは、同じハッシュ値を持つファイル内のバイナリ文字列を比較することができます。
-
デジタル署名
ハッシュアルゴリズムは、現代の暗号システムの重要な部分です。非対称アルゴリズムより遅く動作速度、その合意のデジタル署名ので、一方向ハッシュ関数は、重要な役割を果たしています。また、「デジタル抽象的な」デジタル署名として知られているのハッシュ値は、統計的にデジタルで自身が等価である文書に署名することが考えられます。そして、このような契約は、他の利点があります。
- ハッシュテーブル
ハッシュテーブルにハッシュ関数を使用することは見知らぬ人ではありませんし、それらを繰り返していません。
- ロードバランシング
例えば、要求に対するサーバの追加は、要求がどのルータにルーティングする方法を決定するには?もちろん、私たちは同じサーバへのルートの後に同じ要求ことを確認する必要があります。一つの方法は、ルーティングテーブルの関係を保存することですクライアントとサーバーのIP番号のマッピングなどが、クライアントは多くの時間が非常に長いを探すためにバインドされている場合。この場合には、固有の識別情報がクライアントであってもよい(例:IP、ユーザ名、等)ハッシュし、サーバーの数を法として、サーバIDが得られます。
- 分散ストレージ
私たちは、読み込みの速度を上げると書き込み、一般的に複数のサーバにデータを格納するように選択するためには、多くのデータを持っている場合。私たちは、それがハッシュアルゴリズムの剰余を求める操作できるためにどのファイルサーバを格納することを決めました。
データが多い場合、サーバーを高めるために、問題が来る、例えば、10台のサーバであることが判明し、今15となっている元の文書16のハッシュ値をサーバ6の番号に割り当てられているが、その後、今ありますランク1は、すべての文書が再計算と記憶のための非父性サーバの再ハッシュ値すべきであることを意味するサーバに割り当てられています。一貫したハッシングは、この目的です。
ハッシュファイルの計算を支援するために開発された2、C#クラスHashHelper
C#では、MD5またはSHA1の方法、MD5及びSHA1ハッシュデータがハッシュアルゴリズムである、MD5は、128ビットの出力であり、出力が速くより160ビットSHA1、MD5、SHA1、MD5 SHA1よりも高強度です。
2.1、SHA-1およびMD5比較
MD4、SHA-1によって誘導され、MD5は互いに非常に類似しているので、両方。したがって、彼らの強さとその他の特性も似ていますが、異なる以下があります。
1)对强行攻击的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2^128数量级的操作,而对SHA-1则是2^160数量级的操作。这样,SHA-1对强行攻击有更大的强度。
2)对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。
3)速度:在相同的硬件上,SHA-1的运行速度比MD5慢。
2.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("-", "");
}
}
2.2、SHA-1和MD5在C#中的实现的测试用例
[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)));
}
}
参考文章
框架相关
一路走来数个年头,感谢RDIFramework.NET框架的支持者与使用者,大家可以通过下面的地址了解详情。
RDIFramework.NET官方网站:http://www.rdiframework.net/
RDIFramework.NET官方博客:http://blog.rdiframework.net/
同时需要说明的,以后的所有技术文章以官方网站为准,欢迎大家收藏!
RDIFramework.NET框架由海南国思软件科技有限公司专业团队长期打造、一直在更新、一直在升级,请放心使用!
欢迎关注RDIFramework.net框架官方公众微信(微信号:guosisoft),及时了解最新动态。
扫描二维码立即关注