Предлагаю вашему вниманию вольный перевод интересной заметки о тяжком бремени программистов, занимающихся криптографическими алгоритмами. Заметка — личный взгляд человека, который уважает таких программистов, но сам ни за что бы не полез в криптографию.
Мы, программисты, любим ошибаться. Мелкие баги, крупные баги, лень — возможности бесконечны.
Обычно узнаём об этом сразу же: у нас валятся тесты, где-нибудь в логах видны возникшие исключения, или мы слышим жалобы от наших клиентов — мол, то и сё перестало работать.
В большинстве случаев нам даже не важно, насколько этот баг опасен — его можно временно обойти, а приложение продолжит нормально функционировать в целом. Как только причина находится, мы фиксим баг и все довольны.
Но давайте представим, что вы допустили что-нибудь вроде ошибки на одну позицию. Нормально, бывает. А затем обнаруживаете, что даже с этой ошибкой результат работы функции остался неизменным. Как если бы ошибки вообще не было.
Представьте, что не смотря на правильные данные на выходе, из-за этой ошибки они на самом деле абсолютно бесполезны и вся ваша программа также стала абсолютно бесполезной.
Добро пожаловать в мир криптографии.
Криптография не может быть «немного глючной». Не может быть «в целом рабочей». Либо она работает на 100% верно, либо вы зря вообще взялись за эту работу. Слабое звено рвёт всю цепь.
Хуже: разглядывая данные, которые программа производит на выходе, вы не заметите подвоха. Вы шифруете что-то, на выходе какой-то рандомный хлам. Вы дешифруете этот хлам — видите исходный текст. Вроде работает. Да?
На прошлой неделе была статья о бреши в генераторе случайных чисел в алгоритме сервиса cryptocat — отличный тому пример.
Баг был вызван той самой ошибкой на одну позицию в их генераторе случайных чисел. На выходе у функции были по-прежднему случайные числа, и при детальном рассмотрении выглядели случайными. Эффект усилил тот факт, что мы привыкли считать написанный код корректным.
Но это всё не так. Баг присутствовал и случайные числа оказались недостаточно случайными.
Слабейшее звено сломано, все усилия ради обеспечения защиты оказались напрасными, что ещё хуже в данном случае, потому что единственным предназначением этого приложения и была защита.
Защита здесь — не просто дополнительная фича в комплекте к основным. В данном случае она и являлась основным функционалом.
Эта маленькая ошибка на одну позицию вмиг сломала прил��жение целиком, но была абсолютно невидимой при взгляде на возвращаемый результат. Написание теста для этого случая требовало бы специальных навыков и умений, да и вероятность допущения ошибки в тесте настолько же высока, насколько высока вероятность ошибки в самом коде, требующем тестирования.
Вот почему, друзья мои, я держусь подальше от криптографии. Я просто не настолько крут. Криптография — это мир, где обычного понимания сути, понимания низлежащей математики и умения писать тесты не хватает.
Вы обязаны ставить перед собой цель достичь совершенства. Если достичь не удаётся — вы безнадёжны.
Криптография — это то, что я лучше доверю другим. Либо они смогли достичь совершенства, таких я крайне уважаю, либо у них тоже не вышло, таким я посочувствую.
===
Автор перевода рекомендует заодно почитать habrahabr.ru/post/181372
Мы, программисты, любим ошибаться. Мелкие баги, крупные баги, лень — возможности бесконечны.
Обычно узнаём об этом сразу же: у нас валятся тесты, где-нибудь в логах видны возникшие исключения, или мы слышим жалобы от наших клиентов — мол, то и сё перестало работать.
В большинстве случаев нам даже не важно, насколько этот баг опасен — его можно временно обойти, а приложение продолжит нормально функционировать в целом. Как только причина находится, мы фиксим баг и все довольны.
Но давайте представим, что вы допустили что-нибудь вроде ошибки на одну позицию. Нормально, бывает. А затем обнаруживаете, что даже с этой ошибкой результат работы функции остался неизменным. Как если бы ошибки вообще не было.
Представьте, что не смотря на правильные данные на выходе, из-за этой ошибки они на самом деле абсолютно бесполезны и вся ваша программа также стала абсолютно бесполезной.
Добро пожаловать в мир криптографии.
Криптография не может быть «немного глючной». Не может быть «в целом рабочей». Либо она работает на 100% верно, либо вы зря вообще взялись за эту работу. Слабое звено рвёт всю цепь.
Хуже: разглядывая данные, которые программа производит на выходе, вы не заметите подвоха. Вы шифруете что-то, на выходе какой-то рандомный хлам. Вы дешифруете этот хлам — видите исходный текст. Вроде работает. Да?
На прошлой неделе была статья о бреши в генераторе случайных чисел в алгоритме сервиса cryptocat — отличный тому пример.
Баг был вызван той самой ошибкой на одну позицию в их генераторе случайных чисел. На выходе у функции были по-прежднему случайные числа, и при детальном рассмотрении выглядели случайными. Эффект усилил тот факт, что мы привыкли считать написанный код корректным.
Но это всё не так. Баг присутствовал и случайные числа оказались недостаточно случайными.
Слабейшее звено сломано, все усилия ради обеспечения защиты оказались напрасными, что ещё хуже в данном случае, потому что единственным предназначением этого приложения и была защита.
Защита здесь — не просто дополнительная фича в комплекте к основным. В данном случае она и являлась основным функционалом.
Эта маленькая ошибка на одну позицию вмиг сломала прил��жение целиком, но была абсолютно невидимой при взгляде на возвращаемый результат. Написание теста для этого случая требовало бы специальных навыков и умений, да и вероятность допущения ошибки в тесте настолько же высока, насколько высока вероятность ошибки в самом коде, требующем тестирования.
Вот почему, друзья мои, я держусь подальше от криптографии. Я просто не настолько крут. Криптография — это мир, где обычного понимания сути, понимания низлежащей математики и умения писать тесты не хватает.
Вы обязаны ставить перед собой цель достичь совершенства. Если достичь не удаётся — вы безнадёжны.
Криптография — это то, что я лучше доверю другим. Либо они смогли достичь совершенства, таких я крайне уважаю, либо у них тоже не вышло, таким я посочувствую.
===
Автор перевода рекомендует заодно почитать habrahabr.ru/post/181372
