2014-08-28 16 views
16

Tôi đang sửa đổi một xml của một công việc Jenkins. Có một lĩnh vực mà là một mật khẩu. Khi tôi nhận được xml, nơi nó là mật khẩu thô bây giờ có một băm.Mã hóa mật khẩu mà Jenkins đang sử dụng là gì?

Điều tôi cần là biết cách tạo băm này từ giá trị mật khẩu thô.

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

Tôi đã được đọc Jenkins source code và tôi nghĩ rằng HudsonPrivateSecurityRealm.java lớp được tham gia nhưng tôi không chắc chắn về thông số muối.

PS: Đây không phải là mật khẩu Jenkins dành cho một plugin trong cấu hình công việc có một trường mật khẩu.

+0

Nếu bạn biết mật khẩu cleartext, bạn có thể thử một số thuật toán băm thông dụng. –

+0

Trong một bình luận của lớp HudsonPrivateSecurityRealm nói rằng PasswordEncoder dựa trên SHA-256 và tạo ra muối ngẫu nhiên. Do đó vấn đề là làm thế nào để có được muối được sử dụng bởi Jenkins hoặc làm thế nào để tạo ra cùng một muối, phải không? –

+0

Các muối được tạo khi mã hóa mật khẩu và [được bao gồm trong đầu ra] (https://github.com/jenkinsci/jenkins/blob/0cc333faf285d587a87dee8a5ea54a4f75a2c758/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java#L602 -L603). Kể từ khi băm không phù hợp với định dạng, nó có thể cũng không được tạo ra bởi mã này - nó được thiết lập bởi một plugin, sau khi tất cả. – Blaisorblade

Trả lời

28

Thực tế, đây không phải là mã băm mà là mật khẩu được mã hóa. Tôi đoán các khóa mã hóa được lưu trữ trong nút chính. Nó có nghĩa là bạn có thể khôi phục lại mật khẩu bằng cách thực hiện kịch bản hấp dẫn sau trên kịch bản console thạc sĩ

import hudson.util.Secret 

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

và nếu bạn muốn mã hóa mật khẩu của bạn, sau đó

import hudson.util.Secret 

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

Nó cũng có nghĩa là một mật khẩu được mã hóa trong một máy tính có thể được giải mã chỉ trên máy tính cụ thể đó kể từ khi các phím được tạo ngẫu nhiên và rõ ràng trên một máy khác nhau, các phím khác nhau.

Check-out core/src/main/java/hudson/util/Secret.java để biết thêm chi tiết

10

Một khả năng khác sẽ được thực hiện một kịch bản Groovy qua Jenkins Groovy console (bạn có thể đạt được nó qua JENKINS_URL/script):

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

Một số cách khác sẽ có thể với python:

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

+0

Tuyệt. Để xấu tôi không có quyền chính xác ở đó ... xxxxis thiếu sự cho phép tổng thể/RunScripts – Cagy79

1

Jenkins sử dụng AES-128-ECB cho tất cả các mã hóa của nó. Về cơ bản nó sử dụng tệp master.key để mã hóa khóa được lưu trữ trong tệp hudson.util.Secret. Khóa này sau đó được sử dụng để mã hóa mật khẩu trong credentials.xml.

Vì vậy, để giải mã mật khẩu Jenkins, bạn cần truy cập cơ bản vào các tệp hudson.util.Secretmaster.key. Bạn có thể kiểm tra chính xác cách Jenkins mã hóa mật khẩu bằng cách nhìn vào lớp hudson.utils.Secret và phương thức fromString của nó. Về cơ bản, mật khẩu được nối với một phép thuật trước khi được mã hóa bằng KEY.

Để biết thêm chi tiết, vui lòng kiểm tra: Credentials storage in Jenkins.


Để giải mã mật khẩu, hãy làm theo các bước sau:

  1. Khi đăng nhập như là admin trong Jenkins, hãy vào: /script trang.
  2. Chạy lệnh sau:

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

    hay:

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

    nơi {XXX=} là mật khẩu được mã hóa của bạn. Thao tác này sẽ in mật khẩu thuần túy.

    Để làm điều ngược lại, chạy:

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

Nguồn: gist at tuxfight3r/jenkins-decrypt.groovy.


Ngoài ra kiểm tra các kịch bản sau đây: tweksteen/jenkins-decrypt, menski/jenkins-decrypt.py.

Các vấn đề liên quan