心爱的RabbitMQ 管理插件有一个HTTP API,可以通过普通的 HTTP 请求来管理 RabbitMQ。
我们需要以编程方式创建用户,而 HTTP API 是我们选择的方式。文档很少,但 API 非常简单直观。
考虑到安全性,我们不想以纯文本形式传递用户密码,API 提供了一个字段来发送密码哈希。从那里引用:
[得到| 放 | 删除 ] /api/users/名称
个人用户。要放置一个用户,你需要一个看起来像这样的身体:
{"password":"secret","tags":"administrator"}
或者:
{"password_hash":"2lmoth8l4H0DViLaK9Fxi6l9ds8=", "tags":"administrator"}
tags 键是强制性的。要么 要么
password
必须password_hash
设置。
到目前为止,一切都很好,问题是:如何正确生成password_hash
?
密码哈希算法在 RabbitMQ的配置文件中配置,我们的配置为默认的 SHA256。
我正在使用 C#,以及以下代码来生成哈希:
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 存储它而不做任何更改
我也接受其他编程语言的建议,而不仅仅是 C#。