来自 Gogs hook 的秘密(上线失败python3)
Secret from Gogs hook (failing to get on python3)
我正在配置一个 gogs 挂钩,我有一个 API 从推送接收这个 POST
例如
秘密:myS3cr3t
假定“秘密将通过 X-Gogs-Signature
header 作为负载的 SHA256 HMAC 十六进制摘要发送。”
然后在 python3 我是这样得到的:
message 是来自请求的有效负载 (json body) 和我在 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 中明显更短 ;)
似乎具有有效载荷的变量没有转义某些字符,因为我使用的是 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
我正在配置一个 gogs 挂钩,我有一个 API 从推送接收这个 POST 例如
秘密:myS3cr3t
假定“秘密将通过 X-Gogs-Signature
header 作为负载的 SHA256 HMAC 十六进制摘要发送。”
然后在 python3 我是这样得到的:
message 是来自请求的有效负载 (json body) 和我在 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 中明显更短 ;)
似乎具有有效载荷的变量没有转义某些字符,因为我使用的是 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