go / expert
Snippet
Kryptografischer Vergleich in konstanter Zeit und Bereinigung empfindlicher Speicherbereiche
Timing-Seitenkanalangriffe nutzen Laufzeitunterschiede bei Byte-Vergleichen aus. crypto/subtle.ConstantTimeCompare vergleicht Slices in konstanter Zeit, unabhängig von der Position von Abweichungen. Explizites Nullsetzen des Speichers verhindert das Verbleiben vertraulicher Daten im RAM.
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
package mainimport ("crypto/subtle")type SecureKey struct {secret []byte}func NewSecureKey(data []byte) *SecureKey {k := &SecureKey{secret: make([]byte, len(data))}copy(k.secret, data)return k}func (k *SecureKey) Verify(expected []byte) bool {if len(k.secret) != len(expected) {return false}return subtle.ConstantTimeCompare(k.secret, expected) == 1}func (k *SecureKey) Destroy() {for i := range k.secret {k.secret[i] = 0}}
Erklärung
1
return subtle.ConstantTimeCompare(k.secret, expected) == 1
Vergleicht Byte-Slices in konstanter Ausführungszeit zur Vermeidung von Timing-Seitenkanalangriffen.
2
for i := range k.secret { k.secret[i] = 0 }
Überschreibt den Pufferinhalt explizit mit Nullen, um die Verweildauer von Schlüsseln im Speicher zu minimieren.