본문 바로가기

Unity/정보

[Unity 유니티] 유니티에서 Json으로 데이터 관리하기 - AES 암호화 / 복호화 (3)

Json 데이터 암호화 / 복호화

Json 파일로 데이터를 저장하는 것은 간편하지만, 파일이 그대로 노출되면 데이터가 쉽게 읽힐 수 있다. 민감한 데이터는 암호화하여 저장하는 것이 좋다. 이번 포스팅에서는 Unity에서 Json 파일을 암호화하여 저장하고 불러오는 방법을 소개한다.


1. AES 암호화 설정하기

Unity에서는 System.Security.Cryptography 네임스페이스를 이용해 AES 암호화를 쉽게 구현할 수 있다. 아래 예시는 Json 데이터를 AES 방식으로 암호화해 파일에 저장하는 코드다.

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using UnityEngine;

[System.Serializable]
public class PlayerData
{
    public string playerName;
    public int score;
}

public class JsonEncryptExample : MonoBehaviour
{
    private string filePath;
    private string encryptionKey = "1234567890123456"; // 16자리 키

    void Start()
    {
        filePath = Application.persistentDataPath + "/playerData.json";
        PlayerData playerData = new PlayerData { playerName = "Player1", score = 100 };
        
        SaveDataEncrypted(playerData);
        
        PlayerData loadedData = LoadDataEncrypted();
        if (loadedData != null)
        {
            Debug.Log("불러온 데이터: " + loadedData.playerName + ", " + loadedData.score);
        }
    }

    void SaveDataEncrypted(PlayerData data)
    {
        string jsonData = JsonUtility.ToJson(data);
        string encryptedData = Encrypt(jsonData, encryptionKey);
        File.WriteAllText(filePath, encryptedData);
        Debug.Log("Json 파일이 암호화되어 저장됨: " + filePath);
    }

    PlayerData LoadDataEncrypted()
    {
        if (File.Exists(filePath))
        {
            string encryptedData = File.ReadAllText(filePath);
            string decryptedData = Decrypt(encryptedData, encryptionKey);
            return JsonUtility.FromJson<PlayerData>(decryptedData);
        }
        Debug.LogWarning("파일이 존재하지 않습니다.");
        return null;
    }

    string Encrypt(string text, string key)
    {
        using (Aes aes = Aes.Create())
        {
            aes.Key = Encoding.UTF8.GetBytes(key);
            aes.IV = new byte[16]; // IV는 0으로 초기화하여 사용
            ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
            byte[] textBytes = Encoding.UTF8.GetBytes(text);

            byte[] encryptedBytes = encryptor.TransformFinalBlock(textBytes, 0, textBytes.Length);
            return Convert.ToBase64String(encryptedBytes);
        }
    }

    string Decrypt(string encryptedText, string key)
    {
        using (Aes aes = Aes.Create())
        {
            aes.Key = Encoding.UTF8.GetBytes(key);
            aes.IV = new byte[16]; // IV는 암호화할 때와 동일하게 설정
            ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
            byte[] encryptedBytes = Convert.FromBase64String(encryptedText);

            byte[] decryptedBytes = decryptor.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length);
            return Encoding.UTF8.GetString(decryptedBytes);
        }
    }
}

설명

  • Encrypt : Json 문자열을 AES 방식으로 암호화해 Base64 형식으로 변환한다.
  • Decrypt : 암호화된 Base64 문자열을 해독하여 원래의 Json 문자열로 복원한다.
  • encryptionKey : AES 암호화를 위한 16자리 키로, 데이터 보안을 위해 중요한 요소다.

SaveDataEncrypted와 LoadDataEncrypted 함수를 이용해 Json 데이터를 안전하게 저장하고 불러올 수 있다. 게임의 민감한 데이터를 안전하게 관리하고 싶을 때 이 방법을 적용할 수 있다.


주의사항

AES 암호화 키는 외부에 노출되지 않도록 신중히 관리해야 한다. 개발 단계에서는 하드코딩해 사용하지만, 실제 배포 시에는 서버를 이용해 별도의 보안 방법으로 관리하는 것이 좋다. 

완벽한 암호화 방법은 아니지만 Json 데이터를 암호화하여 저장하면 암호화 없이 저장하는 것보다 게임 데이터를 더 안전하게 보호할 수 있다.