2014-08-28 214 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