心爱的人RabbitMQ Management Plugin有一个HTTP API通过纯 HTTP 请求管理 RabbitMQ。
我们需要以编程方式创建用户,而 HTTP API 是我们选择的方式。文档很少,但 API 非常简单直观。
考虑到安全性,我们不想以纯文本形式传递用户密码,API 提供了一个字段来发送密码哈希值。从那里引用:
[ GET | PUT | DELETE ] /api/users/name
An individual user. To PUT a user, you will need a body looking something like this:
{"password":"secret","tags":"administrator"}
or:
{"password_hash":"2lmoth8l4H0DViLaK9Fxi6l9ds8=", "tags":"administrator"}
The tags key is mandatory. Either
password
orpassword_hash
must be set.
到目前为止一切顺利,问题是:如何正确生成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#。
最佳答案
为了好玩,bash 版本!
#!/bin/bash
function encode_password()
{
SALT=$(od -A n -t x -N 4 /dev/urandom)
PASS=$SALT$(echo -n $1 | xxd -ps | tr -d '\n' | tr -d ' ')
PASS=$(echo -n $PASS | xxd -r -p | sha256sum | head -c 128)
PASS=$(echo -n $SALT$PASS | xxd -r -p | base64 | tr -d '\n')
echo $PASS
}
encode_password "some-password"
关于c# - 如何为 RabbitMQ 管理 HTTP API 生成 password_hash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41306350/