İmzayı doğrula
Her istek aboneliğin gizli anahtarıyla imzalı. İmzası tutmayan isteği işleme.
MK-Imza başlığı t=<unix saniye>,v1=<imza> biçimindedir. İmza, aboneliğin gizli anahtarıyla (whsec_…)
"<t>.<ham gövde>" metninin HMAC-SHA256'sıdır, küçük harf hex.
- Başlıktan
tvev1'i ayır. t5 dakikadan eskiyse reddet (tekrar saldırısı)."<t>.<ham gövde>"için HMAC-SHA256 hesapla;v1ile sabit süreli karşılaştır.
Gövdeyi JSON olarak çözüp yeniden yazmadan, gelen ham haliyle imzala; boşluk farkı imzayı bozar.
import { createHmac, timingSafeEqual } from 'node:crypto'
import express from 'express'
const app = express()
app.post('/multikolay/webhook', express.raw({ type: 'application/json' }), (req, res) => {
if (!imzaDogru(req.body.toString('utf8'), req.get('MK-Imza') ?? '', process.env.MK_WEBHOOK_GIZLI)) return res.sendStatus(401)
const olay = JSON.parse(req.body)
kuyruk.ekle(olay) // ağır işi sonra yap
res.sendStatus(200)
})
function imzaDogru(ham, baslik, gizli) {
const p = Object.fromEntries(baslik.split(',').map((x) => x.split('=')))
if (!p.t || !p.v1 || Math.abs(Date.now() / 1000 - Number(p.t)) > 300) return false
const beklenen = createHmac('sha256', gizli).update(`${p.t}.${ham}`).digest('hex')
return p.v1.length === beklenen.length && timingSafeEqual(Buffer.from(p.v1), Buffer.from(beklenen))
}Sırrı yenile
Sır sızdıysa İmza sırrını yenile yeni bir whsec_… döner; eskisi hemen
geçersiz olur. Sunucundaki değeri aynı anda güncelle.