0 Tage Serie
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.