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.