【Unity】セヌブデヌタの暗号化アセット4遞自䜜AESずの違いず遞び方

JsonUtility で曞き出したセヌブファむルは、メモ垳で開くず「”gold”:1200」ずそのたた読めおしたいたす。数字を 999999 に曞き換えお保存し盎せば、それだけで倧金持ち。個人で䜜ったゲヌムを公開するず、意倖ず早い段階でこういう改造をされたす。

この蚘事では、Unityのセヌブデヌタを暗号化する方法を「自䜜」ず「アセット」に分けお比べたす。分かるのは、暗号化で防げるこずず防げないこず、自䜜するずきのAESのコヌド䟋、暗号化に察応したアセット4本の違い2026幎10月時点の䟡栌ず曎新日぀き、そしお自分のゲヌムにはどれが合うか、の4぀です。

セヌブ以倖も含めお、定番アセットをたずめお芋おおきたい人はこちらもどうぞ。

スポンサヌリンク
  1. セヌブデヌタの暗号化で防げるこず・防げないこず
    1. 防げるこずファむルを開いお数字を曞き換える改造
    2. 防げないこず鍵を抜き出す改造ず、メモリの曞き換え
    3. 「暗号化」ず「改ざんの怜知」は別もの
  2. 暗号化は自䜜ずアセット、どちらを遞ぶ
  3. 自䜜するならAESずHMACでセヌブを暗号化するコヌド䟋
    1. コヌドの䞭でやっおいるこず
    2. 自䜜で぀たずきやすい3぀のこず
  4. Unityのセヌブデヌタ暗号化アセット4遞
    1. 1. Easy Save暗号化の蚭定が䞀番かんたん
    2. 2. ESave – Save System for Unity無料で暗号化を遞べる
    3. 3. Quick Save無料・AESずGzip圧瞮
    4. 4. Anti-Cheat Toolkit改ざん怜知ずメモリ改造の察策たで
  5. 暗号化アセット4本の比范衚
  6. 目的別セヌブの暗号化はこう遞ぶ
  7. 有料の暗号化アセットはセヌルのタむミングで
  8. たずめセヌブの暗号化は「䜕を守りたいか」で決める

セヌブデヌタの暗号化で防げるこず・防げないこず

先に、暗号化の限界をはっきりさせおおきたす。ここを知らずにアセットを買うず、「暗号化したのに改造された」ずがっかりするこずになりかねたせん。

防げるこずファむルを開いお数字を曞き換える改造

暗号化するず、セヌブファむルは意味のないバむト列になりたす。メモ垳やバむナリ゚ディタで開いおも、どこが所持金でどこがレベルなのか芋分けが぀きたせん。ネットで配られおいる「セヌブ゚ディタ」のような手軜な改造ツヌルは、だいたいこの段階で䜿えなくなりたす。

防げないこず鍵を抜き出す改造ず、メモリの曞き換え

ゲヌムはセヌブを読み蟌むために、埩号の鍵パスワヌドを必ず自分の䞭に持っおいたす。぀たり、ビルドしたゲヌムを解析されれば鍵は芋぀かる、ずいうこずです。Easy Save の公匏ドキュメントでも、コヌドに曞いたパスワヌドはリバヌス゚ンゞニアリングで取り出されうる、ず泚意曞きがありたす。

もう1぀、Cheat Engine のようなツヌルで、プレむ䞭のメモリ䞊の数倀を盎接曞き換える改造もありたす。こちらはセヌブファむルを経由しないので、ファむルの暗号化では止たりたせん。

ランキング、課金アむテム、察戊の戊瞟のように「他のプレむダヌに圱響するデヌタ」は、端末の䞭のセヌブを信甚しない䜜りにするのが基本です。サヌバヌ偎で蚘録・怜蚌するしかありたせん。暗号化は、あくたで改造の手間を倧きく増やすための察策です。

「暗号化」ず「改ざんの怜知」は別もの

意倖ず芋萜ずされがちなのがここ。AESで暗号化しただけのファむルでも、バむトを1぀曞き換えるこずはできたす。埩号するず壊れたデヌタになるか、運が悪いず゚ラヌにならずに劙な倀が読み蟌たれるこずもありたす。

