1

gogs フックを設定しています。プッシュなどからこの POST を受け取る API があります。

シークレット: myS3cr3t

X-Gogs-Signature 「シークレットは、ヘッダーを介してペイロードのSHA256 HMAC hexダイジェストとして送信される」と想定されてい ます。

次に、python3で次のように取得しました:

message は、リクエストからのペイロード (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では明らかに短いです;)

4

1 に答える 1