[Unity][存檔][JSONUnity]加密數據

 

 

在場景中的實體保存固定的數據,

對字符串數據進行加密(D加密都能夠被破解,何況短短32位的密鑰加密)

 


在場景中的實體保存固定的數據

 

根據相關資料1,2

SaveData.json存儲的字符串顯示爲

{"Items":[{"jsonCubes":[{"m_FileID":894,"m_PathID":0},{"m_FileID":890,"m_PathID":0},{"m_FileID":892,"m_PathID":0}],"jsonDemon":{"m_FileID":874,"m_PathID":0}}]}

 


 

對字符串數據進行加密

根據參考資料1

對SaveData.json文件內容進行加密

{"Items":[{"jsonCubes":[{"m_FileID":894,"m_PathID":0},{"m_FileID":890,"m_PathID":0},{"m_FileID":892,"m_PathID":0}],"jsonDemon":{"m_FileID":874,"m_PathID":0}}]}

打開SaveData.json文件,顯示爲亂碼

1BxgAMrnYK9jgo4xybyujuoKBBp4pINTTlXTj41AWSEvmv1UMCRqCO9TRRS1hKMB5+veMwyyYgaLwBtQV0ItXlzb/pk3VvlwCYbhSgCoXZNhaeajkTYg/PXK38nsJiMaPzUQN9So+Q2oT+gT/hvS4O8vAfUlwvRZJKfZrxkXMVY=

讀取數據的時候通過 密鑰 進行解密,讀取數據。 

 

EncryptDecipherTool.cs代碼在參考資料1中,

那麼對32位的Key密鑰進行加密解密即可,阻擋一些作弊者。


 固定的數字能否成爲密鑰

1.通過獲得本機的MAC地址,來進行運算獲得32位數字的字符串。

MAC地址的長度爲48位(6個字節),通常表示爲12個16進制數,如:00-16-EA-AE-3C-40就是一個MAC地址

MAC地址16進制轉換,爲12位10進制的數字。

要考慮到 更換主機 進行遊戲,MAC地址也會跟隨改變 這種情況。

2.獲得上一次登錄的時間,本次登錄的時間

國家時間的時區不同,語言習慣YY/MM/DD,DD/MM/YY,

年月日小時分鐘秒,4+2+2+2+2+2=14位10進制數字

本次登錄軟件的時間,

3.

4.

5.

6.

 

獲得固定數字不夠32位,以及明碼,根據一些密碼的規則,

進行運算,或者是

1.隨機排列,例如,奇數與偶數呼喚

2.一些數學公式,來獲得32位密鑰。固定數字*數學公式=32位10進制密鑰

3.比如通過登錄時間獲得14位10進制數字YYM1M1DD/HHM2M2SS,其餘的18位數字,進行隨機重複的排列

YYM1M1DD/HHM2M2SS

SSHHM2M2M1M1YYDDYYDD

 


JSONDemon.cs相關資料2


using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.IO;
using System.Linq;//.OfType
using System.Collections;
using System.Text;
using System.Security.Cryptography;
using System;


public class JSONDemon : MonoBehaviour
{
    

    int num_i = 0;
    /// <summary>
    /// 部分存檔文件路徑
    /// </summary>
    string path_json = "/Resources/SaveData.json";///Resources/
    //"/123/Scene/Test_Scene/Test_JSON/SaveData.json"
    ///Resources/
    /// <summary>
    /// 完整的 存檔文件路徑
    /// </summary>
    string path;
    /// <summary>
    /// 讀取的JSON文本內容
    /// </summary>
    string jsonString;
    /// <summary>
    /// Test_JSONCube數組
    /// </summary>
    public Test_JSONCube[] test_JSONCubes;
    /// <summary>
    /// Test_JSONCube數組
    /// 讀取 存儲數據的 方塊,更新座標,rotation
    /// </summary>
    public Test_JSONCube[] test_JSONCubes_LoadCube;
    public Text text;