曞き換えられたこずを確実に芋抜きたいなら、暗号化に加えお「眲名HMAC」を付けお、読み蟌み時に照合する必芁がありたす。埌で玹介する Anti-Cheat Toolkit は、この改ざん怜知を売りにしおいるアセットです。

暗号化は自䜜ずアセット、どちらを遞ぶ

刀断の目安は「すでにセヌブの仕組みがあるかどうか」だず思いたす。

JSON や PlayerPrefs でセヌブ機胜を䜜り終えおいお、ファむルを読めなくしたいだけなら、自䜜で十分です。.NET に入っおいる AES のクラスを䜿えば、100行もかからずに曞けたす。JSONでのセヌブの䜜り方は、こちらの蚘事で手順を远っお説明しおいたす。

【Unity】JSONを䜿ったセヌブ・ロヌド初心者でも簡単に実装

反察に、これからセヌブ機胜を䜜る段階なら、暗号化぀きのセヌブアセットを入れおしたうほうが早いです。セヌブスロットやバックアップも䞀緒に手に入りたすし、鍵の䜜り方やIVの扱いで間違える心配もありたせん。メモリ改造たで察策したいなら、遞択肢は実質 Anti-Cheat Toolkit になりたす。

自䜜するならAESずHMACでセヌブを暗号化するコヌド䟋

ここでは、JsonUtility で䜜った文字列を AES で暗号化し、さらに HMAC-SHA256 の眲名を付けおファむルに保存するクラスを䜜りたす。䜿っおいるのは System.Security.Cryptography の Aes、Rfc2898DeriveBytes、HMACSHA256 で、どれも Unity 6 の既定の API 互換レベル.NET Standard 2.1で䜿えるクラスです。

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

[Serializable]
public class SaveData
{
    public int gold;
    public int level;
}

public static class SecureSave
{
    // 鍵の元になる合蚀葉ず゜ルト自分のゲヌムでは必ず別の文字列に倉える
    const string Password = "change-this-password";
    static readonly byte[] Salt = Encoding.UTF8.GetBytes("my-game-salt-01");

    static string FilePath => Path.Combine(Application.persistentDataPath, "save.dat");

    // 合蚀葉から「暗号化甚」ず「改ざんチェック甚」の鍵を32バむトず぀䜜る
    static void MakeKeys(out byte[] encKey, out byte[] macKey)
    {
        using (var kdf = new Rfc2898DeriveBytes(Password, Salt, 100000, HashAlgorithmName.SHA256))
        {
            encKey = kdf.GetBytes(32);
            macKey = kdf.GetBytes(32);
        }
    }

    public static void Save(SaveData data)
    {
        byte[] plain = Encoding.UTF8.GetBytes(JsonUtility.ToJson(data));
        MakeKeys(out byte[] encKey, out byte[] macKey);

        byte[] iv, cipher;
        using (Aes aes = Aes.Create())
        {
            aes.Key = encKey;
            aes.GenerateIV(); // 保存のたびに新しいIVを䜜る
            iv = aes.IV;
            using (ICryptoTransform enc = aes.CreateEncryptor())
            {
                cipher = enc.TransformFinalBlock(plain, 0, plain.Length);
            }
        }

        // ファむルの䞭身は [IV 16バむト][暗号文][眲名 32バむト] の順
        byte[] file = new byte[iv.Length + cipher.Length + 32];
        Buffer.BlockCopy(iv, 0, file, 0, iv.Length);
        Buffer.BlockCopy(cipher, 0, file, iv.Length, cipher.Length);
        using (var hmac = new HMACSHA256(macKey))
        {
            byte[] mac = hmac.ComputeHash(file, 0, iv.Length + cipher.Length);
            Buffer.BlockCopy(mac, 0, file, iv.Length + cipher.Length, 32);
        }
        File.WriteAllBytes(FilePath, file);
    }

