2014-08-28 489 views
16

我正在修改Jenkins作业的xml。有一个字段是密码。当我得到xml时,它现在是原始密码,这里有一个散列。Jenkins使用什么密码加密?

我需要的是知道如何从原始密码值创建此散列。

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

我一直在阅读詹金斯source code,我认为类HudsonPrivateSecurityRealm.java参与,但我不知道的盐参数。

PS:这不是詹金斯的密码是一个插件,它在作业配置中有一个密码字段。

+0

如果你知道明文密码,你可以尝试一些常见的散列算法。 – 2014-08-28 12:35:14

+0

在HudsonPrivateSecurityRealm类的评论中说PasswordEncoder是基于SHA-256和随机盐生成的。因此问题是如何获得Jenkins使用的盐或如何产生相同的盐,对吗? – 2014-08-28 19:05:45

+0

在加密密码时生成盐,[输出中包含](https://github.com/jenkinsci/jenkins/blob/0cc333faf285d587a87dee8a5ea54a4f75a2c758/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java#L602 -L603)。由于该散列不适合格式,因此可能不会由此代码生成 - 毕竟,它由插件设置。 – Blaisorblade 2015-04-30 14:08:25

回答

28

事实上,它不是一个散列,而是一个加密的密码。我猜加密密钥存储在主节点中。这意味着你可以通过主人的脚本控制台上执行以下常规脚本来恢复密码

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()) 

这也意味着,一个口令在一个加密计算机只能在特定的计算机上解密,因为密钥是随机生成的,显然在不同的机器上密钥是不同的。

更多细节

退房 core/src/main/java/hudson/util/Secret.java
10

另一种可能性是通过詹金斯的Groovy控制台执行Groovy脚本(您可以通过JENKINS_URL /到达它的脚本):

println(hudson.util.Secret.decrypt("zlvnUMF1/hXwe3PLoitMpQ6BuQHBJ1FnpH7vmMmQ2qk=")) 

一些其他的方法将可能与蟒蛇:

https://github.com/tweksteen/jenkins-decrypt
https://gist.github.com/menski/8f9980999ed43246b9b2

+0

很酷。为了不好,我没有正确的权利...... xxxxis缺少Overall/RunScripts权限 – Cagy79 2017-01-19 13:35:26

1

Jenkins使用AES-128-ECB进行所有加密。它基本上使用master.key文件来加密存储在hudson.util.Secret文件中的密钥。此密钥然后用于在credentials.xml中加密密码。

因此,要解密詹金斯密码,您需要基本访问hudson.util.Secretmaster.key文件。您可以通过查看hudson.utils.Secret课程及其fromString方法来查看Jenkins如何加密密码。基本上,在使用KEY进行加密之前,密码与魔术连接在一起。

欲了解更多详情,请检查:Credentials storage in Jenkins


要解密密码,请按照下列步骤操作:

  1. 登录时在詹金斯管理员,请访问:/script页。
  2. 运行以下命令:

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

    或:

    println(hudson.util.Secret.fromString("{XXX=}").getPlainText()) 
    

    其中{XXX=}是加密的密码。这将打印明文密码。

    做相反,运行:

    println(hudson.util.Secret.fromString("some_text").getEncryptedValue()) 
    

来源:gist at tuxfight3r/jenkins-decrypt.groovy


或者检查以下脚本:tweksteen/jenkins-decryptmenski/jenkins-decrypt.py