PDA

Просмотр полной версии : [Native] SHA256_PassHash



Daniel_Cortez
17.07.2015, 22:44
Описание:

Вычисляет хеш сумму из указанной строки. Несмотря на своё название, функция может хешировать любые строки, а не только пароли.
Есть возможность указать соль (https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%BB%D1%8C_(%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84%D0%B8%D1%8F)) для защиты от атак с помощью радужных таблиц (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).


Параметры:

password[] - входная строка.
salt[] - соль для хеширования.
ret_hash[] - строковая переменная, в которой будет записана хеш-сумма.
ret_hash_len - размер переменной ret_hash (в ячейках).


Возвращаемое значение:

Функция всегда возвращает 1. Также возвращает хеш-сумму, вычисленную из входной строки и соли, в виде строки в параметре ret_hash.

Примечания:
Функция была добавлена в SA:MP 0.3.7 R2.
В 0.3.7 R2 функция иногда выдавала неправильные результаты. Баг был исправлен только в версии R2-1, версией R2 лучше не пользоваться.
Массив, в котором будет сохранена хеш-сумма, должен быть размером не менее 64 ячеек + 1 ячейка под завершающий нуль-символ в строке (итого 65 ячеек), иначе увеличится риск подбора хешируемой строки злоумышленником, у которого окажется ваша база данных с хешами. При урезании хеша возникнет больше вариантов строк, хеш-суммы которых совпадают, при этом для успешной атаки достаточно подобрать хотя бы один из таких вариантов. По сути каждая недостающая ячейка в массиве с хэшем упрощает процесс взлома в 16 раз.
При хешировании паролей игроков рекомендуется использовать соль, уникальную для каждого игрока. Если у двух аккаунтов будут одинаковые пароли и злоумышленник узнает хеш от одного из этих паролей, второй пароль придётся подбирать отдельно, т.к. с уникальной солью хеши будут разными.
Например, можно случайным образом сгенерировать строку под соль при регистрации игрока, хешировать пароль с полученной солью и сохранить хеш и соль в данных аккаунта.
Также можно генерировать новую соль при каждой смене пароля игроком.
Соль добавляется после хешируемой строки. Например, если на вход подаётся строка "01234567" и соль "abc", хеш будет вычислен из строки "01234567abc".


Пример использования:

/**
* Проверяет правильность введённого игроком пароля.
* @param password[] - пароль
* @param expected_hash[] - хеш-сумма от пароля, сохранённая в аккаунте при регистрации игрока
* @param salt[] - соль, используемая при хешировании
**/
bool:CheckPassword(password[], expected_hash[], salt[])
{
/* вычислим хеш-сумму из пароля и соли */
new hash[64+1];
SHA256_PassHash(password, salt, hash, sizeof(hash));
/* если strcmp вернёт 0 - хеши совпадают, а значит пароль верный */
return bool:(!strcmp(hash, expected_hash, false));
}

См. также:

