Deff_Dev

[Unity/C#] Json 저장 및 base-64를 이용한 암호화/복호화 본문

Unity(유니티)/유니티 공부

[Unity/C#] Json 저장 및 base-64를 이용한 암호화/복호화

Deff_a 2024. 6. 22. 18:39

Json

게임 데이터를 저장할 때, Json을 많이 사용하다.

 

하지만 데이터를 그냥 저장하게 된다면 플레이어가 데이터를 확인하고 임의로 수정할 수 있는 보안 문제가 발생할 수 있습니다.

 

따라서 Json 데이터를 암호화/복호화하는 과정이 필요하다.


데이터 Json 저장/불러오기

유니티에서는 간단하게 데이터를 Json으로 변환하고 저장/불러오기를 할 수 있다.

using UnityEngine;
using System.IO;
using System;

public class PlayerDataManager : MonoBehaviour
{
    private string path;

    private void Awake()
    {
        path = Path.Combine(Application.persistentDataPath, "PlayerData.json");
    }

    public void DataSave(PlayerSaveData playerData)
    {
        string json = JsonUtility.ToJson(playerData, true); // 데이터 직렬화

        File.WriteAllText(path, encodedJson); // Json 파일 저장  
    }

    public void DataLoad()
    {
        if (!File.Exists(path)) // 파일이 존재하는지 검사
        {
            Debug.Log("데이터가 존재하지 않습니다 !");
            return;
        }
        
        string loadJson = File.ReadAllText(path); // Json파일 읽기

        PlayerSaveData playerData = JsonUtility.FromJson<PlayerSaveData>(decodedJson); // 데이터 변환
        
    }

}

 

JsonUtility 라이브러리를 이용하여 간단하게 데이터를 직렬화/역직렬화할 수 있다.

 

Json 파일 저장 위치

  • Application.persistentDataPath : C:\Users\사용자이름\AppData\LocalLow\회사이름 
  • Application.streamingAssetsPath : 해당 프로젝트폴더 경로\Assets 
  • Application.dataPath : 해당 프로젝트폴더

base-64를 이용한 암호화/복호화

base-64 인코딩은 이진 데이터를 문자열로 변환하는 방법이다.

using UnityEngine;
using System.IO;
using System;

public class PlayerDataManager : MonoBehaviour
{
    private string path;

    private void Awake()
    {
        path = Path.Combine(Application.persistentDataPath, "PlayerData.json");
    }

    public void DataSave(PlayerSaveData playerData)
    {
        string json = JsonUtility.ToJson(playerData, true); // 데이터 직렬화

        byte[] bytes = System.Text.Encoding.UTF8.GetBytes(json); // 직렬화된 문자열을 8비트 부호없는 정수로 변환
        string encodedJson = Convert.ToBase64String(bytes); // 변환된 바이트 배열을 base-64 인코딩된 문자열로 변환
        
        File.WriteAllText(path, encodedJson); // Json 파일 저장  
    }

    public void DataLoad()
    {
        if (!File.Exists(path)) // 파일이 존재하는지 검사
        {
            Debug.Log("데이터가 존재하지 않습니다 !");
            return;
        }
        
        string loadJson = File.ReadAllText(path); // Json파일 읽기

        byte[] bytes = Convert.FromBase64String(loadJson); // base-64 인코딩 문자열을 바이트 배열로 변환
        string decodedJson = System.Text.Encoding.UTF8.GetString(bytes); // 변환한 바이트 배열을 문자열로 변환

        PlayerSaveData playerData = JsonUtility.FromJson<PlayerSaveData>(decodedJson); // 데이터 변환
        
    }

}

 

 

위와 같이 코드를 작성하고 데이터를 Json 파일로 저장해본다.

 

데이터가 ASCII 문자로 변환되어 저장된 것을 볼 수 있다.

 

하지만 요즘 해킹 소프트웨어들은 인코딩을 인식하여 자동으로 디코딩을 해주기 때문에 이 방법은 보안성이 없는 방법이다.

 

보안성을 높이고 싶다면 AES와 같은 암호화 알고리즘을 사용하는 것이 좋다.


 

[참고 블로그]

 

[Unity] json 직렬화 저장 및 읽어오기 + 암호화 (utf8)

JSON이란 자바스크립트에 뿌리를 두고 있는 경량의 데이터 포맷입니다. 데이터가 표현될 때 클래스나 배열까지 표현이 가능하고 데이터 자체가 텍스트로 이루어져 있어 이해하기 쉽고 독립적이

codeposting.tistory.com