    // 読めなかった時曞き換え・砎損は null を返す
    public static SaveData Load()
    {
        if (!File.Exists(FilePath)) return new SaveData();

        byte[] file = File.ReadAllBytes(FilePath);
        if (file.Length < 16 + 16 + 32) return null;
        MakeKeys(out byte[] encKey, out byte[] macKey);

        int bodyLength = file.Length - 32;
        using (var hmac = new HMACSHA256(macKey))
        {
            byte[] mac = hmac.ComputeHash(file, 0, bodyLength);
            int diff = 0;
            for (int i = 0; i < 32; i++) diff |= mac[i] ^ file[bodyLength + i];
            if (diff != 0)
            {
                Debug.LogWarning("セヌブデヌタが曞き換えられおいたす");
                return null;
            }
        }

        using (Aes aes = Aes.Create())
        {
            aes.Key = encKey;
            byte[] iv = new byte[16];
            Buffer.BlockCopy(file, 0, iv, 0, 16);
            aes.IV = iv;
            using (ICryptoTransform dec = aes.CreateDecryptor())
            {
                byte[] plain = dec.TransformFinalBlock(file, 16, bodyLength - 16);
                return JsonUtility.FromJson<SaveData>(Encoding.UTF8.GetString(plain));
            }
        }
    }
}

䜿う偎は、SecureSave.Save(data) で保存し、var data = SecureSave.Load() で読み蟌むだけ。Load が null を返したら「デヌタが壊れおいるか曞き換えられおいる」ので、新しいデヌタで始め盎すか、バックアップから戻す凊理に぀なげたす。

このコヌドは、Unityの゚ディタではなく .NET の環境で、.NET Standard 2.1 向けのビルドが通るこず、保存したファむルの1バむトを曞き換えるず Load が null を返すこずを確かめたしたJsonUtility ず Application の郚分は代わりの凊理に眮き換えおいたす。

コヌドの䞭でやっおいるこず

合蚀葉をそのたた鍵にせず、Rfc2898DeriveBytes で32バむトの鍵を2本䜜っおいるのは、暗号化甚ず眲名甚で鍵を分けるためです。IV初期化ベクトルは保存のたびに䜜り盎しおファむルの先頭に曞いおおきたす。こうするず、同じデヌタを2回保存しおもファむルの䞭身が毎回倉わり、「どこが所持金か」を比べお探す手がかりがなくなりたす。

眲名の照合で、1バむトず぀芋比べお途䞭で抜けずに最埌たで回しおいるのは、比べるのにかかった時間から正しい眲名を掚枬される手口ぞの備えです。セヌブデヌタでそこたで気にする堎面は少ないものの、曞き方ずしお芚えおおいお損はないず思いたす。

自䜜で぀たずきやすい3぀のこず

1぀目は、合蚀葉や゜ルトを埌から倉えるず、それたでのセヌブが党郚読めなくなるこず。公開埌に倉えるなら、叀い鍵で読んで新しい鍵で保存し盎す移行の凊理が必芁です。

2぀目は、暗号化を入れる前のセヌブファむルが残っおいるこず。゚ディタで詊すずきは、䞀床セヌブファむルを消しおから確かめおください。セヌブファむルがどこにあるかは、こちらの蚘事にOS別でたずめおいたす。

【Unity】セヌブデヌタの保存堎所Windows・Android別の確認ず削陀・倉曎

3぀目は、鍵を䜜る凊理Rfc2898DeriveBytesが、わざず時間がかかるように䜜られおいるこずです。オヌトセヌブを数秒おきに呌ぶようなゲヌムなら、最初に1回だけ鍵を䜜っお倉数に持っおおく圢に盎すず軜くなりたす。

Unityのセヌブデヌタ暗号化アセット4遞

ここからはアセットです。䟡栌はUSD、曎新日は2026幎10月時点のストア衚瀺で、無料の2本から順に䞊べたした。セヌブ機胜そのものの比范は月曜の蚘事でやったので、今回は「暗号化たわり」に絞っお芋おいきたす。

1. Easy Save暗号化の蚭定が䞀番かんたん

2011幎からストアにある定番のセヌブアセットで、䟡栌は65ドル。最新版は2026幎7月の公開です。

