2014-08-28 6 views
16

Ich modifiziere ein xml eines Jenkins-Jobs. Es gibt ein Feld, das ein Passwort ist. Wenn ich das xml bekomme, wo es jetzt das rohe Passwort war, gibt es einen Hash.Welche Passwortverschlüsselung verwendet Jenkins?

Was ich brauche, ist zu wissen, wie man diesen Hash aus dem Raw-Passwort-Wert erstellt.

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

Ich habe gelesen Jenkins source code und ich denke, die Klasse HudsonPrivateSecurityRealm.java beteiligt ist, aber ich bin nicht sicher über den Salz-Parameter.

PS: Dies ist nicht für das Jenkins-Passwort ist für ein Plugin, das in der Job-Konfiguration hat ein Passwort-Feld.

+0

Wenn Sie das Klartext-Passwort kennen, können Sie einige gängige Hashing-Algorithmen ausprobieren. –

+0

In einem Kommentar der HudsonPrivateSecurityRealm-Klasse wird angegeben, dass PasswordEncoder auf SHA-256 und zufälliger Salzgenerierung basiert. Daher ist das Problem, wie man das von Jenkins verwendete Salz bekommt oder wie man das gleiche Salz erzeugt, richtig? –

+0

Salze werden beim Verschlüsseln des Kennworts generiert und in der Ausgabe enthalten (https://github.com/jenkinsci/jenkins/blob/0cc333faf285d587a87dee8a5ea54a4f75a2c758/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java#L602 -L603). Da dieser Hash nicht in das Format passt, wird er wahrscheinlich nicht von diesem Code generiert - er wird schließlich von einem Plugin erstellt. – Blaisorblade

Antwort

28

Tatsächlich ist es kein Hash, sondern ein verschlüsseltes Passwort. Ich denke, Verschlüsselungsschlüssel sind im Master-Knoten gespeichert. Es bedeutet, dass Sie das Passwort durch Ausführen folgenden groovy Skript auf Master-Skript-Konsole

import hudson.util.Secret 

def secret = Secret.fromString("zlvnUMF1/hXwe3PLoitMpQ6BuQHBJ1FnpH7vmMmQ2qk=") 
println(secret.getPlainText()) 

wiederherstellen könnte, und wenn Sie Ihr Passwort verschlüsseln möchten, dann

import hudson.util.Secret 

def secret = Secret.fromString("your password") 
println(secret.getEncryptedValue()) 

Es bedeutet auch, dass ein Passwort in einer verschlüsselten Computer kann nur auf diesem bestimmten Computer entschlüsselt werden, da Schlüssel zufällig generiert werden und offensichtlich auf einem anderen Computer die Schlüssel unterschiedlich sind.

Check out core/src/main/java/hudson/util/Secret.java für mehr Details

10

Eine andere Möglichkeit wäre, ein Groovy-Skript über Jenkins Groovy Konsole ausführen (Sie können es über JENKINS_URL erreichen kann/script):

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

Einige andere Möglichkeiten, möglich wäre, mit python:

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

+0

Kühl. Zu schlecht habe ich dort nicht die richtigen Rechte ... xxxx fehlt die Overall/RunScripts-Berechtigung – Cagy79

1

Jenkins verwendet AES-128-ECB für alle seine Verschlüsselungen. Es verwendet grundsätzlich die Datei master.key, um den in der Datei gespeicherten Schlüssel zu verschlüsseln. Dieser Schlüssel wird dann verwendet, um das Passwort in credentials.xml zu verschlüsseln.

Um Jenkins Passwort zu entschlüsseln, benötigen Sie grundsätzlich Zugriff auf hudson.util.Secret und master.key Dateien. Sie können genau überprüfen, wie Jenkins das Passwort verschlüsselt, indem Sie in Klasse und seine fromString Methode suchen. Grundsätzlich wird das Passwort mit einem Zauber verknüpft, bevor es mit KEY verschlüsselt wird.

Für weitere Details überprüfen Sie bitte: Credentials storage in Jenkins.


das Passwort zu entschlüsseln, gehen Sie folgendermaßen vor:

  1. Während in Jenkins als Admin angemeldet, gehen Sie zu: /script Seite.
  2. Führen Sie den folgenden Befehl ein:

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

    oder:

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

    wo {XXX=} Ihre verschlüsselten Passwort. Dadurch wird das Plain-Passwort gedruckt.

    Gegenteil zu tun, laufen:

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

Quelle: gist at tuxfight3r/jenkins-decrypt.groovy.


Alternativ folgende Skripte überprüfen: tweksteen/jenkins-decrypt, menski/jenkins-decrypt.py.