Я просматривал сайт crackstation.net и наткнулся на этот код, который был прокомментирован следующим образом:
Сравнивает два байтовых массива с длительно-постоянным временем. Этот метод сравнения используется, чтобы хэши паролей не могли быть извлечены из онлайновых систем с использованием временной атаки, а затем атакованы в автономном режиме.
private static bool SlowEquals(byte[] a, byte[] b)
{
uint diff = (uint)a.Length ^ (uint)b.Length;
for (int i = 0; i < a.Length && i < b.Length; i++)
diff |= (uint)(a[i] ^ b[i]);
return diff == 0;
}
Может кто-нибудь объяснить, как работает эта функция, почему нам нужно преобразовать длину в целое число без знака и как этот метод позволяет избежать временной атаки? Что делает линия diff |= (uint)(a[i] ^ b[i]);
?