Криптография .NET, предотвращение временных атак

Я просматривал сайт 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]); делать?

Ответы на вопрос(1)

Ваш ответ на вопрос