go / expert
Snippet
Zeitkonstante kryptographische Signaturvalidierung mittels subtle.ConstantTimeCompare
Direkte Slice-Vergleiche wie bytes.Equal brechen beim ersten nicht übereinstimmenden Byte vorzeitig ab, was Timing-Side-Channel-Schwachstellen erzeugt. subtle.ConstantTimeCompare wird unabhängig von der Position einer Abweichung in konstanter Zeit ausgeführt und neutralisiert so Timing-Angriffsvektoren bei kryptographischer Authentifizierung.
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
25
26
27
28
29
30
31
32
33
34
35
package mainimport ("crypto/hmac""crypto/sha256""crypto/subtle""errors""fmt")var ErrInvalidMAC = errors.New("invalid message authentication code")func VerifyHMAC(message, messageMAC, key []byte) error {mac := hmac.New(sha256.New, key)mac.Write(message)expectedMAC := mac.Sum(nil)if subtle.ConstantTimeCompare(messageMAC, expectedMAC) != 1 {return ErrInvalidMAC}return nil}func main() {key := []byte("secret-signing-key")msg := []byte("payload-to-verify")mac := hmac.New(sha256.New, key)mac.Write(msg)validMAC := mac.Sum(nil)if err := VerifyHMAC(msg, validMAC, key); err != nil {fmt.Println("Verification failed:", err)} else {fmt.Println("Verification succeeded!")}}
Erklärung
1
if subtle.ConstantTimeCompare(messageMAC, expectedMAC) != 1 {
Vergleicht Byte-Slices in konstanter Zeit und gibt 1 bei Gleichheit und sonst 0 zurück, ohne die Ausführungsdauer preiszugeben.