0 Tage Serie
csharp / intermediate
Snippet

Implementierung zeitkonstanter Gleichheitsprüfungen für die Sicherheit

Beim Vergleich sensibler Daten wie Passwort-Hashes können Standard-Operatoren Informationen über die benötigte Zeit preisgeben (Timing-Attacken). Ein sicherer Vergleich durchläuft alle Elemente, unabhängig davon, wo ein Unterschied gefunden wird, um eine konstante Ausführungszeit zu gewährleisten.

snippet.cs
csharp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static bool SecureEquals(byte[] a, byte[] b)
{
if (a.Length != b.Length) return false;
int result = 0;
for (int i = 0; i < a.Length; i++)
{
result |= a[i] ^ b[i];
}
return result == 0;
}
// Note: System.Security.Cryptography.CryptographicOperations.FixedTimeEquals
// is the built-in way to do this in .NET.
Erklärung
1
result |= a[i] ^ b[i];
Verwendet XOR, um auf Unterschiede zu prüfen, ohne die Schleife vorzeitig zu beenden.
2
return result == 0;
Wenn das Ergebnis nicht Null ist, war mindestens ein Bit anders, aber das Timing blieb gleich.