csharp / expert
Snippet
Sequenzvergleich in konstanter Zeit
In kryptografischen Kontexten kann der Vergleich von Geheimnissen (wie Hashes oder Signaturen) mit Standard-Gleichheitsoperatoren Informationen über Timing-Seitenkanäle preisgeben. Ein 'Short-Circuit'-Vergleich kehrt schneller zurück, wenn sich das erste Byte unterscheidet, was es Angreifern ermöglicht, Werte Byte für Byte per Brute-Force zu ermitteln. Der Vergleich in konstanter Zeit stellt sicher, dass die Operation unabhängig von der Position des Unterschieds gleich lange dauert, indem eine bitweise XOR-Akkumulation verwendet wird.
snippet.cs
csharp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System.Runtime.CompilerServices;using System.Security.Cryptography;public static class SecurityUtils{[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]public static bool FixedTimeEquals(ReadOnlySpan<byte> left, ReadOnlySpan<byte> right){if (left.Length != right.Length) return false;int result = 0;for (int i = 0; i < left.Length; i++){result |= left[i] ^ right[i];}return result == 0;}// Standard library alternative available in System.Security.Cryptographypublic static bool SecureCompare(byte[] a, byte[] b) =>CryptographicOperations.FixedTimeEquals(a, b);}
Erklärung
1
[MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
Verhindert, dass der JIT-Compiler die Schleife wegoptimiert oder die Methode inline einfügt, was Timing-Leaks wieder einführen könnte.
2
result |= left[i] ^ right[i];
Verwendet XOR, um auf Unterschiede zu prüfen; wenn sich ein Bit unterscheidet, wird 'result' ungleich Null und bleibt dies bis zum Ende der Schleife.