Любимый плагин управления RabbitMQ имеет HTTP API для управления RabbitMQ с помощью простых HTTP-запросов.
Нам нужно создавать пользователей программно, и HTTP API был выбран для этого. Документация скудная, но API у нее довольно простой и интуитивно понятный.
Что касается безопасности, мы не хотим передавать пароль пользователя в виде простого текста, и API предлагает поле для отправки хэша пароля. Цитата оттуда:
[ПОЛУЧИТЬ | PUT | УДАЛИТЬ]/api/users/name
Индивидуальный пользователь. Чтобы положить пользователя, вам нужно тело, похожее на это:
{"password":"secret","tags":"administrator"}
или же:
{"password_hash":"2lmoth8l4H0DViLaK9Fxi6l9ds8=", "tags":"administrator"}
Ключ теги обязателен.
password
илиpassword_hash
должны быть установлены.
Пока все хорошо, проблема в том, как правильно сгенерировать password_hash
?
Алгоритм хеширования паролей настраивается в конфигурационном файле RabbitMQ, а наш - как SHA256 по умолчанию.
Я использую С# и следующий код для генерации хеша:
var cr = new SHA256Managed();
var simplestPassword = "1";
var bytes = cr.ComputeHash(Encoding.UTF8.GetBytes(simplestPassword));
var sb = new StringBuilder();
foreach (var b in bytes) sb.Append(b.ToString("x2"));
var hash = sb.ToString();
Это не работает Тестируя некоторые онлайн-инструменты для шифрования SHA256, код генерирует ожидаемый результат. Тем не менее, если мы перейдем на страницу управления и вручную установим пароль пользователя на "1", то это будет работать как чудо.
Этот ответ заставил меня экспортировать конфигурации и взглянуть на хэши, которые генерирует RabbitMQ, и я понял несколько вещей:
- Пример хэширования "1": "y4xPTRVfzXg68sz9ALqeQzARam3CwnGo53xS752cDV5 + Utzh"
- все пользовательские хеши имеют фиксированную длину
- Хеши изменяются каждый раз (даже если пароль один и тот же). Я знаю, что PB2K также делает это с паролями, но не знаю название этого криптографического свойства.
- если я передаю
password_hash
RabbitMQ сохраняет его без изменений
Я принимаю предложения и на других языках программирования, а не только на С#.