SHA256_PassHash

Материал из Pro-Pawn Wiki
Перейти к: навигация, поиск
Add.png Данная функция была добавлена в SA-MP 0.3.7 R2 и не работает в более ранних версиях.


Описание:

Вычисляет хеш-сумму пароля по алгоритму SHA-256.

Параметры:

(password[], salt[], ret_hash[], ret_hash_len)
password Пароль, хеш-сумму от которого нужно вычислить.
salt Криптографическая соль к паролю.
ret_hash Массив для сохранения в нём хеш-суммы.
ret_hash_len Размер массива ret_hash.


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

Возвращает длину строки с хеш-суммой (64 символа). Сама хеш-сумма косвенно возвращается через параметр ret_hash в виде строки в верхнем регистре.

Info rhombus.png
Примечание
Размер массива ret_hash должен быть равен как минимум 64+1 ячейке, иначе строка с хеш-суммой будет урезана (причём урезана не совсем правильно - см. ниже).
Соль должна быть уникальной для каждого игрового аккаунта - это необходимо, чтобы у разных аккаунтов при использовании одинакового пароля получились разные хеш-суммы.
Хорошей практикой считается в качестве соли генерировать случайную строку с минимальной длиной, равной размеру данных хеша, т.е. в случае с SHA-256 длина соли должна составлять минимум 32 символа (256 бит --> 32 байта) [1].
Перед хешированием соль добавляется после пароля. Например, если задать пароль "abcd" и соль "123", хеш-сумма будет вычислена из строки "abcd123".


Bug.png
Баг SA-MP
Если в массиве ret_hash не хватает места под запись одного или нескольких символов строки с хешем, функция записывает символ конца строки ('\0') за пределами массива - тем самым функция может обнулить переменную, объявленную перед или после массива, что может привести к неправильной работе кода, зависящего от значения в этой переменной.
Для параметра ret_hash_len разработчики SA-MP могли бы указать значение по умолчанию, равное размеру передаваемого массива ret_hash, чтобы у скриптеров не было необходимости каждый раз указывать размер вручную
native SHA256_PassHash(password[], salt[], ret_hash[], ret_hash_len=sizeof(ret_hash));
однако по неизвестной причине в SA-MP Team избегают использования оператора sizeof.


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

main()
{
    new hash[64 + 1];
    SHA256_PassHash("The quick brown fox jumps", " over the lazy dog", hash, sizeof(hash));
    // Вывод: "Hash: D7A8FBB307D7809469CA9ABCB0082E4F8D5651E46D3CDB762D02D0BF37C9E592"
    printf("Hash: %s", hash);
}