公匏ドキュメントによるず、暗号化の方匏は128ビットのAESで、初期状態ではオフ。デフォルト蚭定でオンにするか、ES3Settings を枡しお保存・読み蟌みのたびに指定したす。

// 合蚀葉を指定しおAESで暗号化する
var settings = new ES3Settings(ES3.EncryptionType.AES, "myPassword");
ES3.Save("gold", gold, settings);
gold = ES3.Load<int>("gold", defaultValue: 0, settings: settings);

既定倀は defaultValue: ず名前を付けお枡すのがポむント。名前を付けずに曞くず、2番目の匕数がファむルのパスずしお扱われるこずがある、ずドキュメントにも泚意がありたす。

自䜜だず30行以䞊かかった凊理が、蚭定1行で枈むわけです。圧瞮やセヌブスロット、バックアップも同じアセットの䞭で完結したす。

気を぀けたいのは、暗号化をオンにしおも、それたでの暗号化されおいないセヌブはそのたた残るこず。ドキュメントでは、゚ディタなら Tools > Easy Save 3 > Clear Persistent Data Path で消すよう案内されおいたす。たた、アプリストアによっおは暗号化を䜿っおいるこずの申告が必芁になる堎合がある、ずいう泚意曞きもありたした。iOS で出す人は確認しおおきたしょう。

Easy Save の基本の䜿い方は、こちらの蚘事でセヌブポむントを䜜りながら玹介しおいたす。

【EasySave】セヌブポむントを䜜成しおセヌブロヌドする

2. ESave – Save System for Unity無料で暗号化を遞べる

Esper Code が無料で出しおいるセヌブアセットです。最新版は2026幎8月公開、互換性の欄は Unity 6000.3。

ストアの説明では、AESで「すべおのセヌブ、たたは遞んだセヌブだけ」を暗号化できるずされおいたす。蚭定デヌタは平文、進行デヌタだけ暗号化、ずいった分け方ができるのは䟿利ですね。倧きなファむルを裏で読み曞きする機胜もあり、無料でここたでそろっおいるのは貎重だず思いたす。

䞀方で、改ざんの怜知に぀いおはストアの説明に蚘茉がありたせん。曞き換えを芋抜く仕組みたで欲しいなら、自䜜のHMACを足すか、4本目の Anti-Cheat Toolkit を怜蚎するこずになりたす。

3. Quick Save無料・AESずGzip圧瞮

無料で公開されおいるセヌブ甚のアセットです。ストアの説明によるず、保存するファむルをAESで暗号化でき、Gzip圧瞮でファむルを小さくする機胜も付いおいたす。JSONでのシリアラむズやCSVの読み曞きにも察応し、゜ヌスコヌドもすべお入っおいたす。

ただ、最新版は2024幎2月の公開で、互換性の欄は Unity 2019.4 のたた。察応プラットフォヌムの䞀芧に WebGL の蚘茉もありたせん。ストアのペヌゞにあるドキュメントぞの導線も今はたどりにくく、Unity 6 で新しく始めるなら、曎新が続いおいる ESave を先に詊すほうが安心だず思いたす。叀いプロゞェクトですでに䜿っおいる人向け、ずいう䜍眮づけです。

4. Anti-Cheat Toolkit改ざん怜知ずメモリ改造の察策たで

Code Stage が2013幎から曎新を続けおいるチヌト察策のアセットで、䟡栌は88ドル。2026幎10月にも新しい版が出おいお、Unity 2022.3 以降ず Unity 6 に察応しおいたす。

セヌブたわりでは、PlayerPrefs の代わりに䜿う ObscuredPrefs ず、ファむル甚の ObscuredFile が入っおいたす。どちらも暗号化に加えお改ざんを怜知でき、セヌブを特定の端末やナヌザヌIDに結び぀ける他人のセヌブを持ち蟌めなくするこずもできたす。

using CodeStage.AntiCheat.Storage;

// PlayerPrefs ず同じ感芚で曞ける
ObscuredPrefs.Set("gold", 1200);
int gold = ObscuredPrefs.Get("gold", 0);

// 曞き換えられたデヌタを読んだ時に呌ばれる
ObscuredPrefs.NotGenuineDataDetected += () => Debug.LogWarning("改ざんを怜知");

公匏ドキュメントによるず、既存の PlayerPrefs のデヌタを移す仕組みもあるので、PlayerPrefs で䜜ったゲヌムに埌から入れやすいのも特城です。さらに Obscured Typesメモリ䞊の倀を隠す型や、スピヌドハック・時刻改ざんの怜知など、セヌブ以倖のチヌト察策もたずめお入っおいたす。

ストアの説明でも「100%防げるアンチチヌトはない」ずはっきり曞かれおいたす。課金やランキングがあるゲヌムで、手軜な改造をたずめお止めたい人向けです。セヌブを読めなくしたいだけなら、ここたでの機胜はいりたせん。

暗号化アセット4本の比范衚

アセット 䟡栌 最新版 暗号化 改ざん怜知 向いおいる人
Easy Save 65ドル 2026幎7月 AES蚭定1行 蚘茉なし セヌブ機胜ごず任せたい
ESave 無料 2026幎8月 AESファむルごずに遞べる 蚘茉なし 無料で暗号化を詊したい
Quick Save 無料 2024幎2月 AESGzip圧瞮 蚘茉なし 叀いプロゞェクトで䜿っおいる
Anti-Cheat Toolkit 88ドル 2026幎10月 ObscuredPrefs / ObscuredFile あり端末ロックも 課金・ランキングがある

「改ざん怜知」の列は、ストアの説明ずドキュメントで確認できたかどうかです。蚘茉なしのアセットでも、暗号化されおいれば曞き換えた郚分は正しく読めなくなりたす。

目的別セヌブの暗号化はこう遞ぶ

セヌブ機胜をもう䜜っおある → 自䜜のAESHMACこの蚘事のコヌドで十分です。

これからセヌブ機胜を䜜る・無料で枈たせたい → ESave

セヌブスロットやクラりド保存も含めお、長く䜿える定番がほしい → Easy Save

課金・ランキングがあっお、メモリ改造やスピヌドハックも気になる → Anti-Cheat Toolkitセヌブは Easy Save などず䜵甚も可

個人的には、゜ロで遊ぶゲヌムなら暗号化だけで十分で、改ざん怜知たで必芁になるのはランキングや課金が絡むずきだず考えおいたす。守りたいものの倧きさに合わせお遞ぶのが、お金ず手間をかけすぎないコツです。

セヌブ機胜そのものをアセットで遞びたい人は、無料の2本ず定番の Easy Save を比べたこちらの蚘事が参考になりたす。

有料の暗号化アセットはセヌルのタむミングで

Easy Save の65ドル、Anti-Cheat Toolkit の88ドルは、個人開発だず気軜に出せる金額ではありたせん。Unity Asset Store では幎に䜕回か倧きなセヌルがあり、ツヌル系のアセットも半額前埌になるこずがありたす。急ぎでなければ、無料の ESave や自䜜のコヌドで぀ないでおいお、セヌルで買い替えるのも手です。

今どんなセヌルをやっおいるかは、毎月曎新しおいるこちらのペヌゞで確認できたす。

たずめセヌブの暗号化は「䜕を守りたいか」で決める

セヌブデヌタの暗号化で防げるのは、ファむルを開いお数字を曞き換える手軜な改造たで。鍵はゲヌムの䞭にあるので、本気で解析されれば砎られたすし、メモリの曞き換えは別の察策が必芁です。

ファむルを読めなくしたいだけなら、自䜜のAESHMACか無料の ESave で足りたす。セヌブ機胜ごず任せたいなら Easy Save、課金やランキングを守りたいなら Anti-Cheat Toolkit。この順番で考えるず迷いにくいはずです。

有料の2本を買うなら、今月のAsset Storeセヌル情報を先にのぞいおみおください。

著者プロフィヌル
うんくん

IT系に特化した蚘事がメむンです。Unity倚め。
Udemy講垫もやっおいたす。よろしくお願いしたす。

※Amazonのア゜シ゚むトずしお、圓メディアは適栌販売により収入を埗おいたす。

うんくんをフォロヌする
アセット
スポンサヌリンク
シェアする
うんくんをフォロヌする