Просмотр полной версии : [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
Как всегда, хорошо все описано.
Думаю у многих возникнет вопрос, как проверить введенный пароль на сайте при авторизации в 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 {
//выводим сообщение о неверном пароле
}
?>
Правильно понял?
Это в диалог авторизации:
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);
Правильно понял?
И в диалог регистрации:
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 ячеек - это как для экономии памяти чтоли?
извиняйте за нубство но как я понял он хеширует пароль в хеш 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 вы с этим согласны?
из вашего же источника не совсем понятно
Хеш-функция:Длина слова
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
значит 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
Немного не понял, лучше генерировать каждый раз соль для пароля, или можно один раз придумать набор и постоянного использовать?
Немного не понял, лучше генерировать каждый раз соль для пароля, или можно один раз придумать набор и постоянного использовать?
Если вы хотите, чтобы ваше приложение было более безопасным, то лучше делать соль для каждого аккаунта. Как минимум, я бы именно так сделал.
Немного не понял, лучше генерировать каждый раз соль для пароля, или можно один раз придумать набор и постоянного использовать?
Например: игрок первый раз зашёл на сервер и начал регистрироваться. Когда ввёл пароль, генерируем для него соль, типа "первые 3 символа ника + первые 3 символа названия сервера + первые 3 символа пароля + 2017" (это пример), записывая результат в таблицу. При входе, когда игрок вводит пароль дл авторизации, проворачиваем ту же самую схему с введённым паролем и сверяем хэши.
Kamigakuro
15.12.2016, 23:01
Например: игрок первый раз зашёл на сервер и начал регистрироваться. Когда ввёл пароль, генерируем для него соль, типа "первые 3 символа ника + первые 3 символа названия сервера + первые 3 символа пароля + 2017" (это пример), записывая результат в таблицу. При входе, когда игрок вводит пароль дл авторизации, проворачиваем ту же самую схему с введённым паролем и сверяем хэши.
Угу, суть понял, даже не додумался до такого варианта) Думал, если генерировать соль рандомную и сохранять ее в БД, то смысла в ней будет вообще ноль, вот и возник вопрос.
Добрый вечер, можно подробнее узнать о соли. Массив, в котором будет сохранена соль, каким размером должна быть? Есть какие нибудь ограничения у неё?
Например: игрок первый раз зашёл на сервер и начал регистрироваться. Когда ввёл пароль, генерируем для него соль, типа "первые 3 символа ника + первые 3 символа названия сервера + первые 3 символа пароля + 2017" (это пример), записывая результат в таблицу. При входе, когда игрок вводит пароль дл авторизации, проворачиваем ту же самую схему с введённым паролем и сверяем хэши.
Угу, суть понял, даже не додумался до такого варианта) Думал, если генерировать соль рандомную и сохранять ее в БД, то смысла в ней будет вообще ноль, вот и возник вопрос.
Соль нужна исключительно для того, чтобы хэш пароля нельзя было прогнать по базам данных хэшей. Поэтому, случайно сгенерированная и сохранённая в базе соль ничуть не хуже предложенной.
Добрый вечер, можно подробнее узнать о соли. Массив, в котором будет сохранена соль, каким размером должна быть? Есть какие нибудь ограничения у неё?
Делай столько, сколько хочешь, ограничений нет.
Соль нужна исключительно для того, чтобы хэш пароля нельзя было прогнать по базам данных хэшей. Поэтому, случайно сгенерированная и сохранённая в базе соль ничуть не хуже предложенной.
Хмм, рандомная соль даже лучше будет, однако... Ну или мой вариант должен так же основываться на каких-то уникальных значениях, типа ID аккаунта + несколько букв ника + ещё что-то уникальное, что будет известно на этапе коннекта.
Я просто всегда почему-то рассматривал соль как дополнительную защиту именно от "ручного" подбора пароля. На деле соль довольно бессмысленна, если рассматривать её как рассматривал я.
$continue$
11.04.2017, 16:42
Соль нужная для решение проблем с радужными таблицами.
Хмм, рандомная соль даже лучше будет, однако... Ну или мой вариант должен так же основываться на каких-то уникальных значениях, типа ID аккаунта + несколько букв ника + ещё что-то уникальное, что будет известно на этапе коннекта.
Я просто всегда почему-то рассматривал соль как дополнительную защиту именно от "ручного" подбора пароля. На деле соль довольно бессмысленна, если рассматривать её как рассматривал я.
Соль нужная для решение проблем с радужными таблицами.
Спасибо кэп, я понял это ещё с сообщения Ziggi.
Точнее, знал я это и до сообщения Ziggi, но сам всегда использовал соль с мыслью о том, что за счёт неё усложняю ручной подбор пароля.
В общем, рандомная соль - то, что доктор прописал
Не работает ваш вариант
Pawn - 4C570DB7E97172CB54767681228D45CF51F01C1BE61EB15E240205BE26BA32B5
Php - 7d2ac9935b045865aca4fa46a7622b36f2ebd0e6d758b2db39dda1343cb674c9
Не работает ваш вариант
Pawn - 4C570DB7E97172CB54767681228D45CF51F01C1BE61EB15E240205BE26BA32B5
Php - 7d2ac9935b045865aca4fa46a7622b36f2ebd0e6d758b2db39dda1343cb674c9
код можно?
возможно из за кодировки...
pawnoholic
08.02.2018, 17:48
Не работает ваш вариант
Pawn - 4C570DB7E97172CB54767681228D45CF51F01C1BE61EB15E240205BE26BA32B5
Php - 7d2ac9935b045865aca4fa46a7622b36f2ebd0e6d758b2db39dda1343cb674c9
Покажите как в PHP реализовано.
<?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");
}
Таки в сампе кодировка Windows-1251
Ну так описывай что ты, в итоге, сделал. Дело не в коде, что дан в теме и не в функции на стороне Pawn, ибо всё это проверенно многими людьми.
Соответственно, дело в твоей реализации
сделал кодировку
<meta charset="windows-1251">
и сохранил на
Cyrillic windows-1251
pawnoholic
11.02.2018, 00:38
сделал кодировку
<meta charset="windows-1251">
и сохранил на
Cyrillic windows-1251
Кодировка файлов тут вообще не причем.
Сверь какие значения соли и паролей поступают на входе и какие на выходе, тогда поймешь в чем проблема.
соли точно теже в павно
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, то есть регистронезависимый
Всем спасибо , проблема была в том что я в подключении бд дюпнул переменую
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"
);
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot