PDA

Просмотр полной версии : [Вопрос] Несколько вопросов [md5, таймер]



Matt Nash
10.10.2016, 19:04
Доброго времени суток.
Решил я однажды найти мод, в котором имеется регистрация с системой хеширования, наткнулся я на мод одного небезызвестного проекта под названием "Raknet". Честно говоря, сам код регистрации не очень понравился, но в том моде имеется хеширование, так вот, нормально ли использовать тот код?
(ps. нашёл на другом портале)
http://i.imgur.com/uJiRhZc.png
http://i.imgur.com/gnRAZ02.png
Может быть лучше использовать плагин от Владокса? :blush:

Помимо системы регистрации я заметил, что в том моде используется Unix-таймер. В чём его плюсы и минусы? (ну, именно в SAMP)

DeimoS
10.10.2016, 20:27
Лучше SHA256_PassHash (http://pro-pawn.ru/showthread.php?12486-SHA256_PassHash)

Redsan
10.10.2016, 20:38
Попахивает кодом опубликованным на говноинфо, в разделе готовых решений.
В предоставленном коде отсутствует функция tolower. Хеширование пароля на RakNet'e использовалось для интеграции серверной базы с форумной(invision power board). На вашем месте я бы использовал обычное md5 хеширование. Если же вам всё таки нужно хеширование с солью, то воспользуйтесь вариантом предложенным DeimoS'ом (http://pro-pawn.ru/showthread.php?14383-%D0%9D%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE-%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2-md5-%D1%82%D0%B0%D0%B9%D0%BC%D0%B5%D1%80&p=78069&viewfull=1#post78069).
Могу предположить, что таймеры с использованием unix времени должны быть точнее, но как это реализовано в моде Raknet'a не знаю.

Matt Nash
10.10.2016, 22:02
Попахивает кодом опубликованным на говноинфо, в разделе готовых решений.
В предоставленном коде отсутствует функция tolower. Хеширование пароля на RakNet'e использовалось для интеграции серверной базы с форумной(invision power board). На вашем месте я бы использовал обычное md5 хеширование. Если же вам всё таки нужно хеширование с солью, то воспользуйтесь вариантом предложенным DeimoS'ом (http://pro-pawn.ru/showthread.php?14383-%D0%9D%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE-%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2-md5-%D1%82%D0%B0%D0%B9%D0%BC%D0%B5%D1%80&p=78069&viewfull=1#post78069).
Могу предположить, что таймеры с использованием unix времени должны быть точнее, но как это реализовано в моде Raknet'a не знаю.

Да, этот код взят с того портала под спойлером, но это есть в самом моде RakNet :black_eye:

ziggi
10.10.2016, 22:16
На вашем месте я бы использовал обычное md5 хеширование.

Хранить хэшированые пароли без соли - это то же, что хранить их в открытом виде.

Matt Nash
10.10.2016, 22:27
Хранить хэшированые пароли без соли - это то же, что хранить их в открытом виде.

То есть правильно будет хранить пароли с кодом RakNet и инклудом Y_less?

ziggi
10.10.2016, 22:47
То есть правильно будет хранить пароли с кодом RakNet и инклудом Y_less?

Нет, MD5 устарел и имеет некоторые недостатки (https://ru.wikipedia.org/wiki/MD5#.D0.9A.D0.BE.D0.BB.D0.BB.D0.B8.D0.B7.D0.B8.D0.B8_MD5). Более того, хэширование - это довольно сложный процесс и его лучше переложить на сторону компилируемых языков (C++). Поэтому, как уже указали выше, лучше воспользоваться функцией SHA256_PassHash. Но да, частично код из RakNet можно использовать.

Для генерации соли я бы предпочёл использовать эту функцию (https://github.com/Open-GTO/gtolib/blob/master/gtolib.inc#L499-L520). Тогда твой код мог бы выглядеть так:



GenerateRandomString(PlayerInfo[playerid][pass_salt], 5, 6);
SHA256_PassHash(inputtext, PlayerInfo[playerid][pass_salt], PlayerInfo[playerid][pass_hash], 65);

Не забудь об изменении размера:

pass_hash[65],
pass_salt[6]

Matt Nash
11.10.2016, 22:23
Нет, MD5 устарел и имеет некоторые недостатки (https://ru.wikipedia.org/wiki/MD5#.D0.9A.D0.BE.D0.BB.D0.BB.D0.B8.D0.B7.D0.B8.D0.B8_MD5). Более того, хэширование - это довольно сложный процесс и его лучше переложить на сторону компилируемых языков (C++). Поэтому, как уже указали выше, лучше воспользоваться функцией SHA256_PassHash. Но да, частично код из RakNet можно использовать.

Для генерации соли я бы предпочёл использовать эту функцию (https://github.com/Open-GTO/gtolib/blob/master/gtolib.inc#L499-L520). Тогда твой код мог бы выглядеть так:



GenerateRandomString(PlayerInfo[playerid][pass_salt], 5, 6);
SHA256_PassHash(inputtext, PlayerInfo[playerid][pass_salt], PlayerInfo[playerid][pass_hash], 65);

Не забудь об изменении размера:

pass_hash[65],
pass_salt[6]

Если честно, я в этом хотел лишь разобраться. Подскажите, пожалуйста, в чём отличие между ними? Какие плюсы и минусы есть и как считывать пароль при авторизации?

ziggi
11.10.2016, 23:27
Если честно, я в этом хотел лишь разобраться.

Не похоже, если было бы желание, то сами бы разобрались.


Подскажите, пожалуйста, в чём отличие между ними? Какие плюсы и минусы есть?

Мне достаточно знать об отличиях в длине и отсутствии коллизий у sha, за остальным идите в гугл.


как считывать пароль при авторизации?

Считывать пароль самостоятельно не надо, он уже находится в inputtext. Но я понял, что нужен просто код, поэтому вот:


SHA256_PassHash(inputtext, PlayerInfo[playerid][pass_salt], pass, 65);
if (strcmp(pass, PlayerInfo[playerid][pass_hash], false) == 0) {
// ok
}

Disinterpreter
12.10.2016, 14:20
Хранить хэшированые пароли без соли - это то же, что хранить их в открытом виде.

Хранить хэшированные пароли с солью в md5 - это то же, что хранить в открытом виде. (Вспоминая последние утечки у популярных сайтов).

- - - Добавлено - - -


Подскажите, пожалуйста, в чём отличие между ними?

Защищенность любого алгоритма хеширования обуславливается сложностью хэша и его длинной. У md5 это всего лишь 32 символа. Это оставляет за собой множество коллизий (когда для этого хэша есть несколько истинных значений т.е можно использовать вместо пароля совершенно другой набор символов у которых похожий хэш).

Такой хэш легко взломать. Атаки на хэш производят с помощью:
тыц (https://ru.wikipedia.org/wiki/%D0%9F%D0%B0%D1%80%D0%B0%D0%B4%D0%BE%D0%BA%D1%81_%D0%B4%D0%BD%D0%B5%D0%B9_%D1%80%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F#.D0.9F.D1.80.D0.B8.D0.BC.D0.B5.D0.BD.D0.B5.D0.BD.D0.B8.D0.B5)
тыц (https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B4%D1%83%D0%B6%D0%BD%D0%B0%D1%8F_%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0)

Поэтому лучше использовать алгоритмы типа sha-2. С солью.

Matt Nash
12.10.2016, 14:30
Не похоже, если было бы желание, то сами бы разобрались.



Мне достаточно знать об отличиях в длине и отсутствии коллизий у sha, за остальным идите в гугл.



Считывать пароль самостоятельно не надо, он уже находится в inputtext. Но я понял, что нужен просто код, поэтому вот:


SHA256_PassHash(inputtext, PlayerInfo[playerid][pass_salt], pass, 65);
if (strcmp(pass, PlayerInfo[playerid][pass_hash], false) == 0) {
// ok
}

Насчёт желания Вы частично правы. Оно есть, но мне лучше понять на наглядном примере, чем на огромной статье.:good:
А есть ли какие-нибудь недоработки в SHA256?
Ну и ещё один вопрос, что Вы думаете о Unix-времени в SAMP? (это я задавал в первом сообщении).

Disinterpreter
12.10.2016, 15:19
А есть ли какие-нибудь недоработки в SHA256?
Ну и ещё один вопрос, что Вы думаете о Unix-времени в SAMP? (это я задавал в первом сообщении).
SHA256 медленнее работает чем md5, из-за длинны и другого алгоритма (если бы сервер лет 5 назад стоял на WinXP это бы вызывало очень серьезные проблемы). Но сокрытие данных от злоумышленника выше и важнее.
unixtime скорей всего юзают для интеграции с бд форума. (Примеров нет ничего сказать не можем).

qwezert
12.10.2016, 15:49
SHA256 медленнее работает чем md5, из-за длинны и другого алгоритма (если бы сервер лет 5 назад стоял на WinXP это бы вызывало очень серьезные проблемы). Но сокрытие данных от злоумышленника выше и важнее.
unixtime скорей всего юзают для интеграции с бд форума. (Примеров нет ничего сказать не можем).

Я вот никогда не парился по поводу шифроваия паролей в БД, потому что если получат доступ к твоей БД - то никакое шифрование не поможет.

Disinterpreter
12.10.2016, 17:28
Я вот никогда не парился по поводу шифроваия паролей в БД, потому что если получат доступ к твоей БД - то никакое шифрование не поможет.

Во первых, не шифрование, а хэширование.
Во вторых, вы явно не понимаете зачем это нужно.
Это нужно как раз на такие случаи. У нормальных проектов/организаций безопасность пользователя стоит выше всего. Поэтому, что бы в случае слива данных, злоумышленник не смог узнать пароли пользователей и делается хэширование.

qwezert
12.10.2016, 17:52
Во первых, не шифрование, а хэширование.
Во вторых, вы явно не понимаете зачем это нужно.
Это нужно как раз на такие случаи. У нормальных проектов/организаций безопасность пользователя стоит выше всего. Поэтому, что бы в случае слива данных, злоумышленник не смог узнать пароли пользователей и делается хэширование.
Для этих случаев в базе пароли и не хранятся.

DeimoS
12.10.2016, 18:01
Для этих случаев в базе пароли и не хранятся.

А где же они хранятся? Прямо в amx файл вшиваешь при регистрации? Или сразу в ноосферу?

Disinterpreter прав, ты явно не понимаешь для чего то вообще нужно и как это работает

ziggi
12.10.2016, 19:51
Помимо системы регистрации я заметил, что в том моде используется Unix-таймер. В чём его плюсы и минусы? (ну, именно в SAMP)


Ну и ещё один вопрос, что Вы думаете о Unix-времени в SAMP? (это я задавал в первом сообщении).

Не понимаю о чём ты. Если об этом (http://forum.sa-mp.com/showthread.php?t=289675), то, если нужна точность, возможно это и оправдано. Хотя я бы использовал timerfix (https://github.com/udan11/samp-plugin-timerfix) плагин (хотя и в нём не исправлен один неприятный баг (https://github.com/udan11/samp-plugin-timerfix/issues/12)).


А где же они хранятся? Прямо в amx файл вшиваешь при регистрации? Или сразу в ноосферу?

Хранить всё в оперативке -_-.