Files
nexarch/internal/timingsafe/timingsafe.go
T

31 lines
1.3 KiB
Go

// Package timingsafe stellt die kanonische Implementierung der projektweiten
// Coding-Konvention aus IAM-15 bereit: jeder Vergleich, der eine
// sicherheitsrelevante Zugriffsentscheidung trifft (Passwort-Hash, Token,
// Signatur, 2FA-Wiederherstellungscode), nutzt einen timing-safe/constant-time
// Vergleich, nie den regulaeren ==-Operator. Siehe docs/CODING-GUIDELINES-CORE.md.
//
// Bestehende Vergleichsstellen (internal/totp, internal/webhook,
// internal/moduleregistry) implementieren dasselbe Muster bereits inline mit
// crypto/subtle direkt — dieses Package buendelt es fuer neue Vergleichsstellen,
// ersetzt die bestehenden nicht zwangsweise (kein Umbau angrenzender Bereiche).
package timingsafe
import "crypto/subtle"
// Equal vergleicht zwei Byte-Slices timing-safe. Unterschiedliche Laenge gilt
// als "nicht gleich", ohne dass die Laufzeit dabei die Laenge verraet, die
// zum Ergebnis gefuehrt hat, mehr als durch den Laengenunterschied ohnehin
// unvermeidbar waere.
func Equal(a, b []byte) bool {
if len(a) != len(b) {
return false
}
return subtle.ConstantTimeCompare(a, b) == 1
}
// EqualString ist die String-Variante von Equal fuer den haeufigen Fall,
// dass beide Seiten bereits als string vorliegen (z. B. TOTP-Codes).
func EqualString(a, b string) bool {
return Equal([]byte(a), []byte(b))
}