【发布时间】:2016-12-23 18:37:36
【问题描述】:
心爱的RabbitMQ Management Plugin 有一个HTTP API 可以通过普通的HTTP 请求来管理RabbitMQ。
我们需要以编程方式创建用户,而 HTTP API 是我们选择的方式。文档很少,但 API 非常简单直观。
考虑到安全性,我们不想以纯文本形式传递用户密码,而 API 提供了一个字段来发送密码哈希值。从那里引用:
[ 获取 |放 |删除] /api/users/名称
个人用户。要放置用户,您将需要一个外观 像这样:
{"password":"secret","tags":"administrator"}或:
{"password_hash":"2lmoth8l4H0DViLaK9Fxi6l9ds8=", "tags":"administrator"}标签键是强制性的。必须设置
password或password_hash。
到目前为止,一切顺利,问题是:如何正确生成password_hash?
password hashing algorithm是在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”,那么它就像一个魅力。
This answer 引导我导出配置并查看 RabbitMQ 生成的哈希值,我意识到了一些事情:
- “1”的哈希示例:“y4xPTRVfzXg68sz9ALqeQzAram3CwnGo53xS752cDV5+Utzh”
- 所有用户的哈希都是固定长度的
- 哈希值每次都会改变(即使密码相同)。我知道 PB2K 也对密码执行此操作,但不知道此加密属性的名称。
- 如果我传递了
password_hash,RabbitMQ 将其存储而不会更改
我也接受其他编程语言的建议,而不仅仅是 C#。
【问题讨论】:
-
我相信他们散列的不是密码而是加密密码。他们可能会使用一些 RSA 算法来获取加密密码,然后为其计算哈希。
-
为了能够生成哈希,您需要找到用于加密密码的密钥。
-
我试图了解它们在源代码中的作用(github.com/rabbitmq/rabbitmq-management/blob/master/src/…),但我对 Erlang 和函数式语言一无所知
标签: c# rabbitmq rabbitmqadmin