go / intermediate
Snippet
Abschwächung von Timing-Angriffen durch Constant-Time-Vergleiche
Ein Timing-Angriff ermöglicht es einem Angreifer, Geheimnisse (wie API-Schlüssel oder Passworthashes) zu erraten, indem gemessen wird, wie lange ein Vergleich dauert. Standardmäßige String-Vergleiche (==) enden vorzeitig beim ersten nicht übereinstimmenden Zeichen. Das bedeutet, dass Strings, die am Anfang übereinstimmen, länger für den Vergleich benötigen. Das Go-Paket crypto/subtle bietet ConstantTimeCompare, das unabhängig von den Inhalten in konstanter Zeit arbeitet und so verhindert, dass Timing-Seitenkanäle Informationen preisgeben.
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
23
24
package mainimport ("crypto/subtle""fmt")func verifySecret(inputToken, actualToken string) bool {inputBytes := []byte(inputToken)actualBytes := []byte(actualToken)if subtle.ConstantTimeCompare(inputBytes, actualBytes) == 1 {return true}return false}func main() {secret := "super-secure-token-123"input := "super-secure-token-123"isValid := verifySecret(input, secret)fmt.Println("Verification successful:", isValid)}
Erklärung
1
inputBytes := []byte(inputToken)
Konvertiert den Eingabestring in ein Byte-Slice, da die subtle-Vergleichsfunktion Byte-Slices benötigt.
2
subtle.ConstantTimeCompare(inputBytes, actualBytes)
Vergleicht die beiden Byte-Slices. Sie durchläuft alle Elemente und gibt 1 zurück, wenn sie identisch sind, andernfalls 0, ohne bei einer Nichtübereinstimmung vorzeitig abzubrechen.
3
if ... == 1
Überprüft, ob der Rückgabewert 1 ist, was auf eine erfolgreiche Übereinstimmung der Anmeldedaten hinweist.