    private void Start()
    {
        foreach (Test_JSONCube cube in test_JSONCubes)
        {
            cube.StartCube();
        }
        //saveJSONCubeData();
        //loadJSONCubeDate();
    }
    /// <summary>
    /// 保存JSON數據
    /// </summary>
    public void saveJSONCubeData()
    {
        num_i = PlayerPrefs.GetInt("num_i");
        num_i = num_i + 1;
        //獲得 存檔.json 的文件路徑
        path = Application.streamingAssetsPath + path_json;
        DataJSONFile(path);
        string jsonStringZ = File.ReadAllText(path);//讀取 存檔文件.json的 所有文本內容,以String變量的形式讀取

        SaveData data = new SaveData();
        List<Test_JSONCube> saveListData = new List<Test_JSONCube>();
        /*foreach (Test_JSONCube jSONCube in test_JSONCubes)
        {
            saveListData.Add(jSONCube);
        }*///或者saveListData.AddRange(test_JSONCubes);
        saveListData.AddRange(test_JSONCubes);//或者foreach (Test_JSONCube jSONCube in test_JSONCubes)
        data.jsonCubes = saveListData;
        data.jsonDemon = this.GetComponent<JSONDemon>();

        
        List<SaveData> saveDatas = new List<SaveData>();
        saveDatas.Add(data);
        string jsonToSave = JsonHelper.ToJson(saveDatas.ToArray());

        jsonToSave = EncryptDecipherTool.Encrypt(jsonToSave);

        File.WriteAllText(Application.streamingAssetsPath + path_json, jsonToSave);
        //PlayerPrefs.SetString("Data", jsonToSave);
        //PlayerPrefs.Save();//保存在 PlayerPrefs.Save() 本地化保存數據

        if (text != null)
        {
            text.text = "SAVE COMPLETE:"+ num_i;
        }
        PlayerPrefs.SetInt("num_i", num_i);
    }//saveJSONCubeData()

    /// <summary>
    /// 讀取JSON數據
    /// </summary>
    public void loadJSONCubeDate()
    {
        //DataJSONFile();
        if (File.Exists(Application.streamingAssetsPath + path_json) == true)
        {
            num_i = PlayerPrefs.GetInt("num_i");
            //獲得 存檔.json 的文件路徑
            path = Application.streamingAssetsPath + path_json;
            string jsonToLoad = File.ReadAllText(path);//讀取 存檔文件.json的 所有文本內容,以String變量的形式讀取

            jsonToLoad = EncryptDecipherTool.Decipher(jsonToLoad);
            Debug.Log("jsonStringZ:" + jsonToLoad);
            if (jsonToLoad != ""
                && test_JSONCubes_LoadCube.Length > 0)//用一個完全空白的empty.json文件進行測試,爲了使得 獲取的 文本內容不爲空
            {
                SaveData[] saveDatas = JsonHelper.FromJson<SaveData>(jsonToLoad);
                //Load as Array
                //Test_JSONCube[] _tempLoadListDataZ = JsonHelper.FromJson<Test_JSONCube>(jsonToLoad);
                //Convert to List
                List<Test_JSONCube> loadListDataJsonCube = new List<Test_JSONCube>();

                for (int i = 0; i < saveDatas.Length; i++)
                {
                    loadListDataJsonCube = saveDatas[i].jsonCubes;
                    this.num_i = saveDatas[i].jsonDemon.num_i;

                }//for (int i =0; i < saveDatas.Length; i++)


                Debug.Log("-----------------------");
                foreach (Test_JSONCube cube in loadListDataJsonCube)
                {
                    Debug.Log("cubeName:" + cube.Name + "/Level:" + cube.Level + "/Position:" + cube.position + "/Rotation:" + cube.quaternion);

                    for (int i = 0; i < loadListDataJsonCube.Count; i++)
                    {
                        test_JSONCubes_LoadCube[i].setCube(cube);
                    }
                }
                for (int i = 0; i < loadListDataJsonCube.Count; i++)
                {
                    //test_JSONCubes_LoadCube[i];
                }

                Debug.Log("-----------------------");
                //Debug.Log("   loadListDataZ length: " + loadListDataZ.Count);
            }
        }
        if (text != null)
        {
            text.text = "LOAD COMPLETE:" + num_i;
        }
    }//loadJSONCubeDate()
    /// <summary>
    /// 判斷 保存的JSON 格式的空文本文件 是否存在,如果存在 就 複製粘貼 爲新的存檔文件。
    /// </summary>
    private void DataJSONFile(string path)// [Unity][File][JSON]file.copy的使用方法代碼動態創建.json文件
    {
        Debug.Log(".........1"+ File.Exists(Application.streamingAssetsPath + "/Resources/empty.json"));
        if (File.Exists(Application.streamingAssetsPath + "/Resources/empty.json") == true
            && File.Exists(path) == false)//Application.dataPath + path_json
        {
            Debug.Log(".........2");
            File.Copy(Application.streamingAssetsPath + "/Resources/empty.json", path);
            //Directory.CreateDirectory(path);
        }
        //Directory.CreateDirectory(path);
    }//DataJSONFile()
    
}//JSONDemon

[System.Serializable]
public class SaveData
{
    public List<Test_JSONCube> jsonCubes = new List<Test_JSONCube>();
    public JSONDemon jsonDemon;
}

 


 

相關資料:

1.

 

[Unity][存檔][JSONUnity]讀取方塊數據爲什麼只能保存instanceID

2.

 

[Unity][存檔][JSONUnity]場景中的實體是否能保存數據

3.

4.

 

參考資料:

1.

 

[Unity優化]數據的加密與解密

2.

 

【Unity】Unity數據加密

3.

 

Unity——獲取本機MAC地址

4.

5.

6.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章