Где хранить данные помимо PlayerPrefs

Программирование на Юнити.

Где хранить данные помимо PlayerPrefs

Сообщение DikSan 05 июл 2017, 19:20

При хранении данных в PlayerPrefs обладая рут правами можно зайти в /data/data/com.*--*.*--* и там все значения, находящиеся в PlayerPrefs как на ладони. Можно ли как-то хранить данные в других, менее открытых файлах?
DikSan
UNIт
 
Сообщения: 52
Зарегистрирован: 23 июн 2017, 16:34

Re: Где хранить данные помимо PlayerPrefs

Сообщение seaman 05 июл 2017, 19:33

У себя на сервере
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Где хранить данные помимо PlayerPrefs

Сообщение DikSan 05 июл 2017, 20:46

seaman писал(а):У себя на сервере

Жаль.
Еще один вопрос не по теме. На форуме нужно как-то закрывать свои темы/давать им статус [решено] и т.д. и если нужно, то как? :)
DikSan
UNIт
 
Сообщения: 52
Зарегистрирован: 23 июн 2017, 16:34

Re: Где хранить данные помимо PlayerPrefs

Сообщение samana 05 июл 2017, 21:10

Вы ведь можете сохранять данные не только с помощью PlayerPrefs, например https://www.youtube.com/watch?v=5YXGtXwxaIM
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Где хранить данные помимо PlayerPrefs

Сообщение samana 05 июл 2017, 21:12

DikSan писал(а):На форуме нужно как-то закрывать свои темы/давать им статус [решено] и т.д. и если нужно, то как? :)

Можно отредактировать ваше первое сообщение в теме и добавить к заголовку любое слово.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Где хранить данные помимо PlayerPrefs

Сообщение seaman 05 июл 2017, 21:18

можете сохранять данные не только с помощью PlayerPrefs

Любые данные на компьютере/смартфоне пользователя могут быть при желании расшифрованы и изменены. Если топикастеру не нравится, что кто-то может себе взять рут права, чтобы читерить, то лучший выход - сервер.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Где хранить данные помимо PlayerPrefs

Сообщение DikSan 05 июл 2017, 21:36

seaman писал(а):Любые данные на компьютере/смартфоне пользователя могут быть при желании расшифрованы и изменены.

Но ведь зашифровкой можно заставить взломщиков немного понервничать :ymdevil: . Но на самом деле при желании можно ведь зашифровать не сложно для себя, но сложно для взламывающего :)
samana, спасибо большое :)
DikSan
UNIт
 
Сообщения: 52
Зарегистрирован: 23 июн 2017, 16:34

Re: Где хранить данные помимо PlayerPrefs

Сообщение seaman 05 июл 2017, 22:01

Тогда Ваш вопрос вообще - лажа.
Пишите куда хотите зашифрованное. И в PlayerPrefs тоже.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Где хранить данные помимо PlayerPrefs

Сообщение DikSan 05 июл 2017, 22:21

seaman писал(а):Тогда Ваш вопрос вообще - лажа.
Пишите куда хотите зашифрованное. И в PlayerPrefs тоже.

Так то да, но если, например, ключ для расшифровки зависит от шифруемого значения ("123" - "321"), то тогда его тоже нужно где-то хранить, а если его хранить в открытом месте вместе с шифруемым значением (PlayerPlefs) то эти "123" и "321" видно невооруженным глазом и становится понятно что к чему, а храня данные тем способом, что выше в видео по ссылке, или комбинируя оба способа можно очень сильно усложнить процесс дешифровки )
DikSan
UNIт
 
Сообщения: 52
Зарегистрирован: 23 июн 2017, 16:34

Re: Где хранить данные помимо PlayerPrefs

Сообщение samana 05 июл 2017, 22:26

DikSan писал(а):то эти "123" и "321" видно невооруженным глазом и становится понятно что к чему

Если вы придумаете свою какую нибудь шифровку, то и буквы и цифры будут выглядеть как какая-то ерунда, например "D#@!kDkv_xDs??MOACW", ведь допустим буква "A" у вас это будет "MSC", а цифра 1 - "*?№". Всё зависит от вашей фантазии.
Только в PlayerPrefs очень много не сохранится, там лимит на объём.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Где хранить данные помимо PlayerPrefs

Сообщение seaman 05 июл 2017, 22:31

Ключ хранить в PlayerPrefs? Да ты крут! Ну как минимум где-то в программе. И не просто так, а с обфускацией кода и ручным запутыванием кода. И все равно вскроют, если захотят.
Так что - храните где хотите. Никому не нужны эти заморочки.
Ну в крайнем случае - гляньте сюда: viewtopic.php?f=12&t=19744
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Где хранить данные помимо PlayerPrefs

Сообщение DikSan 05 июл 2017, 22:41

seaman писал(а):Ключ хранить в PlayerPrefs? Да ты крут! Ну как минимум где-то в программе.

Я же написал, что если дело идет с ключем, зависящем от значения шифруемого объекта. Такой ключ прямо в программе хранить не получится, поэтому его и придется сохранять где-то отдельно
DikSan
UNIт
 
Сообщения: 52
Зарегистрирован: 23 июн 2017, 16:34

Re: Где хранить данные помимо PlayerPrefs

Сообщение Happy Lime 16 июл 2017, 15:55

3 способа сохранения:

https://www.youtube.com/watch?v=oZ1gmpnQBFg

+ свой способ сохранения с шифрованием:

Синтаксис:
Используется csharp
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using System.Security.Cryptography;
using System.Text;

...

[System.Serializable]
public class SPlayerPrefs
{

    public static void SetString(string key, string value)
    {
        PlayerPrefs.SetString(md5(key), encrypt(value));
    }

    public static string GetString(string key, string defaultValue)
    {
        if (!HasKey(key))
            return defaultValue;
        try
        {
            string s = decrypt(PlayerPrefs.GetString(md5(key)));
            return s;
        }
        catch
        {
            return defaultValue;
        }
    }

    public static string GetString(string key)
    {
        return GetString(key, "");
    }

    public static void SetInt(string key, int value)
    {
        PlayerPrefs.SetString(md5(key), encrypt(value.ToString()));
    }

    public static int GetInt(string key, int defaultValue)
    {
        if (!HasKey(key))
            return defaultValue;
        try
        {
            string s = decrypt(PlayerPrefs.GetString(md5(key)));
            int i = int.Parse(s);
            return i;
        }
        catch
        {
            return defaultValue;
        }
    }

    public static int GetInt(string key)
    {
        return GetInt(key, 0);
    }


    public static void SetFloat(string key, float value)
    {
        PlayerPrefs.SetString(md5(key), encrypt(value.ToString()));
    }


    public static float GetFloat(string key, float defaultValue)
    {
        if (!HasKey(key))
            return defaultValue;
        try
        {
            string s = decrypt(PlayerPrefs.GetString(md5(key)));
            float f = float.Parse(s, System.Globalization.CultureInfo.InvariantCulture);
            return f;
        }
        catch
        {
            return defaultValue;
        }
    }

    public static float GetFloat(string key)
    {
        return GetFloat(key, 0);
    }

    public static bool HasKey(string key)
    {
        return PlayerPrefs.HasKey(md5(key));
    }

    public static void DeleteAll()
    {
        PlayerPrefs.DeleteAll();
    }

    public static void DeleteKey(string key)
    {
        PlayerPrefs.DeleteKey(md5(key));
    }

    public static void Save()
    {
        PlayerPrefs.Save();
    }

    /*
         * Обязательно смените этот секретный код и числа в массивах
         */

    private static string secretKey = "secret";
    private static byte[] key = new byte[8] { 21, 41, 4, 1, 32, 64, 45, 64 };
    private static byte[] iv = new byte[8] { 4, 18, 44, 34, 48, 84, 4, 144 };

    private static string encrypt(string s)
    {
        byte[] inputbuffer = Encoding.Unicode.GetBytes(s);
        byte[] outputBuffer = DES.Create().CreateEncryptor(key, iv).TransformFinalBlock(inputbuffer, 0, inputbuffer.Length);
        return System.Convert.ToBase64String(outputBuffer);
    }

    private static string decrypt(string s)
    {
        byte[] inputbuffer = System.Convert.FromBase64String(s);
        byte[] outputBuffer = DES.Create().CreateDecryptor(key, iv).TransformFinalBlock(inputbuffer, 0, inputbuffer.Length);
        return Encoding.Unicode.GetString(outputBuffer);
    }

    private static string md5(string s)
    {
        byte[] hashBytes = new MD5CryptoServiceProvider().ComputeHash(new UTF8Encoding().GetBytes(s + secretKey + SystemInfo.deviceUniqueIdentifier));
        string hashString = "";
        for (int i = 0; i < hashBytes.Length; i++)
        {
            hashString += System.Convert.ToString(hashBytes[i], 16).PadLeft(2, '0');
        }
        return hashString.PadLeft(32, '0');
    }
 
Аватара пользователя
Happy Lime
UNец
 
Сообщения: 39
Зарегистрирован: 16 июл 2017, 11:27


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11