Unity Assets 추천/BG Database

유니티 에셋 추천 - BG Database 암호화 #4

개양반 2022. 12. 6.
728x90

BG Database를 암호화하는 것에 대해 다뤄보겠다. 몰론, 해커가 당신의 클라이언트를 뚫고 디버깅이 가능한 상태라면 이런 조치는 손 쉽게 뚫려버린다. 암호화 키가 클라이언트에 있으니 어딘가에 있을 암호키를 찾으면 바로 뚫리는 것이다. 그럼에도 BGDatabase를 암호화하는 이유는 이중 삼중으로 안정장치를 한다는 것에 의미가 있는 것이다. 

 

1.  Encryptor 클래스 생성

데이터베이스를 암호화와 복호화하는 클래스를 생성하겠다. EncryptorExample.cs를 만들고 아래의 코드를 작성한다.

using System;
using System.IO;
using System.Security.Cryptography;
using BansheeGz.BGDatabase;

// 이것은 데이터 암호화를 구현하는 방법의 예일 뿐입니다. 
// 개인용 비밀번호가 노출되므로 해킹을 할 수 있는 사람은 금방 뚫습니다.
// 잼민이들 툴로 해킹하는건 막을 수 있으며 이중, 삼중으로 안전 장치를 만든다는 것에 의미가 있다고 본다.
public class EncryptorExample : BGEncryptor
{
    private static readonly byte[] SALT = { 0x26, 0xdc, 0xff, 0x00, 0xad, 0xed, 0x7a, 0xee, 0xc5, 0xfe, 0x07, 0xaf, 0x4d, 0x08, 0x22, 0x3c };
    private const string password = "gozldgkwlakTlqkftoRldi";
    
    public ArraySegment<byte> Encrypt(ArraySegment<byte> data, string config)
    {
        var plain = ToArray(data);
        MemoryStream memoryStream;
        CryptoStream cryptoStream;
        Rijndael rijndael = Rijndael.Create();
        Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, SALT);
        rijndael.Key = pdb.GetBytes(32);
        rijndael.IV = pdb.GetBytes(16);
        memoryStream = new MemoryStream();
        cryptoStream = new CryptoStream(memoryStream, rijndael.CreateEncryptor(), CryptoStreamMode.Write);
        cryptoStream.Write(plain, 0, plain.Length);
        cryptoStream.Close();
        var encrypted = memoryStream.ToArray();
        return new ArraySegment<byte>(encrypted, 0, encrypted.Length);
    }


    public ArraySegment<byte> Decrypt(ArraySegment<byte> data, string config)
    {
        var cipher = ToArray(data);
        MemoryStream memoryStream;
        CryptoStream cryptoStream;
        Rijndael rijndael = Rijndael.Create();
        Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, SALT);
        rijndael.Key = pdb.GetBytes(32);
        rijndael.IV = pdb.GetBytes(16);
        memoryStream = new MemoryStream();
        cryptoStream = new CryptoStream(memoryStream, rijndael.CreateDecryptor(), CryptoStreamMode.Write);
        cryptoStream.Write(cipher, 0, cipher.Length);
        cryptoStream.Close();
        var decrypt = memoryStream.ToArray();
        return new ArraySegment<byte>(decrypt, 0, decrypt.Length);
    }

    private byte[] ToArray(ArraySegment<byte> segment)
    {
        if (segment.Offset == 0 && segment.Count == segment.Array.Length) return segment.Array;

        var result = new byte[segment.Count];
        Buffer.BlockCopy(segment.Array, segment.Offset, result, 0, segment.Count);
        return result;
    }
}

위 코드를 깊게 알 필요는 없다. 궁금하다면 구글에 유니티 암호화 알고리즘 검색하면 유니티에서 제공하는 암호화 알고리즘 등 다양한 것들을 찾을 수 있다. 

 

2. 애드온 설정

BGDatabase 의 Addons로 가서 우측 맨 아래 Settings를 클릭한다. Enabled를 클릭한다. Encryptor class의 드롭다운 창을 클릭하면 위에서 만든 클래스를 목록에서 찾을 수 있다. 클릭해서 선택한다. Check encyptor를 클릭해서 암호화가 잘 되는지 확인한다. 

Encrypt SaveLoad addon data를 활성화하면 SaveLoad 애드온의 데이터도 암호화된다. SaveLoad에 대해서는 나중에 설명할 예정이다. 그냥 활성화 시켜 놓으면 된다. 모든 설정을 끝냈다. Save All 누르면 데이터가 암호화가 되고 런타임에서 데이터를 불러올 때 알아서 복호화를 진행한다.

 

3. 주의 사항

  • 데이터를 암호화한 후에는 암호기 클래스를 제거하면 안된다. 그렇지 않으면 데이터를 해독할 수 없다.
  • 암호화 알고리즘을 변경하려면 encryptor config를 사용하십시오. 더 이상 사용되지 않는 알고리즘을 제거하지마라. 그래야 이전 알고리즘으로 암호화된 데이터를 계속 해독할 수 있다.

 

4. 성능 테스트

아래의 코드를 작성해서 게임오브젝트에 넣으면 데이터를 로드하는데 걸리는 시간을 체크할 수 있다. 암호화 클래스를 None으로 했을때랑 비교해서 얼만큼의 성능 저하가 발생하는지 확인해보자.

using BansheeGz.BGDatabase;
using UnityEngine;

public class BGDatabaseLoadingBenchmark : MonoBehaviour
{
    void Start()
    {
        BGUtil.Measure("Database loading", () =>
        {
            var repo = BGRepo.I;
        });
    }
}

 

5. 구매 링크

아래의 링크로 구매하시면 유니티 에필리에이트로 활동하는 저에게 소정의 원고료가 지급되어 큰 힘이 됩니다.

 

댓글

💲 추천 글