csharp / expert
Snippet
Laufzeitkonstantes Buffering zur Vermeidung von Timing-Attacken
In sicherheitskritischem Code muss der Vergleich von Hashes oder Schlüsseln in konstanter Zeit erfolgen, um Side-Channel-Timing-Attacken zu verhindern. 'FixedTimeEquals' stellt sicher, dass die Vergleichsdauer nicht davon abhängt, wie viele führende Bytes übereinstimmen. Die Wipe-Methode nutzt Compiler-Attribute, um zu verhindern, dass der Löschvorgang wegoptimiert wird.
snippet.cs
csharp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System.Runtime.CompilerServices;using System.Security.Cryptography;public static class SecurityUtils{public static bool SecureCompare(byte[] a, byte[] b){if (a == null || b == null || a.Length != b.Length)return false;return CryptographicOperations.FixedTimeEquals(a, b);}[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]public static void WipeSensitiveData(byte[] data){Array.Clear(data, 0, data.Length);}}
Erklärung
1
CryptographicOperations.FixedTimeEquals(a, b)
Führt einen Vergleich durch, bei dem jedes Byte unabhängig von vorherigen Nicht-Übereinstimmungen geprüft wird.
2
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
Weist den JIT-Compiler an, den 'Wipe'-Aufruf nicht zu entfernen, den er sonst als redundant ansehen könnte.