Полное руководство: импорт предхешированных паролей Argon2 в Keycloak
Узнайте, как успешно импортировать предхешированные пароли Argon2 в Keycloak с правильной структурой учетных данных. Исправьте ошибки аутентификации с помощью нашего полного руководства по форматированию параметров и валидации.
Как импортировать предварительно хешированные пароли Argon2 в Keycloak? Я мигрирую пользователей из моего приложения в Keycloak и уже хешировал пароли с использованием Argon2. Я настроил Keycloak на использование Argon2 в качестве алгоритма хеширования и сгенерировал хеш с теми же параметрами, что и параметры по умолчанию в Keycloak (стоимость памяти: 7168, итерации: 5, параллелизм: 1, длина хеша: 32). Однако, когда я создаю пользователя с предварительно хешированным паролем, используя следующую структуру учетных данных, я получаю ошибку “неверные учетные данные пользователя” при попытке входа в систему. Создание пользователя с обычным паролем работает нормально. Что я делаю неправильно в структуре учетных данных или параметрах?
Импорт предварительно хешированных паролей Argon2 в Keycloak
Для успешного импорта предварительно хешированных паролей Argon2 в Keycloak необходимо использовать правильную структуру CredentialRepresentation с корректно отформатированным JSON в полях secretData и credentialData. Наиболее распространенная проблема, с которой сталкиваются пользователи, - это неправильное форматирование параметров или отсутствие обязательных полей в структуре учетных данных.
Содержание
- Правильная структура учетных данных для Argon2
- Требуемые параметры и форматирование
- Распространенные проблемы импорта и их решения
- Полный пример импорта
- Проверка и тестирование
- Альтернативные методы импорта
Правильная структура учетных данных для Argon2
Keycloak ожидает, что учетные данные Argon2 будут структурированы с полями secretData и credentialData, содержащими данные JSON. Поле secretData содержит фактическое значение хеша и соль, в то время как credentialData содержит параметры алгоритма.
{
"type": "password",
"secretData": "{\"value\":\"<your_hash_here>\",\"salt\":\"<your_salt_here>\",\"additionalParameters\":{}}",
"credentialData": "{\"algorithm\":\"argon2\",\"hashIterations\":5,\"additionalParameters\":{\"hashLength\":[\"32\"],\"memory\":[\"7168\"],\"parallelism\":[\"1\"],\"type\":[\"id\"],\"version\":[\"19\"]}}"
}
Требуемые параметры и форматирование
Требования к credentialData
Поле credentialData должно включать:
- algorithm: Установлено в
"argon2" - hashIterations: Количество итераций (5 в вашем случае)
- additionalParameters: Объект, содержащий массивы для каждого параметра:
- hashLength: Массив со строковым значением
["32"] - memory: Массив со строковым значением
["7168"] - parallelism: Массив со строковым значением
["1"] - type: Массив со строковым значением
["id"] - version: Массив со строковым значением
["19"](для Argon2id v1.9)
- hashLength: Массив со строковым значением
Важно: Все параметры в
additionalParametersдолжны быть отформатированы как массивы со строковыми значениями, а не как прямые значения. Это распространенная ошибка, которая приводит к сбоям при аутентификации.
Требования к secretData
Поле secretData требует:
- value: Ваш Argon2 хеш (кодированный в base64 при необходимости)
- salt: Ваша соль (кодированная в base64 при необходимости)
- additionalParameters: Пустой объект
{}
Распространенные проблемы импорта и их решения
1. Неправильное форматирование параметров
Если вы используете прямые значения вместо массивов:
// НЕПРАВИЛЬНО - прямые значения
"credentialData": "{\"algorithm\":\"argon2\",\"additionalParameters\":{\"memory\":7168,\"parallelism\":1}}"
// ПРАВИЛЬНО - массивы со строковыми значениями
"credentialData": "{\"algorithm\":\"argon2\",\"additionalParameters\":{\"memory\":[\"7168\"],\"parallelism\":[\"1\"]}}"
2. Отсутствие параметра версии
Keycloak требует наличия параметра версии в credentialData:
// НЕПРАВИЛЬНО - отсутствует версия
"credentialData": "{\"algorithm\":\"argon2\",\"additionalParameters\":{\"memory\":[\"7168\"],\"parallelism\":[\"1\"]}}"
// ПРАВИЛЬНО - с версией
"credentialData": "{\"algorithm\":\"argon2\",\"additionalParameters\":{\"memory\":[\"7168\"],\"parallelism\":[\"1\"],\"version\":[\"19\"]}}"
3. Проблемы с форматом хеша
Убедитесь, что ваш Argon2 хеш находится в правильном формате, который ожидает Keycloak. Согласно документации Keycloak, хеш должен соответствовать стандартному формату Argon2:
$argon2id$v=19$m=7168,t=5,p=1$salt$hash
4. Кодирование соли
Если у вас по-прежнему возникают проблемы, попробуйте закодировать вашу соль в base64:
// Пример кодирования в base64 на JavaScript
const salt = "your_salt_here";
const base64Salt = btoa(salt);
Полный пример импорта
Вот полный рабочий пример для импорта пароля Argon2:
{
"username": "testuser",
"enabled": true,
"credentials": [
{
"type": "password",
"secretData": "{\"value\":\"PMj1VthGWlVYthrRiAjw76UQf0Hqjcwn+jMRxTfS0GE\",\"salt\":\"ULCOILY1KOlp6uOW\",\"additionalParameters\":{}}",
"credentialData": "{\"algorithm\":\"argon2\",\"hashIterations\":5,\"additionalParameters\":{\"hashLength\":[\"32\"],\"memory\":[\"7168\"],\"parallelism\":[\"1\"],\"type\":[\"id\"],\"version\":[\"19\"]}}"
}
]
}
Проверка и тестирование
После импорта пользователя вы можете проверить учетные данные следующими способами:
- Проверка в консоли администратора Keycloak: Перейдите на вкладку учетных данных пользователя, чтобы проверить импортированный хеш и параметры
- Тестирование входа в систему: Попробуйте войти в систему с исходным паролем
- Использование API Keycloak: Запросите учетные данные пользователя для проверки структуры
Альтернативные методы импорта
Если подход с использованием REST API продолжает не работать, вы можете:
-
Прямой импорт в базу данных: Вставьте учетные данные непосредственно в таблицу
CREDENTIAL, как упоминалось в обсуждении в Google Groups -
Пользовательский скрипт миграции: Используйте скрипт, который использует Java API Keycloak для большего контроля над процессом создания учетных данных
-
Использование пользовательского провайдера хеширования паролей: Реализуйте пользовательский провайдер хеширования, который соответствует вашей существующей реализации Argon2, как показано в примере Argon2 Password Hash Provider for Keycloak
Ключом к успешному импорту паролей Argon2 является обеспечение правильного форматирования всех параметров в виде массивов в поле credentialData и отсутствие отсутствующих обязательных параметров, особенно указания версии.
Источники
- Миграция хешированных паролей в Keycloak - Stack Overflow
- Создание пользователя через API Keycloak с учетными данными - GitHub Issue
- Импорт хешированного пароля в Keycloak - Google Groups
- Добавление пользовательского типа учетных данных - Keycloak Discourse
- Документация API CredentialRepresentation
- Руководство администратора сервера - Документация Red Hat
Заключение
Для успешного импорта предварительно хешированных паролей Argon2 в Keycloak:
- Используйте правильную структуру CredentialRepresentation с полями JSON
secretDataиcredentialData - Форматируйте все параметры алгоритма как массивы со строковыми значениями в
credentialData.additionalParameters - Включите обязательный параметр версии (
"version":["19"]) - Убедитесь, что формат вашего хеша соответствует ожиданиям Keycloak
- Проверьте, что параметры точно соответствуют конфигурации Argon2 в Keycloak
Наиболее распространенная ошибка - использование прямых значений вместо формата массива для параметров, что приводит к сбоям при аутентификации. Тщательно проверьте, что все параметры в additionalParameters правильно отформатированы как массивы со строковыми значениями, и вы сможете успешно импортировать и аутентифицировать с помощью предварительно хешированных паролей Argon2.