[C#] 파일에 대한 MD5 체크섬 계산

iTextSharp 를 사용하여 PDF 파일에서 텍스트를 읽습니다. 그러나 PDF 파일에는 이미지 만 포함되어 있기 때문에 텍스트를 추출 할 수없는 경우가 있습니다. 매일 동일한 PDF 파일을 다운로드하고 PDF가 수정되었는지 확인하고 싶습니다. 텍스트 및 수정 날짜를 얻을 수없는 경우 MD5 체크섬이 파일이 변경되었는지 확인하는 가장 신뢰할 수있는 방법입니까?

그렇다면 암호화에 대한 경험이 많지 않기 때문에 일부 코드 샘플이 좋습니다.



답변

System.Security.Cryptography.MD5 사용하면 매우 간단합니다 .

using (var md5 = MD5.Create())
{
    using (var stream = File.OpenRead(filename))
    {
        return md5.ComputeHash(stream);
    }
}

( 실제로 사용 된 MD5 구현은 폐기 할 필요는 없지만, 여전히 그렇게 할 것입니다.)

나중에 결과를 비교하는 방법은 귀하에게 달려 있습니다. 예를 들어 바이트 배열을 base64로 변환하거나 바이트를 직접 비교할 수 있습니다. (배열은 재정의하지 않습니다 Equals. base64를 사용하는 것이 더 간단하지만 해시 비교에만 관심이 있다면 약간 덜 효율적입니다.)

해시를 문자열로 나타내야하는 경우 다음을 사용하여 해시를 16 진수로 변환 할 수 있습니다 BitConverter.

static string CalculateMD5(string filename)
{
    using (var md5 = MD5.Create())
    {
        using (var stream = File.OpenRead(filename))
        {
            var hash = md5.ComputeHash(stream);
            return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
        }
    }
}


답변

이것이 내가하는 방법입니다.

using System.IO;
using System.Security.Cryptography;

public string checkMD5(string filename)
{
    using (var md5 = MD5.Create())
    {
        using (var stream = File.OpenRead(filename))
        {
            return Encoding.Default.GetString(md5.ComputeHash(stream));
        }
    }
}


답변

나는이 질문에 이미 답변되었지만 이것이 내가 사용하는 것입니다.

using (FileStream fStream = File.OpenRead(filename)) {
    return GetHash<MD5>(fStream)
}

어디 GetHash :

public static String GetHash<T>(Stream stream) where T : HashAlgorithm {
    StringBuilder sb = new StringBuilder();

    MethodInfo create = typeof(T).GetMethod("Create", new Type[] {});
    using (T crypt = (T) create.Invoke(null, null)) {
        byte[] hashBytes = crypt.ComputeHash(stream);
        foreach (byte bt in hashBytes) {
            sb.Append(bt.ToString("x2"));
        }
    }
    return sb.ToString();
}

아마도 가장 좋은 방법은 아니지만 유용 할 수 있습니다.


답변

여기 내가 찾은 약간 더 간단한 버전이 있습니다. 전체 파일을 한 번에 읽고 단일 using지시문 만 필요합니다 .

byte[] ComputeHash(string filePath)
{
    using (var md5 = MD5.Create())
    {
        return md5.ComputeHash(File.ReadAllBytes(filePath));
    }
}


답변

나는 파티에 늦었지만 실제로 솔루션을 구현하기 전에 테스트를 수행했다는 것을 알고 있습니다.

내장 MD5 클래스와 md5sum.exe 에 대한 테스트를 수행 했습니다 . 필자의 경우 내장 클래스는 md5sum.exe가 매 실행마다 16-18 초 정도 걸리는 13 초가 걸렸습니다.

    DateTime current = DateTime.Now;
    string file = @"C:\text.iso";//It's 2.5 Gb file
    string output;
    using (var md5 = MD5.Create())
    {
        using (var stream = File.OpenRead(file))
        {
            byte[] checksum = md5.ComputeHash(stream);
            output = BitConverter.ToString(checksum).Replace("-", String.Empty).ToLower();
            Console.WriteLine("Total seconds : " + (DateTime.Now - current).TotalSeconds.ToString() + " " + output);
        }
    }


답변

그리고 MD5를 계산하여 Azure Blob의 MD5와 일치하는지 확인해야하는 경우이 SO 질문과 답변이 도움이 될 수 있습니다. Azure에 업로드 된 BLOB의 MD5 해시가 로컬 컴퓨터의 동일한 파일과 일치하지 않습니다.


답변