■ HMACSHA256 클래스에서 비밀 키를 이용한 해시값을 서명하는 방법을 보여준다.
▶ HMACSHA256 클래스 : 비밀 키를 이용한 해시값 서명하기 예제 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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 클래스 : 비밀 키를 이용한 해시값 서명하기 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
#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 |