0 Tage Serie
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 main
import (
"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.