📜  解密詹金斯凭据 (1)

📅  最后修改于: 2023-12-03 15:27:56.215000             🧑  作者: Mango

解密詹金斯凭据

简介

詹金斯凭据(Jenkins Credentials)是Jenkins中用于存储敏感信息,例如密码和API密钥等的方式之一。然而,这些凭据存储为加密形式。在某些情况下,需要解密它们(例如进行数据迁移或备份)。

解密凭据

首先,需要使用Jenkins的API以编程方式访问凭据。可以使用以下代码片段获取所有凭据:

import requests

response = requests.get('http://jenkins-url:port/credentials/store/system/domain/_/api/json')
credentials = response.json()['credentials']

使用上面的代码片段,可以获取所有系统凭据。如果想要获取单个凭据,可以使用类似以下的代码片段:

response = requests.get('http://jenkins-url:port/credentials/store/system/domain/_/credential/credentialId/api/json')
credential = response.json()

不幸的是,Jenkins不提供任何程序化方法来解密凭据。因此,需要直接访问Jenkins的加密密钥并使用它们手动解密凭据。

Jenkins使用两个密钥来加密凭据:主密钥和项密钥。主密钥是Jenkins的私钥并存储在Jenkins的磁盘上。项密钥是每个凭据独有的,并存储在Jenkins的内存中。

以下代码片段可以读取主密钥并解密项密钥:

import base64
import os
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes

# Read the master key from disk
with open('/var/lib/jenkins/secrets/master.key', 'rb') as f:
    master_key = base64.b64decode(f.read())

# Decrypt the credential using its own encrypted key
def decrypt(encrypted):
    iv = encrypted[:16]
    tag = encrypted[-16:]
    ciphertext = encrypted[16:-16]
    
    decryptor = Cipher(algorithms.AES(master_key), modes.GCM(iv, tag), backend=default_backend()).decryptor()
    return decryptor.update(ciphertext) + decryptor.finalize()

现在你可以使用decrypt函数来解密凭据了:

import json

credential = credentials[0]  # Choose a credential to decrypt
encrypted_key = base64.b64decode(credential['data']['encipheredKey'])
encrypted_password = base64.b64decode(credential['data']['secretBytes'])
key = decrypt(encrypted_key)
password = decrypt(encrypted_password).decode('utf-8')
print(json.dumps({'name': credential['displayName'], 'username': credential['data']['username'], 'password': password}))
结论

虽然Jenkins不直接支持解密凭据,但仍然可以使用Jenkins的私钥手动解密它们。这里提供的代码片段是一个起点,你可以使用它们来构建自己的解密工具。

参考