[Function] PackHash (http://pro-pawn.ru/showthread.php?12507-PackHash)



Статью подготовил: Daniel_Cortez (http://pro-pawn.ru/member.php?100-Daniel_Cortez)


Специально для Pro-Pawn.ru (http://www.pro-pawn.ru)
Копирование данной статьи на других ресурсах без разрешения автора запрещено.

$continue$
17.07.2015, 22:51
Как всегда, хорошо все описано.

Smile
15.08.2015, 21:37
Думаю у многих возникнет вопрос, как проверить введенный пароль на сайте при авторизации в ucp, который конфигурирует с сервером mysql, в котором записана строка с паролем в виде хэш суммы.



<?php
/**
* $password = пароль введенный в input поле при авторизации (используется метод POST)
* $salt = используемая соль. если соль у всех аккаунтов разная, получаем ее значение sql запросом.
* $hashed = получаем так сказать засоленную хэш сумму
* $hash = сюда заносим хэш сумму из базы данных так же sql запросом
* strcasecp = бинарное сравнение строк без учета регистра
*/

$password = $_POST['password'];
$salt = 'ZGxt3MSEE'; //запишу соль (для примера)
$hashed = hash('sha256', $password . $salt);
$hash = '1AEDF41427A95F6A041E2FF8C0F50B4E6ADC97F2EA6B5863E5FBC42CA3287310'; //наша хэш сумма из бд (для примера)
if (strcasecmp($hashed, $hash) == 0) {
//пароль верный, выполняем нужные действия
}
else {
//выводим сообщение о неверном пароле
}
?>

Cleo
25.12.2015, 15:38
Правильно понял?
Это в диалог авторизации:

new MyHash[30];
SHA256_PassHash(Player[playerid][Password], salt/*тут можно по подробнее*/, MyHash, sizeof (MyHash));
if(strcmp(MyHash, Player[playerid][Password]) == 0)
{
//спавним игрока
}

И в диалог регистрации:

SHA256_PassHash(Player[playerid][Password], 30, inputtext);

seriu
12.01.2016, 14:33
Правильно понял?
И в диалог регистрации:

SHA256_PassHash(Player[playerid][Password], 30, inputtext);
Видима нет


(итого 65 ячеек),

т.е


SHA256_PassHash(inputtext, "key2212", Player[playerid][Password], 65);

Maranzalla
12.01.2016, 15:03
извиняйте за нубство но как я понял он хеширует пароль в хеш 256 символов а мы записываем используя только 64-65 ячеек - это как для экономии памяти чтоли?

VVWVV
12.01.2016, 16:52
извиняйте за нубство но как я понял он хеширует пароль в хеш 256 символов а мы записываем используя только 64-65 ячеек - это как для экономии памяти чтоли?

Для того, чтобы найти полезную информацию используйте google; нашел вам статью с Википедии (https://ru.wikipedia.org/wiki/SHA-2). (именно там говорится о цифре 64)

Maranzalla
12.01.2016, 17:24
Для того, чтобы найти полезную информацию используйте google; нашел вам статью с Википедии (https://ru.wikipedia.org/wiki/SHA-2). (именно там говорится о цифре 64)

из вашего же источника не совсем понятно
Хеш-функция:Длина слова
SHA‑256, SHA‑224:32
SHA‑512, SHA‑384, SHA‑512/256, SHA‑512/224:64
И тут и там 256 так 32 или 64?
p.s гуглом пользоваться умею но разьяснить можете и поподробнее, если у вас нет навыков в обьяснении может не стоит лезть с комментариями - все-таки форум допускает и какую-то часть новичков наряду с PRO вы с этим согласны?

VVWVV
12.01.2016, 17:53
из вашего же источника не совсем понятно
Хеш-функция:Длина слова
SHA‑256, SHA‑224:32
SHA‑512, SHA‑384, SHA‑512/256, SHA‑512/224:64
И тут и там 256 так 32 или 64?
p.s гуглом пользоваться умею но разьяснить можете и поподробнее, если у вас нет навыков в обьяснении может не стоит лезть с комментариями - все-таки форум допускает и какую-то часть новичков наряду с PRO вы с этим согласны?

Каждый символ — это цифра от 0 до 9, или буква от A до F, т.е. это шестнадцатеричная система счисления. Данные символы формируют 4 бита информации. Таким образом, хеш равняется 64 (2^6) x 4 = 256 битов информации (длина внутреннего состояния); в названии функции также указано данное число, как и в других алгоритмах из семейства SHA.
64 — это количество итераций (насколько я помню).

Maranzalla
12.01.2016, 18:06
Каждый символ — это цифра от 0 до 9, или буква от A до F, т.е. это шестнадцатеричная система счисления. Данные символы формируют 4 бита информации. Таким образом, хеш равняется 64 (2^6) x 4 = 256 битов информации (длина внутреннего состояния); в названии функции также указано данное число, как и в других алгоритмах из семейства SHA.
64 — это количество итераций (насколько я помню).

значит 64 - это количество итераций насколько ты помнишь или же это Длина Ключа или это тоже самое? просто смотрю на википедии Длина слова 32 а вот количество итераций-графа та что справа 64 а в другом месте Длина слова 64 а количество итераций 80

VVWVV
12.01.2016, 18:09
значит 64 - это количество итераций насколько ты помнишь или же это Длина Ключа или это тоже самое? просто смотрю на википедии Длина слова 32 а вот количество итераций-графа та что справа 64 а в другом месте Длина слова 64 а количество итераций 80

80 кол-во итераций, только в SHA-512/384.

Maranzalla
12.01.2016, 19:27
80 кол-во итераций, только в SHA-512/384.

Для SHA‑512, SHA‑384, SHA‑512/256, SHA‑512/224
а вообще как я понял количество итераций не тоже самое что и Длина Ключа

Kamigakuro
14.12.2016, 17:59
Немного не понял, лучше генерировать каждый раз соль для пароля, или можно один раз придумать набор и постоянного использовать?

VVWVV
14.12.2016, 18:05
Немного не понял, лучше генерировать каждый раз соль для пароля, или можно один раз придумать набор и постоянного использовать?

Если вы хотите, чтобы ваше приложение было более безопасным, то лучше делать соль для каждого аккаунта. Как минимум, я бы именно так сделал.

DeimoS
15.12.2016, 08:17
Немного не понял, лучше генерировать каждый раз соль для пароля, или можно один раз придумать набор и постоянного использовать?

Например: игрок первый раз зашёл на сервер и начал регистрироваться. Когда ввёл пароль, генерируем для него соль, типа "первые 3 символа ника + первые 3 символа названия сервера + первые 3 символа пароля + 2017" (это пример), записывая результат в таблицу. При входе, когда игрок вводит пароль дл авторизации, проворачиваем ту же самую схему с введённым паролем и сверяем хэши.

Kamigakuro
15.12.2016, 23:01
Например: игрок первый раз зашёл на сервер и начал регистрироваться. Когда ввёл пароль, генерируем для него соль, типа "первые 3 символа ника + первые 3 символа названия сервера + первые 3 символа пароля + 2017" (это пример), записывая результат в таблицу. При входе, когда игрок вводит пароль дл авторизации, проворачиваем ту же самую схему с введённым паролем и сверяем хэши.

Угу, суть понял, даже не додумался до такого варианта) Думал, если генерировать соль рандомную и сохранять ее в БД, то смысла в ней будет вообще ноль, вот и возник вопрос.

Nurick
09.04.2017, 21:48
Добрый вечер, можно подробнее узнать о соли. Массив, в котором будет сохранена соль, каким размером должна быть? Есть какие нибудь ограничения у неё?

ziggi
09.04.2017, 22:14
Например: игрок первый раз зашёл на сервер и начал регистрироваться. Когда ввёл пароль, генерируем для него соль, типа "первые 3 символа ника + первые 3 символа названия сервера + первые 3 символа пароля + 2017" (это пример), записывая результат в таблицу. При входе, когда игрок вводит пароль дл авторизации, проворачиваем ту же самую схему с введённым паролем и сверяем хэши.


Угу, суть понял, даже не додумался до такого варианта) Думал, если генерировать соль рандомную и сохранять ее в БД, то смысла в ней будет вообще ноль, вот и возник вопрос.

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


Добрый вечер, можно подробнее узнать о соли. Массив, в котором будет сохранена соль, каким размером должна быть? Есть какие нибудь ограничения у неё?

Делай столько, сколько хочешь, ограничений нет.

DeimoS
10.04.2017, 22:11
Соль нужна исключительно для того, чтобы хэш пароля нельзя было прогнать по базам данных хэшей. Поэтому, случайно сгенерированная и сохранённая в базе соль ничуть не хуже предложенной.

Хмм, рандомная соль даже лучше будет, однако... Ну или мой вариант должен так же основываться на каких-то уникальных значениях, типа ID аккаунта + несколько букв ника + ещё что-то уникальное, что будет известно на этапе коннекта.
Я просто всегда почему-то рассматривал соль как дополнительную защиту именно от "ручного" подбора пароля. На деле соль довольно бессмысленна, если рассматривать её как рассматривал я.

$continue$
11.04.2017, 16:42
Соль нужная для решение проблем с радужными таблицами.

Хмм, рандомная соль даже лучше будет, однако... Ну или мой вариант должен так же основываться на каких-то уникальных значениях, типа ID аккаунта + несколько букв ника + ещё что-то уникальное, что будет известно на этапе коннекта.
Я просто всегда почему-то рассматривал соль как дополнительную защиту именно от "ручного" подбора пароля. На деле соль довольно бессмысленна, если рассматривать её как рассматривал я.

DeimoS
11.04.2017, 17:40
Соль нужная для решение проблем с радужными таблицами.

Спасибо кэп, я понял это ещё с сообщения Ziggi.
Точнее, знал я это и до сообщения Ziggi, но сам всегда использовал соль с мыслью о том, что за счёт неё усложняю ручной подбор пароля.
В общем, рандомная соль - то, что доктор прописал

ermakl
07.02.2018, 17:14
Не работает ваш вариант


Pawn - 4C570DB7E97172CB54767681228D45CF51F01C1BE61EB15E240205BE26BA32B5

Php - 7d2ac9935b045865aca4fa46a7622b36f2ebd0e6d758b2db39dda1343cb674c9

Geebrox
08.02.2018, 01:04
Не работает ваш вариант


Pawn - 4C570DB7E97172CB54767681228D45CF51F01C1BE61EB15E240205BE26BA32B5

Php - 7d2ac9935b045865aca4fa46a7622b36f2ebd0e6d758b2db39dda1343cb674c9


код можно?
возможно из за кодировки...

pawnoholic
08.02.2018, 17:48
Не работает ваш вариант


Pawn - 4C570DB7E97172CB54767681228D45CF51F01C1BE61EB15E240205BE26BA32B5

Php - 7d2ac9935b045865aca4fa46a7622b36f2ebd0e6d758b2db39dda1343cb674c9


Покажите как в PHP реализовано.

ermakl
10.02.2018, 19:41
<?php
<meta charset="utf-8">//кодировка
$salt = "test";
$hashed = hash('sha256', $password. $salt ,false);
echo($myrow['Pass']);
?><hr><?php
echo($hashed );
?><hr><?php
if (strcasecmp($hashed, $myrow['Pass']) == 0)
{
exit("Good");
}

DeimoS
10.02.2018, 20:44
Таки в сампе кодировка Windows-1251

ermakl
10.02.2018, 23:02
ну я заменил , ефетка 0

DeimoS
10.02.2018, 23:28
Ну так описывай что ты, в итоге, сделал. Дело не в коде, что дан в теме и не в функции на стороне Pawn, ибо всё это проверенно многими людьми.
Соответственно, дело в твоей реализации

ermakl
11.02.2018, 00:35
сделал кодировку

<meta charset="windows-1251">
и сохранил на

Cyrillic windows-1251

pawnoholic
11.02.2018, 00:38
сделал кодировку

<meta charset="windows-1251">
и сохранил на

Cyrillic windows-1251

Кодировка файлов тут вообще не причем.

Сверь какие значения соли и паролей поступают на входе и какие на выходе, тогда поймешь в чем проблема.

ermakl
11.02.2018, 00:55
соли точно теже в павно


new salt[7] = "kaktus";
new temp[65];
format(temp,sizeof(temp),"lolka");
SHA256_PassHash(temp, salt, temp, 65);

далее запись в бд
и в php


<?php
$salt = "kaktus";
$hashed = hash('sha256', $password. $salt );
echo($myrow['Pass']);
?><hr><?php
echo(mb_strtoupper($hashed));

а на выходе разные значения , я даже не знаю что делать , и что проверять

pawnoholic
11.02.2018, 01:17
У меня все нормально.

Pawn:


new buffer[64 + 1];
SHA256_PassHash("lolka", "kaktus", buffer, sizeof(buffer));
printf("Pawn hash: %s", buffer);


PHP:


$buffer = hash('sha256', 'lolkakaktus');
print("PHP Hash: $buffer");


Pawn:

Pawn hash: 4C570DB7E97172CB54767681228D45CF51F01C1BE61EB15E240205BE26BA32B5

PHP:

PHP Hash: 4c570db7e97172cb54767681228d45cf51f01c1be61eb15e240205be26ba32b5

Если используешь вместе с MySQL, ставь кодировку utf8_general_ci - ci в конце означает CASE INSESITIVE, то есть регистронезависимый

ermakl
11.02.2018, 01:43
Всем спасибо , проблема была в том что я в подключении бд дюпнул переменую

beliy1996
03.02.2019, 13:40
Помогите с переходом с MD5 на SHA256
case 'auth':{
if($user->isAuthorized()) header("Location: /account");
if(isset($_POST['login']) && isset($_POST['password']) && isset($_POST['captcha'])){
$captcha = $_POST['captcha'];
$login = $_POST['login'];
is_scalar($_POST['password']) ? $password = md5($_POST['password']) : $password = null;
$server = $_POST['server'];
if(!empty($login) && !empty($password) && !empty($captcha)){
if($server == null || empty($server) || is_array($server) || $func->servers[ucfirst($server)] == null){
$func->setPopUp("error","Ошибка","Вы не указали сервер!");
}elseif($_SESSION['rand_code'] == null || empty($_SESSION['rand_code']) || $captcha != $_SESSION['rand_code']){
$func->setPopUp("error","Ошибка","Указан неверный код с картинки!");
}else{
$userka = $user->authorizeUser($login,$password,$server,$_POST['pin']);
if(!$userka){
$func->setPopUp("error","Ошибка","Неверная комбинация ника и пароля!");
}else{
header("Location: /account");
}
}
}else{
$func->setPopUp("error","Ошибка","Вы указали не все данные!");
}
}
$bodyclass = "loginer no-account aller";
$footscripts = array(
"/assets/js/jquery.spincrement.js",
"/assets/js/jquery.viewportchecker.min.js",
"/assets/bootstrap/js/bootstrap.min.js",
"/assets/js/changerServer.js",
"/assets/js/totop.js"
);
$scripts = array(
"/assets/js/jquery.min.js",
"/assets/js/wow.js"
);