Как бы я избавился или значительно сократил разницу во времени при проверке пароля? - PullRequest
0 голосов
/ 25 марта 2019

Мой учитель дал нам сегмент кода, и он хочет, чтобы мы изменили его так, чтобы время выполнения кода (проверка пароля) было либо а) исключено (исправлено), либо б) значительно уменьшено.

РЕДАКТИРОВАТЬ: Мы только что узнали о подсчете количества символов в строке.Поэтому я думаю, что он хочет, чтобы, если кто-то ввел «1941abab», программе потребовалось бы больше времени, чтобы проверить, правильно ли это или нет, потому что первые 5 символов совпадают с правильным ответом.Он хочет, чтобы задержка проверки была медленнее.

s1 = input("Enter Passcode:")
if s1 == "1941abcd":
    print("welcome")
else:
    print("denied")

1 Ответ

1 голос
/ 26 марта 2019

Основной способ сравнения строк - сравнивать одну пару символов за раз: сравнивать первый символ первой строки с первым символом второй строки, а затем вторые символы, затем третий и т. Д.,Как только вы найдете пару, которая не соответствует, вы узнаете , не изучая остальную часть строки , что строки не равны.Если все пары равны, строки равны.В качестве дополнительной оптимизации вы можете начать со сравнения длин строк - если они не одинаковы, они не равны, и вам даже не нужно сравнивать символы.

Этовероятно, что делает ==, и проблема безопасности заключается в оптимизации скорости, когда он прекращает сравнение, когда находит пару, которая не совпадает.Атакующий может попробовать пароли axxx, bxxx, cxxx и т. Д., И, попробовав 1xxx, они заметят, что сравнение занимает немного больше времени, поскольку == теперь проверяет второйпара символов тоже, потому что первая пара символов совпадает.Теперь они знают, что первый символ пароля - 1.Решение: всегда сравнивайте все пары символов, даже после того, как вы определили, что строки не равны (и не сравнивайте длину строк; всегда выполняйте столько сравнений символов, сколько символов впредоставленный пароль - короче, старайтесь не раскрывать никакой информации о действительном пароле).

...