프로그래밍/C#

C#에서의 암호화: 안전한 애플리케이션 개발의 필수 요소

shimdh 2025. 9. 17. 09:50
728x90

오늘날의 디지털 환경에서 보안은 매우 중요합니다. 개발자로서 우리는 애플리케이션이 민감한 데이터를 무단 접근과 변조로부터 보호하도록 해야 합니다. 이를 위해 암호화는 정보를 인가된 당사자만 읽거나 이해할 수 있는 형식으로 인코딩하는 기술을 제공하여 중요한 역할을 합니다.

암호화 이해하기

암호화는 다양한 기술을 통해 통신과 데이터를 보호하는 과학입니다. 이는 평문(읽을 수 있는 데이터)을 암호문(인코딩된 데이터)으로 변환하는 것을 포함하며, 적절한 키나 방법을 가진 사람만이 이를 다시 평문으로 되돌릴 수 있습니다. 암호화 시스템의 두 가지 주요 유형은 다음과 같습니다:

  • 대칭 키 암호화: 암호화와 복호화에 동일한 키를 사용합니다.
  • 비대칭 키 암호화: 암호화에 공개 키를, 복호화에 개인 키를 사용하는 키 쌍을 활용합니다.
728x90

C#에서의 암호화 중요성

고급 C#을 다룰 때 암호화를 이해하는 것은 필수적입니다. 그 이유는 다음과 같습니다:

  1. 데이터 보호: 비밀번호, 개인 식별 번호(PIN), 신용카드 정보와 같은 민감한 정보를 안전하게 저장합니다.
  2. 무결성 검증: 해시 함수를 사용하여 전송 중 데이터가 변경되지 않았음을 확인합니다.
  3. 인증: 리소스에 접근하려는 사용자나 시스템의 신원을 확인합니다.

실용적인 예제

.NET 라이브러리를 사용하여 C#에서 암호화 작업을 구현하는 몇 가지 실용적인 예제를 살펴보겠습니다.

1. 데이터 해싱

해싱은 입력 데이터를 고정 크기의 문자열 표현인 해시 값으로 변환하며, 이는 원래 형태로 되돌릴 수 없습니다. 이는 비밀번호를 안전하게 저장하는 데 유용합니다.

using System;
using System.Security.Cryptography;
using System.Text;

public class HashExample
{
    public static void Main()
    {
        string password = "mySecurePassword";
        string hashedPassword = ComputeSha256Hash(password);

        Console.WriteLine($"Original Password: {password}");
        Console.WriteLine($"Hashed Password: {hashedPassword}");
    }

    public static string ComputeSha256Hash(string rawData)
    {
        using (SHA256 sha256Hash = SHA256.Create())
        {
            byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(rawData));
            StringBuilder builder = new StringBuilder();
            foreach (byte b in bytes)
            {
                builder.Append(b.ToString("x2"));
            }
            return builder.ToString();
        }
    }
}

2. 대칭 암호화

대칭 암호화를 사용하면 사용자 자격 증명과 같은 민감한 정보를 저장하거나 네트워크를 통해 전송하기 전에 암호화할 수 있습니다.

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

public class SymmetricEncryptionExample
{
    private static readonly byte[] Key = Convert.FromBase64String("YourBase64EncodedKeyHere");

    public static void Main()
    {
        string originalText = "Sensitive Information";

        // Encrypting text
        var encryptedText = Encrypt(originalText);

        // Decrypting text
        var decryptedText = Decrypt(encryptedText);

        Console.WriteLine($"Original Text: {originalText}");
        Console.WriteLine($"Encrypted Text: {encryptedText}");
        Console.WriteLine($"Decrypted Text: {decryptedText}");
    }

    public static string Encrypt(string plainText)
    {
         using Aes aesAlg = Aes.Create();
         aesAlg.Key = Key; 
         aesAlg.GenerateIV();

         ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

         using MemoryStream msEncrypt = new MemoryStream();
         msEncrypt.Write(aesAlg.IV, 0, aesAlg.IV.Length); // Prepend IV to encrypted message

         using (CryptoStream csEncrypt =
             new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
         {
             using StreamWriter swEncrypt =
                 new StreamWriter(csEncrypt);
             swEncrypt.Write(plainText);
         }

         return Convert.ToBase64String(msEncrypt.ToArray());
     }

     public static string Decrypt(string cipherText)
     {
          byte[] fullCipher = Convert.FromBase64String(cipherText);

          byte[] iv = new byte[16];
          Array.Copy(fullCipher, iv, iv.Length);

          byte[] cipherWithoutIvSize= new byte[fullCipher.Length - iv.Length];
          Array.Copy(fullCipher, iv.Length, cipherWithoutIvSize, 0,
              cipherWithoutIvSize.Length);

          using Aes aesAlg= Aes.Create(); 
          aesAlg.Key= Key; 

          aesAlg IV= iv; 

           ICryptoTransform decryptor=aes Alg.CreateDecryptor(aes Alg.Key,aes Alg IV); 

           using MemoryStream msDecrypt=new MemoryStream(cipherWithoutIvSize); 
           using CryptoStream csDecrypt=new CryptoStream(msDecrypt,decryptor,CryptoStreamMode.Read) 
           {  
               using StreamReader srDecrypt=new StreamReader(csDecrypt) 
               {  
                   return srDecrypt.ReadToEnd();  
               }  
           }  
      }   
}

3. 비대칭 암호화

비대칭 암호화는 비밀 키를 직접 공유하지 않고도 당사자 간의 통신을 보호하기 위해 개인 키와 공개 키 쌍을 사용합니다.

// Example omitted due to complexity but typically involves RSA algorithm.
// Use RSACryptoServiceProvider from System.Security.Cryptography namespace.

결론

고급 C# 프로그래밍에서 암호화를 이해하는 것은 민감한 정보를 책임감 있게 처리하는 안전한 애플리케이션을 만드는 데 필요한 강력한 도구를 개발자에게 제공합니다. 비밀번호 저장을 위한 해싱 기술을 활용하거나 네트워크를 통해 기밀 데이터를 전송할 때 대칭/비대칭 암호화 방법을 사용함으로써 무단 접근과 침해로부터 강력한 보호를 보장하며, 소프트웨어 솔루션에 대한 사용자 신뢰를 유지할 수 있습니다.

이러한 개념을 계속 탐구하십시오. 이는 현대 소프트웨어 보안 관행이 서 있는 중요한 기초를 제공합니다!

728x90