security.json 中为 Apache Solr 指定的盐在哪里?

Where is the salt specified in security.json for Apache Solr?

我正在尝试在本地为 Apache Solr 实施基本身份验证。在截图Apache Solr Sample security.json (Source: https://lucene.apache.org/solr/guide/7_2/basic-authentication-plugin.html#basic-authentication-plugin)中,在3中给出了A user called 'solr', with a password 'SolrRocks' has been defined.。此外,假设密码被添加为 sha256(password+salt) 哈希。但是盐没有在任何地方指定(据我检查)。

我需要 salt 才能为 security.json 创建新密码。指定的盐在哪里?我试着用谷歌搜索答案,但找不到任何东西。如果你能帮助我,那就太好了。谢谢。

我不是密码学专家,可能会遗漏一些东西。我所知道的是盐是与密码连接的随机位,这样密码相同的人就不会得到相同的哈希值(如果这些人的盐不同)。

更新

在此link中,作者描述了无法在Apache Solr文档中找到加密方法的问题。他查看了 Solr 代码,发现 Sha256AuthenticationProvider.java 中的 sha256() 是实际计算哈希的函数。

link 中还提供了可下载的 jar 文件,可用于生成 Apache Solr 所需的密码。

但我仍然对 Solr 如何匹配密码感到困惑。给定的 jar 文件在不同的 运行 中为相同的密码字符串提供不同的哈希值(因为它随机生成盐)。如果我将密码设置为 fQfWaUyrgXoHPT9OiubY5zh8A4fL0D+r8592Eo1+Gbo= M7Vz0pRkjliKbPKHfP0qcMiALD16ujPQYPOu7SVG6Z8=(“SolrRocks”的加密版本,我从 运行 将 jar 文件放在一个 运行 中获得),然后我尝试发送一个 curl 请求密码“SolrRocks”,Solr 如何知道它是相同的密码?

如果有人能解释一下就好了。谢谢。

space之前的部分是散列密码,space之后的部分是盐:

System.out.println(Base64.encodeBase64String(btPass) + " " +
    Base64.encodeBase64String(salt));

这意味着 Solr 可以从后面的部分中提取盐,将其添加到您参考中算法中给出的传递中,并将结果与​​存储在哈希部分中的部分进行比较。

请注意,Solr 中的文档是不准确的 - 他们声称它是 sha256(password + salt) 但实际上它是 sha256(sha256(salt || password))(其中盐首先被 Base64 解码,密码被转换为 UTF-8 字节|| 表示字节连接)。在 MatsLindh 的回答中,这就是 btPass.

的值

此工具可用于为 solr 生成包含盐的密码哈希: https://github.com/ansgarwiechers/solrpasswordhash