• 티스토리 홈
  • 프로필사진
    개양반
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
개양반
  • 프로필사진
    개양반
    • Everybody Happyvirus (87)
      • Unity DOTS (19)
        • ECS Sample Projtect (8)
        • Unity.Physics (1)
        • TIP (9)
      • Unity Assets 추천 (6)
        • BG Database (5)
        • I2 Localization - 현지화 (1)
      • Unity 자습서 (15)
        • Addressable (4)
        • 유니티 + 파이어베이스 (0)
        • GamingServices (10)
      • 주식 이야기 (4)
        • 회사 소개 (2)
        • 회사 정보 (1)
        • 실적 발표 (0)
      • 일상 생활 (9)
        • 도서리뷰 (2)
        • 제품리뷰 (6)
      • 게임일기 (2)
        • 리그오브레전드 (2)
      • 게임소개 (4)
      • 게임리뷰 (7)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • 유니티 에셋 추천 - BG Database 암호화 #4
        2022년 12월 06일
        • 개양반
        • 작성자
        • 2022.12.06.:44

        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. 구매 링크

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

         

        저작자표시 비영리 변경금지 (새창열림)

        'Unity Assets 추천 > BG Database' 카테고리의 다른 글

        유니티 에셋 추천 - BG Database Addressable 사용 #5  (0) 2022.12.06
        유니티 에셋 추천 - BG Database 커스텀 로더 #3  (0) 2022.12.05
        유니티 에셋 추천 - BG Database 설정 #2  (8) 2022.12.05
        유니티 에셋 추천 - BG Database 소개 #1  (0) 2022.12.05
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바