Секрет от крючка Gogs (не попасть на python3) - PullRequest
0 голосов
/ 12 декабря 2018

Я настраиваю ловушку gogs, у меня есть API, который получает этот POST от push, например:

secret: myS3cr3t

предполагается, что "Secret будет отправлен как шестнадцатеричный дайджест HMAC SHA256полезной нагрузки через X-Gogs-Signature заголовок. "

тогда в python3 я получил это так:

сообщение - полезная нагрузка (тело json) из запроса и ключ, который я установил в env var

import hashlib
import hmac

def get_secret_signature(message, secret):
   signature = hmac.new(bytes(key, 'utf-8'), bytes(message, 'utf-8'), hashlib.sha256).hexdigest()
   return signature 

, но при проверке ловушки происходит сбой, потому что подпись, отправленная в X-Gogs-Signature, никогда не совпадает с подписью, сгенерированной на python

, даже сравнивая логику с плагином jenkins gogs:

public static String encode(String data, String key) throws Exception {
        final Charset asciiCs = Charset.forName("UTF-8");
        final Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
        final SecretKeySpec secret_key = new javax.crypto.spec.SecretKeySpec(asciiCs.encode(key).array(), "HmacSHA256");
        sha256_HMAC.init(secret_key);
        return Hex.encodeHexString(sha256_HMAC.doFinal(data.getBytes("UTF-8")));
}

Я думаю, что это та же логика в Python, очевидно, короче в Python;)

1 Ответ

0 голосов
/ 13 декабря 2018

Кажется, что переменная, у которой была полезная нагрузка, не экранировала некоторые символы, так как я использую фреймворк python Bottle, это правильный способ получить полезную нагрузку:

payload = request._get_body_string()
gogs_signature = request.get_header('X-Gogs-Signature')

signature = get_secret_signature(payload, secret)
.
.
.
if gogs_signature != signature:
   print("Signature error")

def get_secret_signature(message, secret):
   signature = hmac.new(bytes(key, 'utf-8'), message, hashlib.sha256).hexdigest()
   return signature
...