Принятый метод создания соли для хеш-функции пароля — C++

Я занимаюсь программированием менеджера паролей (только в образовательных целях!) на C++. Чтобы сгенерировать мастер-ключ, моя программа пропустит ранее введенный мастер-пароль через функцию хеширования паролей argon2 для создания мастер-ключа. У меня 1 проблема. Мне нужен способ генерировать соль для использования с этой хэш-функцией. Из моих предыдущих исследований (поиск в Google: генерация соли C++ и поиск в StackOverflow) я видел, как люди делали разные вещи, подобные этому:

#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
using namespace std;

static const char alphanum[] =
"0123456789"
"!@#$%^&*"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";

int stringLength = sizeof(alphanum) - 1;

char genRandom()  // Random string generator function.
{

    return alphanum[rand() % stringLength];
}

int main()
{
    srand(time(0));
    for(int z=0; z < 21; z++)
    {
        cout << genRandom();

    }
    return 0;

}

Мой вопрос: будет ли достаточно генерации случайной строки с помощью rand(), или есть более приемлемый метод генерации соли или библиотека, которая может сделать это за меня?

P.S. Когда я искал StackOverflow, я действительно мог найти только статьи о PHP и C#.


person haet244cut    schedule 30.04.2016    source источник
comment
Взгляните на stackoverflow.com/q/7114043/212870.   -  person Alan Stokes    schedule 30.04.2016
comment
Я думаю, вы могли неправильно понять мой вопрос. Я не сомневаюсь в случайности rand(). Я спрашивал, есть ли более известный способ сделать это, которым пользуется больше людей и которому доверяют. (например, какой-то компонент криптобиблиотеки)   -  person haet244cut    schedule 30.04.2016
comment
Просто чтобы добавить к моему вопросу, я уже успешно запрограммировал это на python и использовал os.urandom(n) для генерации соли, но а) python слишком медленный, и б) что-то о том, как python управляет строками, говорит мне Я не должен использовать его для управления паролями. дисклеймер: это только мое мнение, я не хочу начинать флейм   -  person haet244cut    schedule 30.04.2016
comment
Вы должны сомневаться в случайности rand(); это довольно ужасно.   -  person Alan Stokes    schedule 30.04.2016


Ответы (1)


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

Я бы объединил системные часы реального времени со счетчиком.

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

Это подходит для сценариев серверного типа, где один и тот же процесс обрабатывает множество паролей. Если ваша программа может выполняться много раз в секунду или иметь много экземпляров, работающих параллельно, добавьте также идентификатор процесса. Если ваш процесс является распределенным, укажите IP-адрес или MAC-адрес сервера.

Также можно вызывать любую версию uuidgen(), которая есть в вашей системе, ИЛИ использовать настоящий криптографический генератор случайных чисел.

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

person Matt Timmermans    schedule 30.04.2016
comment
Хорошо, спасибо за ответ, но у меня есть несколько вопросов. 1) Вы говорите, что CSPRNG будет излишним/непригодным для использования? И 2) Клянусь, я читал во многих местах, что заполнение системными часами - действительно плохая идея, разве это не относится к этому сценарию? - person haet244cut; 30.04.2016
comment
1) Не стесняйтесь использовать CSPRNG, если хотите. (я добавил это к ответу). Это не обязательно, но во многих средах это просто и, безусловно, подойдет. 2) Есть много применений для случайных чисел в криптографии. Когда вам нужно случайное число, заполнение PRNG системными часами — плохая идея, потому что злоумышленнику легко догадаться, какие были системные часы. НО, соль не обязательно должна быть случайной. Он должен быть только уникальным, поэтому включение системных часов в порядке. - person Matt Timmermans; 30.04.2016
comment
@ haet244cut соль не обязательно должна быть случайной. Мэтт говорит, что это должно быть уникальным. Это не позволяет двум людям с одним и тем же паролем использовать хеш-код одного и того же пароля. - person Steve; 30.04.2016