Разнообразие save/load кода

Скачал классическую наработку SLSBJ от джокера, но пока не могу понять что в ней отвечает за разброс символов.
На скрине видно что коды слишком похожи друг на друга.
Хотелось бы чтобы при изменении любого значения (уровень/экспа/предметы) даже на единицу, код очень рандомно перетряхивало как в большинстве рпг.
Можно на jass, все равно уже перевел, только попонятнее если можно.
Приложил классик версию наработки.

Ответ

Enemy1PK, если ты подпишешь код хеш-функцией даже без ника игрока, то при изменении кода и его загрузке подпись будет невалидна.
Можно и I2S(StringHash(...)) юзать, только её легко выполнить не вдаваясь в технические подробности твоей карты, я бы замаскировал хотябы под свой алфавит.
При сохранении:
"конечный код" = сейв код + подпись (хеш-функция от этого кода + соль, можно без соли)
Пример: savecode + ":" + I2S(StringHash(savecode + username + map_brand_name + ещё любая привязка))
отдаёшь конечный код юзеру
При загрузке:
"конечный код" = получаешь его у юзера
Пример: "abcd:efgh"
"сейв-код" = подстрока от конечного кода
Пример: "abcd"
"фактическая подпись" = подстрока от конечного кода
Пример: "efgh"
"ожидаемая подпись" = хеш-функция от сейв-кода
Пример: I2S(StringHash("abcd" + username + map_brand_name + ещё любая привязка))
если "ожидаемая подпись" не равно "фактическая подпись", то сейв-код не валиден


Views: 124

Desgul #1 - 1 month ago 0
Голосов: +0 / -0
Enemy1PK, каждый кусок кода отвечает за разное например предмет это один кусок кода, уровень другой кусок когда и так далее
ScorpioT1000 #2 - 1 month ago (изм. ) 2
Голосов: +2 / -0
Самым простым будет сделать цифровую подпись (хеш-функцией от кода с солью имени игрока, например) и добавить в конец кода.
Тогда для любого другого имени этот код будет невалиден, а при изменении любой единицы данных хеш-код будет меняться в зависимости от энтропии хеш-функции.
Т.е. итоговый код = код + хеш(код + имя игрока)

Пример простых хеш функций www.cs.hmc.edu/~geoff/classes/hmc.cs070.200101/homework10/hashfu...
Vlod #3 - 1 month ago 0
Голосов: +0 / -0
Хороший совет, только привязываться к имени игрока в контексте вара сомнительная тема, учитывая, что на разных платформах ник может быть разным
goodlyhero #4 - 1 month ago -1
Голосов: +0 / -1
В целом, особого смыла в сложной защите кода в реалиях варкрафта нет, в любом случае, получение правильного кода в примерно любых условиях для понимающего человека задача не больше чем на пол часа, но если хочется разнообразных кодов, можно реализовать какой-нибудь простенький алгоритм шифрования константой в коде карты. Не то, чтобы это кого-то остановило, но визуально может быть покрасивее.
Коды для сейв-лоада - кринж.
Enemy1PK #5 - 1 month ago (изм. ) 0
Голосов: +0 / -0
Там уже есть привязка к нику игрока, меня скорее беспокоит что игрок может стоять и подбирать себе код путем замены пары-тройки символов.
Все таки код выглядит достаточно ненадежно, как будто конец отвечает за ник, начало за лвл и тд, нет какого-либо адекватного перемешивания.
Тут вопрос даже не в том чтобы сделать невероятную защиту кода, а просто не искушать людей заниматься подбором кода. Если это легко - у кого-нибудь наверняка зачешутся руки.
Но все таки используя хеш можно решить вопрос?
На самом деле сложность в том что я не понимаю как устроена система, если бы понимал то смог бы сам придумать решение.
Уже и сохранения и выводы всего смог сделать, только в этом не разобрался.
ScorpioT1000 #6 - 1 month ago (изм. ) 2
Голосов: +2 / -0

Enemy1PK, если ты подпишешь код хеш-функцией даже без ника игрока, то при изменении кода и его загрузке подпись будет невалидна.
Можно и I2S(StringHash(...)) юзать, только её легко выполнить не вдаваясь в технические подробности твоей карты, я бы замаскировал хотябы под свой алфавит.
При сохранении:
"конечный код" = сейв код + подпись (хеш-функция от этого кода + соль, можно без соли)
Пример: savecode + ":" + I2S(StringHash(savecode + username + map_brand_name + ещё любая привязка))
отдаёшь конечный код юзеру
При загрузке:
"конечный код" = получаешь его у юзера
Пример: "abcd:efgh"
"сейв-код" = подстрока от конечного кода
Пример: "abcd"
"фактическая подпись" = подстрока от конечного кода
Пример: "efgh"
"ожидаемая подпись" = хеш-функция от сейв-кода
Пример: I2S(StringHash("abcd" + username + map_brand_name + ещё любая привязка))
если "ожидаемая подпись" не равно "фактическая подпись", то сейв-код не валиден
JackFastGame #7 - 1 month ago 0
Голосов: +0 / -0
Как вариант можно вместо или дополнительно к привязке к имени игрока дополнительно привязываться к имени компьютера через функцию GetComputerNameA.