0 Tage Serie
go / intermediate
Snippet

Vergleich in konstanter Zeit zur Vermeidung von Timing-Angriffen bei Sicherheitsprüfungen

Standard-Bytevergleiche geben false zurück, sobald sie eine Abweichung finden. Dies führt zu minimalen Unterschieden in der Antwortzeit, die Angreifer messen können, um Passwörter zu erraten. Das Paket `crypto/subtle` bietet `ConstantTimeCompare`, das unabhängig vom Inhalt immer gleich lange läuft und Timing-Angriffe erschwert.

snippet.go
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main
import (
"crypto/subtle"
"fmt"
)
func verifySecret(inputToken, expectedToken []byte) bool {
if len(inputToken) != len(expectedToken) {
return false
}
return subtle.ConstantTimeCompare(inputToken, expectedToken) == 1
}
func main() {
tokenA := []byte("secureToken123")
tokenB := []byte("secureToken123")
tokenC := []byte("wrongTokenXYZ")
fmt.Println("Match A/B:", verifySecret(tokenA, tokenB))
fmt.Println("Match A/C:", verifySecret(tokenA, tokenC))
}
Erklärung
1
if len(inputToken) != len(expectedToken) {
Führt zuerst eine Längenprüfung durch, um sicherzustellen, dass wir bei gleichen Längen vergleichen.
2
return subtle.ConstantTimeCompare(inputToken, expectedToken) == 1
Vergleicht die Slices in konstanter Zeit. Gibt 1 zurück, wenn sie identisch sind, andernfalls 0.