javascript / expert
Snippet
HMAC-Signaturverifizierung mittels Web Crypto API in Next.js Route-Handlern
Die Überprüfung der Authentizität von Webhooks in Next.js Edge- oder Node.js Route-Handlern erfordert zeitkonstante Web Crypto API-Primitiven. Das Importieren eines Rohschlüssels in crypto.subtle und die Verifizierung schützt den Endpoint vor Timing-Angriffen.
snippet.js
javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import { NextResponse } from 'next/server';export async function POST(request) {const secret = process.env.WEBHOOK_SECRET;const signature = request.headers.get('x-signature');const rawBody = await request.arrayBuffer();const key = await crypto.subtle.importKey('raw',new TextEncoder().encode(secret),{ name: 'HMAC', hash: 'SHA-256' },false,['verify']);const sigBuffer = Uint8Array.from(Buffer.from(signature || '', 'hex'));const isValid = await crypto.subtle.verify('HMAC', key, sigBuffer, rawBody);if (!isValid) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });return NextResponse.json({ success: true });}
nextjs
Erklärung
1
const rawBody = await request.arrayBuffer();
Liest den eingehenden Request-Stream direkt als ArrayBuffer ein, um die exakte Byte-Reihenfolge für die kryptografische Prüfung zu bewahren.
2
const key = await crypto.subtle.importKey(
Importiert das Secret als CryptoKey-Instanz, die speziell für die HMAC-SHA256-Verifizierung konfiguriert ist.
3
const isValid = await crypto.subtle.verify('HMAC', key, sigBuffer, rawBody);
Führt eine hardware-beschleunigte und timing-sichere HMAC-Signaturprüfung zwischen Signatur und Byte-Payload aus.