Java 詹金斯使用的密码加密是什么?

Java 詹金斯使用的密码加密是什么?,java,jenkins,hudson,Java,Jenkins,Hudson,我正在修改Jenkins作业的xml。有一个字段是密码。当我得到xml时,它是原始密码,现在有一个散列 我需要知道如何从原始密码值创建此哈希 <scm class="com.deluan.jenkins.plugins.rtc.JazzSCM"> <username>user</username> <password>zlvnUMF1/hXwe3PLoitMpQ6BuQHBJ1FnpH7vmMmQ2qk=&l

我正在修改Jenkins作业的xml。有一个字段是密码。当我得到xml时,它是原始密码,现在有一个散列

我需要知道如何从原始密码值创建此哈希

  <scm class="com.deluan.jenkins.plugins.rtc.JazzSCM">
    <username>user</username>
    <password>zlvnUMF1/hXwe3PLoitMpQ6BuQHBJ1FnpH7vmMmQ2qk=</password>
  </scm>

用户
zlvnUMF1/HXWE3LoitMPQ6BUQHBJ1FNPH7VMMMQ2QK=
我一直在阅读Jenkins的文章,我认为其中涉及HudsonPrivateSecurityRealm.java类,但我不确定salt参数


PS:这不是针对Jenkins的密码,而是针对在作业配置中有密码字段的插件。

事实上,它不是散列,而是加密密码。我猜加密密钥存储在主节点中。实际上,您可以通过在master的脚本控制台上执行以下groovy脚本来解密密码

import hudson.util.Secret

def secret = Secret.fromString("zlvnUMF1/hXwe3PLoitMpQ6BuQHBJ1FnpH7vmMmQ2qk=")
println(secret.getPlainText())
如果你想加密密码,那么

import hudson.util.Secret

def secret = Secret.fromString("your password")
println(secret.getEncryptedValue())
在计算机上加密的密码只能在该特定计算机上解密,因为密钥是随机生成的,显然在不同的计算机上密钥是不同的


查看更多详细信息

另一种可能是通过Jenkins Groovy控制台执行Groovy脚本(您可以通过Jenkins_URL/script访问它):

python还可以使用其他一些方法:


詹金斯使用它的所有加密。它基本上使用
master.key
文件来加密存储在
hudson.util.Secret
文件中的密钥。然后使用此密钥加密
credentials.xml
中的密码

所以要解密詹金斯密码,基本上需要访问
hudson.util.Secret
master.key
文件。通过查看
hudson.utils.Secret
类及其
fromString
方法,可以准确地检查Jenkins是如何加密密码的。基本上,在使用密钥加密之前,密码会与一个魔术连接在一起

有关详细信息,请检查:


要解密密码,请执行以下步骤:

  • 在Jenkins中以管理员身份登录时,转到:
    /script
    页面
  • 运行以下命令:

    println(hudson.util.Secret.decrypt("{XXX=}"))
    
    或:

    其中,
    {XXX=}
    是您的加密密码。这将打印普通密码

    要执行相反的操作,请运行:

    println(hudson.util.Secret.fromString("some_text").getEncryptedValue())
    
  • 来源:


    或者检查以下脚本:,
    .

    如果你知道明文密码,你可以尝试一些常见的哈希算法。在Hudson PrivateSecurityRealm类的评论中,PasswordEncoder基于SHA-256和随机盐生成。因此,问题在于如何获取Jenkins使用的salt,或者如何生成相同的salt,对吗?加密密码时会生成salt,并且。由于该散列不适合该格式,因此它很可能不是由该代码生成的——毕竟它是由插件设置的。酷。糟糕的是,我在那里没有正确的权利。。。xxxxis缺少总体/RunScripts权限您知道如何在Python中做到这一点吗?或者更好,从命令行?
    println(hudson.util.Secret.fromString("{XXX=}").getPlainText())
    
    println(hudson.util.Secret.fromString("some_text").getEncryptedValue())