Насколько я понимаю, получение ключа — это когда вы берете некоторые данные, скажем, пароль, и используете функцию для преобразования их в число, которое можно использовать в качестве секретного ключа, скажем, в криптографии на эллиптических кривых.
Да, это правильно, однако имейте в виду, что ваш пароль должен иметь достаточную надежность для защиты от грубой силы. Распространенным способом является использование игральная кость или же Бип39 как механизмы паролей, см. в хкс936.
Как только вы получите ключ $к$, то это ваш закрытый ключ, и $[k]G$ ваш открытый ключ в ECC с базовой точкой $G$ кривой. Стереть $к$ после использования даже не храните его в памяти и храните пароль в безопасности!
Argon2 использует случайную соль при хешировании, что требует, чтобы хэш каждый раз был разным, несмотря на то, что используется один и тот же пароль.
Да, это тоже правильно. Вы можете рассматривать это как то, что со всеми параметрами Argon2 вы запускаете детерминированную функцию. Один и тот же ввод будет результатом одного и того же вывода. Это то, что мы хотим от хэш-функций, хэш-функций паролей и случайных оракулов; быть детерминированным; один и тот же ввод должен привести к одному и тому же результату.
Использование другой соли используется для получения более одного ключа из пароля. Соль в то же время является хорошей контрмерой против радужных столов, где это применимо.
Если хэш другой, как его можно использовать для представления одного и того же секретного ключа?
Чтобы получить тот же ключ, вам нужно использовать те же параметры; тот же пароль, та же соль, та же итерация, то же использование памяти и то же распараллеливание. Параметры, кроме вашего пароля, не обязательно должны быть секретными, их можно хранить открыто. Например, такая информация хранится в Заголовок LUKS, важно всегда держать свой пароль в секрете.
Эти параметры необходимо сохранить при получении ключа из пароля.
Как Argon2 используется для получения ключей?
Во-первых, определите свою целевую безопасность; т.е.сколько вы хотите жизнь нападающего тяжела. Отрегулируйте количество итераций, степень распараллеливания и использование памяти в соответствии с вашей целевой безопасностью. После того, как вы решили, создайте однородную случайную соль. Определите желаемый размер ключа, например 256 бит (или 32 байта). Теперь вы готовы использовать Argon2 с этой информацией.
Вы предоставляете свою информацию Аргону и решаете свою целевую безопасность;
Использование: ./argon2 [-h] соль [-i|-d|-id] [-t итераций] [-m память] [-p параллелизм] [-l длина хеша] [-e|-r] [- v (10|13)]
Пароль считывается со стандартного ввода
Параметры:
соль Используемая соль, не менее 8 символов
-i Использовать Argon2i (по умолчанию)
-d Использовать Argon2d вместо Argon2i
-id Использовать Argon2id вместо Argon2i
-t N Устанавливает количество итераций равным N (по умолчанию = 3)
-m N Устанавливает использование памяти 2^N КиБ (по умолчанию 12)
-p N Устанавливает параллелизм для N потоков (по умолчанию 1)
-l N Устанавливает длину вывода хеша в N байт (по умолчанию 32)
-e Выводить только закодированный хеш
-r Выводить только необработанные байты хеша
-v (10|13) Версия Argon2 (по умолчанию самая последняя версия, в настоящее время 13)
-h Распечатать использование аргона2
Обратите внимание, что Argon2 имеет три типа;
Argon2d работает быстрее и использует доступ к памяти в зависимости от данных. Зависимость от данных немедленно включает побочный канал. Это подходит для криптовалют и приложений без угроз атак по сторонним каналам.
Argon2i использует независимый от данных доступ к памяти, и это предпочтительнее для хэширования паролей и создания ключей на основе паролей.
Argon2id В первой половине первой итерации работает как Argon2i, а в остальном работает как Argon2d. Это обеспечивает как защиту побочного канала, так и компромисс между временем и памятью.
и форма черновик-irtf-cfrg-argon2-03;
Если вы не знаете разницы между ними или считаете атаки по сторонним каналам реальной угрозой, выберите Argon2id.