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 mainimport ("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.