У меня есть метод, который сравнивает два байтовых массива на равенство с основным предупреждением о том, что он не терпит неудачу и завершается рано, когда обнаруживает неравенство.По сути, этот код используется для сравнения токенов подделки межсайтовых запросов и предотвращения (насколько это возможно) возможности использовать время для взлома ключа.Хотелось бы найти ссылку на статью, в которой подробно обсуждается атака, но важно то, что у моего кода все еще есть статистически измеримое смещение для более быстрого возврата, если два байтовых массива равны - хотя это порядоклучше.Итак, без лишних слов, вот код:
public static bool SecureEquals(byte[] original, byte[] potential)
{
// They should be the same size, but we don't want to throw an
// exception if we are wrong.
bool isEqual = original.Length == potential.Length;
int maxLenth = Math.Max(original.Length, potential.Length);
for(int i=0; i < maxLength; i++)
{
byte originalByte = (i < original.Length) ? original[i] : (byte)0;
byte potentialByte = (i < potential.Length) ? potential[i] : (byte)0;
isEqual = isEqual && (originalByte == potentialByte);
}
return isEqual;
}
Разница в средней синхронизации между равными и неравными токенами последовательно на 10-25 мс (в зависимости от циклов сбора мусора) короче для неравных токенов.Это именно то, чего я хочу избежать.Если бы относительные сроки были равны, или среднее время поменялось в зависимости от пробега, я был бы счастлив.Проблема в том, что мы постоянно бежим короче за неравные токены.Напротив, если бы мы остановили цикл на первом неравном токене, мы могли бы получить разницу в 80 раз.
Хотя эта проверка на равенство является существенным улучшением по сравнению с обычным рвением, она все еще не годитсядовольно.По сути, я не хочу, чтобы какой-либо последовательный результат для равенства или неравенства возвращался быстрее.Если бы я мог получить результаты в диапазоне, где циклы сбора мусора будут маскировать любое постоянное смещение, я буду счастлив.
У кого-нибудь есть подсказка, что вызывает смещение времени в сторону ускорения неравенства?Сначала я подумал, что это троичный оператор, возвращающий доступ к массиву или константе, если массивы были неравного размера.Проблема в том, что я все еще получаю это смещение, если два массива имеют одинаковый размер.
ПРИМЕЧАНИЕ. В соответствии с запросом, ссылки на статьи по Timing Attacks: