■ HMACSHA256 클래스 : 비밀 키를 이용한 해시 값 서명하기 예제

----------------------------------------------------------------------------------------------------

using System;

 

string sourceFilePath = @"c:\source.txt";

string targetFilePath = @"c:\target.txt";

string password       = "1234";

byte[] keyByteArray   = CreateKeyArray(password);

 

SignHashValue(keyByteArray, sourceFilePath, targetFilePath);

 

bool result = ValidateHashValue(keyByteArray, targetFilePath);

 

Console.WriteLine(result);

----------------------------------------------------------------------------------------------------

 

■ HMACSHA256 클래스 : 비밀 키를 이용한 해시 값 서명하기

----------------------------------------------------------------------------------------------------

#region 키 배열 생성하기 - CreateKeyArray(password)

 

/// <summary>

/// 키 배열 생성하기

/// </summary>

/// <param name="password">패스워드</param>

/// <returns>키 배열</returns>

public byte[] CreateKeyArray(string password)

{

    Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, Encoding.UTF8.GetBytes("passwordSalt"));

 

    byte[] keyByteArray = rfc2898DeriveBytes.GetBytes(64);

 

    return keyByteArray;

}

 

#endregion

 

#region 해시 값 서명하기 - SignHashValue(keyByteArray, sourceFilePath, targetFilePath)

 

/// <summary>

/// 해시 값 서명하기

/// </summary>

/// <param name="keyByteArray">키 바이트 배열</param>

/// <param name="sourceFilePath">소스 파일 경로</param>

/// <param name="targetFilePath">타겟 파일 경로</param>

public void SignHashValue(byte[] keyByteArray, string sourceFilePath, string targetFilePath)

{

    using(HMACSHA256 hmacshaA256 = new HMACSHA256(keyByteArray))

    {

        using(FileStream inputFileStream = new FileStream(sourceFilePath, FileMode.Open))

        {

            using(FileStream outputFileStream = new FileStream(targetFilePath, FileMode.Create))

            {

                byte[] inputHashByteArray = hmacshaA256.ComputeHash(inputFileStream);

 

                inputFileStream.Position = 0;

 

                outputFileStream.Write(inputHashByteArray, 0, inputHashByteArray.Length);

 

                int    byteCountRead;

                byte[] bufferByteArray = new byte[1024];

 

                do

                {

                    byteCountRead = inputFileStream.Read(bufferByteArray, 0, 1024);

 

                    outputFileStream.Write(bufferByteArray, 0, byteCountRead);

                }

                while(byteCountRead > 0);

            }

        }

    }

}

 

#endregion

 

#region 해시 값 무결성 조사하기 - ValidateHashValue(keyByteArray, sourceFilePath)

 

/// <summary>

/// 해시 값 무결성 조사하기

/// </summary>

/// <param name="keyByteArray">키 바이트 배열</param>

/// <param name="sourceFilePath">소스 파일 경로</param>

/// <returns>해시 값 무결성 조사 결과</returns>

public bool ValidateHashValue(byte[] keyByteArray, string sourceFilePath)

{

    using(HMACSHA256 hmacsha256 = new HMACSHA256(keyByteArray))

    {

        byte[] inputHashByteArray = new byte[hmacsha256.HashSize / 8];

 

        using(FileStream inputFileStream = new FileStream(sourceFilePath, FileMode.Open))

        {

            inputFileStream.Read(inputHashByteArray, 0, inputHashByteArray.Length);

 

            byte[] computedHashByteArray = hmacsha256.ComputeHash(inputFileStream);

 

            for(int i = 0; i < inputHashByteArray.Length; i++)

            {

                if(inputHashByteArray[i] != computedHashByteArray[i])

                {

                    return false;

                }

            }

        }

    }

 

    return true;

}

 

#endregion

----------------------------------------------------------------------------------------------------

Posted by 사용자 icodebroker
TAG

댓글을 달아 주세요