C# bcrypt и pbkdf2 проверяют разницу функций пароля
Согласно этому справочному исходному коду, функция SlowEquals
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;
}
Я получил точку зрения автора, чтобы использовать xor & или сделать время сравнения
согласуется, но теперь я совершенно запутался в пароле BCrypt
проверка, нужно ли делать то же самое, чтобы избежать атаки по времени?
Или bcrypt уже настроен на согласованность после хеширования?
Так что он просто проверяет результат с "=="?
Любые идеи или документ / статьи об этом? Благодарю.
1 ответ
Автор исходного кода немного параноик. Атака по времени - это теоретическая атака, применимая только тогда, когда возможно измерить точное время. И он заявляет об этом в своем блоге. Если вы используете bcrypt или PBKDF2 для хеширования паролей в любом приложении веб-клиента, атака по времени практически невозможна. Задержки в сети создают гораздо больше серого шума для времени отклика, чем при сравнении строк.
Поскольку вы должны настроить хэширование пароля на медленный для злоумышленника, но достаточно быстрое для пользователя (скажем, 200 мс для одного хэша), разница в сравнении строк практически не измерима на классическом ПК.
Если вас все еще беспокоит временная атака, вы всегда можете добавить случайный сон непосредственно перед сравнением строк.