Вернуться   Биткоин Форум > Разработка и Техническое Обсуждение
2 декабря 2014, 10:40:46 PM   # 1
 
 
Сообщения: 840
Цитировать по имени
цитировать ответ
по умолчанию Re: криптографического программного обеспечения - написание безобразный бит.

Взлом Биткоин адресов.
500 Биткоинов взломаны в "мозговом кошельке" с паролем "bitcoin is awesome"
Адрес кошелька: 14NWDXkQwcGN1Pd9fboL8npVynD5SfyJAE
Приватный ключ: 5J64pq77XjeacCezwmAr2V1s7snvvJkuAz8sENxw7xCkikceV6e
подробнее...


Всем кто хочет заработать Биткоины без вложений - рекомендую сайт http://bitcoin-zarabotat.ru
Это происходит со мной, что корабль проектирования и написания программного обеспечения cryptographc так, чтобы она не попадала конфиденциальной информации является, в лучшем случае,
черный искусство, и большинство необходимых методов не широко известно, задокументировано, или совместно.

Держу пари, есть тысячи советов и трюки, которые большинство из нас никогда не писали, потому что они являются безобразными деталями, которые не очень
интересно математически. Я хотел бы услышать методы кодирования, что и другие, разработанные для контроля боковых каналов и программное обеспечение для записи, которая является одновременно надежным и не утечки информации.

Вот некоторые из моих.

Во-первых, я пишу модульные тесты для всего. Часто даже прежде чем писать вещи. Удивительно, как часто криптографический код может выглядеть, как это
делать правильные вещи в то время как на самом деле делать что-то очень тонко другое, что вы, вероятно, не заметите было иначе. Как иметь неправильный период для вашей реализации некоторой LFSG на основе вещи, как на Вихрь Мерсенна - это неправильно на один бит, а выход по-прежнему выглядит хорошо, но это будет небезопасно и иметь период путь короче, чем вы ожидали, что дает ваше программное обеспечение годная для использования ошибки. Или проверка отзыва сертификатов, а затем принимать сертификат, который был аннулирован в любом случае.

Или получать шифровать-Расшифровать, который воспроизводит открытый текст, но не производит такой же вывод на тестовых векторов в качестве стандартной реализации вы пытаетесь быть совместимы с (и, если он не производит такой же вывод, весьма вероятно, что это стандартная реализация, что это более безопасный, чем ваш ....) Или найти ключ сервер недоступен, а затем падает обратно на прием сертификата без отображения ошибки он должен был показать, не зная, есть ли хороший сертификат. Во всяком случае, писать много модульных тестов. Мало того, что они делают, что вы знаете, что ваши процедуры делают, они также сказать вам, когда вы что-нибудь сломать.

Сборки отладки вызывают модульные тесты, и они пишут файл результатов тестирования. Файл результаты испытаний, а не исполняемый файл, обычный
Makefile цели, и инструкция Makefile для построения результатов испытаний конца с «кошкой results.txt», который присоединяет вывод результата теста (т.е. пустая строка следует списки любых ошибок модульного тестирования) непосредственно к выходу компиляции, так же как и любым другим ошибки, которые требуют фиксации.

Если я получу выбор об этом, я стараюсь делать всю криптографию в однопоточном, выделенном исполняемом файле, который делает очень мало еще. Это
гораздо легче анализировать и отлаживать однопоточное приложение.

Знайте свои параметры компилятора. Использование диагностических и стандартных по принуждению них тяжело. Используйте те, которые позволяют расширения системы безопасности, характерные для конкретного компилятора, если это помогает (например, канареек стека или опции к нулю всю память, выделенную для вашей программы на выходе), но сделать все возможное, чтобы написать код, который не полагается для своей безопасности только на тех, расширения, потому что рано или поздно кому-то нужно будет скомпилировать его на другой компилятор. Отбросьте любое стандартное непосильным расширение, которые не будут работать (особенно, если они также будут вызывать ошибки) в различных средах.

Я пишу в C, используя стандартные библиотеки и библиотеки bignum GMP. GMP имеет некоторые не очень широко известных примитивы, которые специально для криптографического использования и не оставлять ничего в стеке или в буферах. Они немного медленнее, чем "нормальный" набор вызовов, но это нормально. Стандартная C библиотека в большинстве случаев может доверять, чтобы делать то, что они говорят, и больше ничего. Это своего рода позор, потому что другие языки имеют хорошие средства, меньше "не определено" поведение, и значительно более высокий уровень защиты от программиста ошибок, но нет никакого способа обойти это, потому что AFAIK нет другого языка позволяет мне абсолютно контролировать, когда и будут ли сделаны копии, когда и будет ли запись в переменные на самом деле произошло, и т.д., а также. Который не высокая похвала для C, потому что она по-прежнему трудно и безобразной и ошибок. Но, по крайней мере, это возможно.

В Runtimes, шаблоны и библиотеки, которые приходят с большинством языков (и здесь я включаю C ++) можно доверять, чтобы делать то, что они говорят, но не заходя более миллион строк трудно, тяжело # ifdef'd шаблон код с тонким гребнем Я не могу верить, что они не делают ничего больше. Поэтому я не знаю, как писать безопасное программное обеспечение на этих языках, и быть уверенным, что она не будет течь информации. Они выполняют свои смысловые цели хорошо, но сделать это, оставив копии, а также фрагменты копий, все, что они соприкасаются в своих объектах, в неиспользуемых областях их выделенных буферов, пока эти буферы фактически не используются для чего-то еще, и в стеке.

Много криптографического программного обеспечения делает широкое использование глобальных переменных для чувствительных значений. Они быстро, никогда не получить освобождаться или (случайно) копируются во время выполнения, новые значения всегда переписывают предыдущие значения вместо посадку на новых местах в памяти, возможно, оставив копии старых ценностей где-то, и они избегают indirections, которые могли бы оставить указатели на них валяются , Единственное, что хоть немного тонкий убедившись, что они стираются, как только программа не нуждается в них больше, и снова перед выходом из программы, и это не трудно. Шаблон появляется с выделенной «ластиком» рутиной, которая устанавливает их все байты, считанных из / разработчика / случайному перед выходом из программы. Чтения из / разработчика / случайного не могут быть опущены компилятором, поскольку она является побочным эффектом системного уровня. Но если вы читаете из / разработчика / случайному в буфер, а затем скопировать из буфера чувствительных переменных, компилятор может не учитывать, что, поскольку те записи на мертвые переменных. Что необходимо, чтобы прочитать байты из / разработчика / случайный * непосредственно * в глобальные переменные, по одному за раз, если это необходимо. Это помогает, если вы определить тип одноточечно записи, которая держит их всех; Таким образом, вы можете просто переписать запись вместо того, чтобы делать по одному за раз.

Эта модель прекрасно подходит для глобалов, что вы ясно один или два раза в выполнении программы и снова на выходе из программы, но I / O, даже из / разработчика / случайное, является слишком медленным для использования по возвращении из каждой подпрограммы, которая обрабатывает чувствительные переменные. Я вроде не люблю использовать глобальные переменные. Мне не нравится идея, что каждая часть программы имеет доступ к ним. Но я, конечно, использовал их.

C также дает переменные с «файла» сферы, что является еще одним способом, чтобы иметь что-то, что вы не можете DEALLOCATE или потерять след и позволяет ограничить доступ к конфиденциальным переменных JUST подпрограммы, определенные в одном файле. Это, наверное, лучше, чем картина глобал.

Я использую «летучий» ключевое слово много, для обозначения всех локальных переменных, так что запись в эти переменные никогда не будут пропущены, даже если запись на них последнее, что происходит перед процедурой они выделяемой в прибыли. Я не знаю ни одного другого языка, кроме C, что позволяет это. «Летучий» позволяет мне легко использовать локальные переменные и не оставлять ничего чувствительную на стеке, но не использовать его для чего-нибудь, что это не чувствительны. Например, если вы используете летучий переменную индекса цикла, цикл будет работать медленно, потому что код должен написать эту переменную в кэш каждой итерации, а не только отображение его в регистр. Лучше всего иметь правильное переменное авто, который вы используете для этого.

Очень хорошее решение проблемы состоит в выделении большого буфера «безопасности» в качестве локальной переменной в основной (), и есть программа управления свой собственный стек для чувствительных переменных. Путь, который работает в том, что, когда основной () вызывает ничего, это дает ему указатель в буфер безопасности, и размер буфера. Вызываемая процедура проверяет, что буфер достаточно велик, и использует столько же буфера, как это необходимо для его собственных чувствительных местных литьем указатель на буфер в указатель на тип записи, который содержит его чувствительные местные жители. Если он называет что-нибудь еще, что есть чувствительные локальные переменные, он делает это с указателем просто мимо конца его записи, и размером он получил для буфера безопасности минус размера собственной чувствительных местных жителей записи. Как глобал, перед выходом из программы вы называете «ластик», который переписывает весь буфер байт из / разработчика / случайного.

Преимуществом этого является то, что основная () сохраняет контроль над буфером. Он не делает систему медленнее путь «летучий» делает. И если несколько процедур чтение и запись в буфере, компилятор никогда не может Elide пишет в него - так подпрограммы могут легко и надежно удалить любой чувствительный ВАР, что они * не * передавая обратно к их вызывающему, прежде чем они вернутся. Это, вероятно, безопаснее, чем использование «летучие» локальные переменных, потому что можно забыть очистить чувствительные «летучий», прежде чем вернуться, но это никогда не возможно забыть очистить буфер безопасности перед выходом - это, безусловно, сломать модульные тесты. Недостатком этого является то, что обработка буфера, как правило, боль в @ $$, поэтому я предпочитаю использовать «летучий» вместо этого. Я использую назначенный буфер для очень чувствительных переменных, таких как пароли. Абсолютно не рутина, в любом месте, не получает, чтобы сделать свою собственную копию пароля, который живет за пределами буфера, и основные () пишет более, что, как только ключ установлен.

Я видел криптографическое программное обеспечение, где чувствительные местные жители были выделенными с помощью «статического» ключевого слова, чтобы гарантировать, что локальные переменные с чувствительным
информация не высвобождены, когда функция возвращает. Это предотвращает утечку во время выполнения, и статическими переменных, компилятор не может ОБЫЧНО игнорировать пишет, так что вызываемая подпрограмма обычно может очистить значение своих чувствительных местных жителей, прежде чем вернуться. Но это не техника, которую я доверяю, потому что компиляторы ЗАПРЕЩАЕТСЯ игнорировать конечные операции записи в статических переменных, если он может доказать, что начальные значения статических переменных не имеет значения к подпрограмме, сфера они в, и статические местные жители строго хуже, чем глобал для предотвращения утечки, так как основные () не имеют никакого способа, чтобы перезаписать все те, прежде чем он выйдет. Каждый из них освобождается при выходе из программы, и вы просто не знаете, что это будет следующая программа выделить блок памяти, где они содержались.

Я всегда использую целые числа без знака. На самом деле это то, что я узнал сравнительно недавно, в связи с вопросом, поднятым в списке криптографии. Основные математические операторы (сложение, вычитание, умножение) может переполниться, и переполнение на целых чисел (с обычной сервоприводом семантики, которые могут дать отрицательный результат сложения двух положительных чисел) не определено поведение. Если необходимо использовать целые числа и проверить позже для перелива / опоясывающего, вы должны добавить их, как если бы они были целыми числами без знака, как это:

(Беззнаковое целое) г = (беззнаковое целое) х + (беззнаковое целое) у;

потому что переполнение целых чисел без знака * это * определяется поведение.

Вы не можете даже проверить, если неопределенное поведение произошло, потому что компилятор будет идти, "О, это не может произойти за неопределенное поведение, за исключением, и я могу делать все, что я хочу с неопределенным поведением. Я хочу, чтобы игнорировать его."

Затем он перерезал чеки и все, что зависит от них из вашей программы, как «мертвый код». Таким образом, вы можете иметь целое число, которое на самом деле отрицательный из-за опоясывающим, произошедшими при сложении двух положительных чисел, и программа будет прыгать прямо мимо чек для отрицательного значения, не вызывая его.

Crypto кодирование научил меня использовать несколько другие необычные биты стиля кодирования. В шифровании, мы склонны выделять буферы, перестановки и т.д., которые являются «круглые» числа, как 0x100 байт или 0x10000 16-битовых значений. Поскольку мы используем целые числа без знака в любом случае, индексирование в эти буферы с помощью uint8_t или uint16_t переменных дает нам автоматическую проверку безопасности диапазона. Но это трудно писать «для» петли, что выход, если мы итерация всего буфера, так что вместо «для» петли я, как правило, использовать делать / в то время как петли. Если я хочу сделать что-то вроде инициализации перестановки с каждым значением в uint16_t, например, моя обычная идиома, чтобы написать что-то вроде

кол = 0; делать {
  перестановка [число] = кол;
} В то время как (++ кол = 0!);

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

Так вот несколько бит о написании не герметичный криптографический код. Я был больше озабочен предотвращением утечки данных памяти на основе, очевидно, чем контроль другие побочные каналов, такие как сроки или использование мощности.

Кто-нибудь еще здесь хотели бы поделиться некоторыми из методов, которые они используют?
Cryddit сейчас офлайн Пожаловаться на Cryddit   Ответить с цитированием Мультицитирование сообщения от Cryddit Быстрый ответ на сообщение Cryddit


Как заработать Биткоины?
Без вложений. Не майнинг.


3 декабря 2014, 6:45:38 AM   # 2
 
 
Сообщения: 2366
Цитировать по имени
цитировать ответ
по умолчанию Re: криптографического программного обеспечения - написание безобразный бит.

Получил 1806 Биткоинов
Реальная история.





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

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

Рассмотрим, компилятор свободно проливать регистры случайных локальных переменных, когда он может доказать, что их стоимость не имеет значения (например, потому что он никогда не будет снова читать, или потому, что он просто будет перезаписан). Они делают это. Так что теперь у вас есть память с вашей секретной информацией, что ваши обнуления функции не попала.

Это еще хуже, из данных курса в регистрах заканчивается быть чувствительным ... и вызвать другую функцию, и она вызывает Pusha (или друзья) и толкает все регистры на то еще в стеке. ... даже если это не произойдет с вашим текущим набором инструментов, если вы зависите от него, и вы не тестируете, ... ну, вы лучше никогда не обновить набор инструментов.

И тогда, когда вы на многозадачной операционной системы ядро ​​может идти копирование вокруг вашего текущего состояния в практически любой точке.

Использование летучих звучит интересно, но будьте осторожны: До недавнего времени летучий был довольно глючный в GCC и Clang / LLVM, потому что он редко используется, помимо всего, ничего не делая это все, что иногда вызывает неудачную. Я говорю здесь, прежде всего потому, что более поздние испытания со случайно сгенерированным исходным кодом конкретизированы много ошибок ... так что я не думаю, что я предложил бы это, если вы ориентируетесь GCC до 4,8. (Или любой компилятор, который не был подвергнут тем же обширным рандомизированным испытание, которые НКА и звон были).

На тестировании. ОБЯЗАТЕЛЬНО ПРОВЕРЬТЕ СЛУЧАИ КОТОРЫЕ НЕ СЛЕДУЕТ И ESP. "НЕ МОЖЕТ ПРОИЗОЙТИ"  Я видел ... только десятки .. программ не имеют какой-либо безопасности вообще, потому что они не были просто не проверялись с несостоятельными СЛУЧАЯХ. договорились там.

Fuzz тест тоже, когда вы пишете все тесты сами вы не в состоянии обнаружить ваши неправильные представления, Fuzzing может помочь. Неравномерное хаотичность может быть более полезным, длинные прогоны нулей и единиц, как правило, вызывают больше поведения в программном обеспечении. Whitebox фузеры как AFL (и Клей, хотя его боль, чтобы запустить), вы могут получить гораздо более мощный Fuzzing при тестировании полной системы, хотя для модульных тестов вы не нужны вообще.

Инструмент код для контролируемости. Если есть какая-то часть то будет трудно достичь, убедитесь, что у вас есть способ проверить это. Использование отраслевых инструментов анализа покрытия как lcov, чтобы убедиться, что вы покрытие вещи.

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

Утверждения делают все другие испытания более мощными, время, потраченные на них есть супер-линейные возвращения.

Проверьте свои тесты, намеренно нарушая код, как вручную, так и просто постепенно меняется + - или замены 0 и 1 или > а также <И т.д. Вы не можете использовать этот вид тестирования мутации успешно, однако, пока у вас есть 100% тестовое покрытие, так как исполняемый код, очевидно, безопасно мутировать.

Я нашел много в один миллиард ввода масштаба ошибок путем мутирования и улучшения тестов, пока они не поймать все мутации.

Есть инструменты для «TestCase сокращения» для поиска ошибок компилятора, как: http://embed.cs.utah.edu/creduce/  Вы можете запустить его на своем обычном коде и добавить тесты, пока его не удалось удалить ничего, кроме форматирования.

Coverity, лязг-статический анализ, cppcheck, PC-Lint, являются полезными неформальными инструментами статического анализа. Вы должны использовать один или все из них, по крайней мере иногда.

Если кодовая мал, рассмотреть возможность использования звуковых / формальные инструменты статического анализа, как FRAMA-с, по крайней мере, на его части.

Valgrind является спасителем. Узнать его. Любить это. (Также для его Асан кузена в НКУ и лязгом).

Не оставляйте вещи постоянно предупреждение, выяснить способы, чтобы исправить это молчанием безобидных предупреждения или вы пропустите серьезные.

Тест на многих платформах, даже те, которые вы не намерены целью ... различиях в среде выполнения может выявить ошибки в коде, которые иначе были бы незамеченными, но были еще не так. Кроме того, переносимость хорошая защита от неопределенности будущего. Я нашел ошибки на x86 с помощью руки, PA-RISC и Itanium, которые были реальные ошибки, но латентный на x86, но тут же обнаруженную на других платформах из-за небольших различий.

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

Не уклоняться от исчерпывающего тестирования. Иметь важную функцию с <= 32 бита входного пространства состояний? Вы можете проверить каждое значение.

Тестирование одного раза недостаточно: Все эти вещи можно сделать из непрерывных инструментов интеграции. Каждый коммит могут быть проверены, так и для случайных тестов они продолжают добавлять больше испытывать ... не просто впустую циклов центрального процессора. Я потратил время доказав код правильно или широко распушить его, только потом принять патч, добавляющий легко обнаружить неправильное поведение, если только я переделана тестирование. Автоматизация это делает его труднее забыть сделать это или ленивым из него, когда изменение было "очевидно, безопасно", Очевидно, безопасный код редко бывает.

котировка
но нет никакого способа обойти это, потому что AFAIK ни один другой язык не позволяет мне абсолютно контролировать, когда и будут ли сделаны копии,
Да, его норма в каждом месте, кроме C для любого кода, вы не написали, чтобы быть эффективно недетерминирована черный ящик. C ++ может быть меньше, чем ужасно, если вы подмножество, достаточно того, что вы почти не лучше, чем с С.

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

котировка
Я всегда использую целые числа без знака.
Как заботиться, много кодеров C кололи себя по правилам продвижения вокруг знака. Использование неподписанного в счетчиках цикла приводит к большому количеству ошибок в моем опыте, особенно с менее опытными разработчиками. Потратьте время, чтобы действительно узнать правила продвижения хорошо.

котировка
Вы не можете даже проверить, если неопределенное поведение произошло, потому что компилятор будет идти, "О, это не может произойти за неопределенное поведение, за исключением, и я могу делать все, что я хочу с неопределенным поведением. Я хочу, чтобы игнорировать его."
Да, но вы можете проверить заранее, если это произойдет, не вызывая его и избежать. Хотя опыт показывает, что эти тесты часто неправильно. GCC и Clang теперь -fsanatize = неопределенные какие документы подписаны арифметику и заставит программу кричать ошибки во время выполнения. Не так хорошо, как статический уверен, что неопределенное поведение не может произойти.

котировка
Я предпочитаю использовать делать / в то время как петли.
Я использовал ту же самую конструкцию. Кроме того, с замаскированным переменными.

Я намеренно сделал предметы больше и нуль заполнен так, что доступ к маске были гарантированы безопасно. например символ Foo [27]; Foo = 3; становится символом Foo [32]; Foo [я&31] = 3 ;.

Некоторые другие вещи:

Избегайте рекурсию, и никакой рекурсии вообще, если вы не можете статически доказать свою глубину. Запуск из стека не шутка, и источник многих неловко (и даже жизнь threating ошибок). Это не стоит.

Избегайте указатели на функцию. Они дают вам _data_, который контролирует поток вашей программы. ... что может быть как-то записываемый атакующим. Когда указатель функции не может быть полностью избежать попытаться сделать это индексом битного замаскированным в силу два размера сопза массива, который заполняется нулями в ослабленном пространстве.

Sidechannels очень трудно избежать, и даже с большей вероятностью будет подорвана компилятором в отсутствии утечек. Сначала предположим, что вы не можете предотвратить их, и стараться быть безопасными независимо. Bitops вы можете получить постоянное поведение во времени на практике, в том числе нагрузок .. например, и что вы хотите загрузить с ~ 0 и вещи, которые вы не хотите, чтобы загрузить с 0, а или результаты; его утомительный и компилятор может еще услужливо «оптимизирует» прочь вашу безопасность. ... но следующий вариант написания вещи в сборке, которая имеет свои собственные риски. Valgrind предупреждает о любом изменении потока управления (филиалы!) На «UNINITIALIZED данных» есть макросы, которые можно использовать, чтобы установить любые байты, которые вы хотите неинициализированный, так что вы можете сделать ваши секретные данные неинициализированными и Valgrind предупреждают о филиалах (хотя это не совсем звук, некоторые предупреждения получить подавлено).

Освоиться с GCC -S и objdump -d ... Продолжить чтение сборки является единственным способом, чтобы знать наверняка, что вы получаете, и единственным способом, которым вы собираетесь обнаружить, что ваш предполагаемый внеофисный код был заполнен прыжки услужливым компилятором. Кроме того, вы можете сделать ваши секреты имеют отличительные и сваливать ядро, когда вы думаете, что вещи должны быть чистыми, и проверить, действительно ли они на самом деле или нет.

Это можно сделать функции оболочки, которые вызывают вашу реальную функцию, а затем еще один фиктивную функции, которая использует стольких стеков в качестве реальной функции и нулей всех. Это один из способов вы можете остановить кровотечение на утечки стека данных ..

Совсем недавно я наклонилась, что динамические доступы массив не постоянная времени на всех аппаратных средств, даже если вы уверены, что всегда ударил по той же схеме кэш-линии, что требует использования маскировки для нагрузок, когда индексы бы секретные данные.

В некоторых случаях это может быть полезно, чтобы сделать вашу карта памяти может быть разреженной и Ваши данные окружены в море недоступных страниц, позволяя аппаратный MMU сделать некоторые границы проверки бесплатно. Этот класс подхода используется asm.js и классическим «электрический забор» отладка памяти инструмента.

Данные-структуры могут иметь начало и конец Канарейки значения. Установите их после инициализации их, проверять их каждый раз, когда вы используете структуру данных, обнулить их, когда структуру данных освобождаются ... найти случаи, когда код случайно использует освобожденный или не выделенную структуру данных гораздо чаще. Esp при пересечении границы, кто-писал-этого-кода.

GCC имеет аннотацию для аргументов функции, которые не должны быть пустой и для функций, чтобы иметь результаты, которые не должны быть проигнорированы. Они могут быть использованы для включения молчащих ошибок в предупреждение. Но будьте осторожны: не-нуль учит оптимизатор, что аргумент не может быть нулевым и _will_ привести к оптимизации вашей не nullness чеки, так что используйте их в заголовках, но не компилировать код с ними. (См libopus или libsecp256k1 для примеров).

Сложность является врагом безопасности. Ищите простоту. Они говорят, что код Nx сложнее отлаживать, чем в коде, так что если вы кодирования на свой лимит, вы не можете отлаживать его. При отладке, вы по крайней мере некоторые положительные доказательства плохого, что случилось, ... вы знаете, губительное какой-либо форме было возможно, в самую минуту. Создание безопасного программного обеспечения еще сложнее, потому что ничего не говорит о том, что там было issue--, пока не будет слишком поздно.

Иногда я подозреваю, что его (приблизительно-) невозможно писать безопасный код в одиночку. Другой набор глаз, которые понимают проблему пространства, но не разделяют все недоразумения и предубеждения, может быть невероятно мощным, если вы можете быть достаточно удачливы, чтобы найти некоторые из них. Они также могут помочь держать вас честным вокруг коротких стрижек вы делаете, но не должны, тестовые примеры пропустить Writting. Объятия придирки и гордиться тем, что вы создаете. Он заслуживает дополнительную работу, чтобы сделать его полностью прав, и пользователей, которые будут зависеть от него заслуживаю тоже.

gmaxwell сейчас офлайн Пожаловаться на gmaxwell   Ответить с цитированием Мультицитирование сообщения от gmaxwell Быстрый ответ на сообщение gmaxwell

3 декабря 2014, 11:03:52 AM   # 3
 
 
Сообщения: 543
Цитировать по имени
цитировать ответ
по умолчанию Re: криптографического программного обеспечения - написание безобразный бит.

В целом, я пытался искать различные инструменты, которые помогли бы со всеми этими рекомендациями. Оказывается, есть куча. Можем ли мы получить список инструментов, которые, как правило, предпочтительными при попытке проверки целостности кода? Получил:

(Не знаю, как организовать их)
Valgrind
Coverity, лязг-статический анализ, cppcheck, PC-Lint
Frama-с
AFL, KLEE

В частности, я заинтересован в инструментах, касающихся тестирования мутаций.

Это, вероятно, также будет полезно иметь ссылки на кучу страниц, описывающих каждый из этих тем, по крайней мере там, где они существуют. Например, в блоге тестирования на мутации, другой на целочисленное продвижение и т.д. Первоначально я собирался поставить их сам, но потом я понял, что я не знал бы, если бы я выбрал ссылку с плохой информацией.

На тестировании. ОБЯЗАТЕЛЬНО ПРОВЕРЬТЕ СЛУЧАИ КОТОРЫЕ НЕ СЛЕДУЕТ И ESP. "НЕ МОЖЕТ ПРОИЗОЙТИ"  Я видел ... только десятки .. программ не имеют какой-либо безопасности вообще, потому что они не были просто не проверялись с несостоятельными СЛУЧАЯХ. договорились там.

Это бедро в эти дни, чтобы включить кнопки на ваши проекты для тестового покрытия. 100%! или 97,3%!. По указанной выше причине, я чувствую, что это вводит в заблуждение и является анти-модель. Не то, что тестовое покрытие 100%, это плохо, но это приводит к ложному чувству безопасности в отношении качества вашего кодовой базы. 100% охват является довольно низкий уровень, чтобы быть достижение.
Тэк сейчас офлайн Пожаловаться на Taek   Ответить с цитированием Мультицитирование сообщения от Taek Быстрый ответ на сообщение Тэк

3 декабря 2014, 1:45:50 PM   # 4
 
 
Сообщения: 1652
Цитировать по имени
цитировать ответ
по умолчанию Re: криптографического программного обеспечения - написание безобразный бит.

Отличный совет.

Я хотел бы добавить: вы никогда не бесконечное время, так что вам придется расставить приоритеты.

оригинальный пост Cryddit в переговорах изрядные немного о предотвращении утечки данных в атаках бокового канала; Я просто говорю, что если у вас есть только время, чтобы либо получить 100% код пути модульного тестирования покрытия или вручную код некоторые сборки, чтобы обойти ваш компилятор оставив закрытый ключ в памяти вместо регистра ... Я бы работать на тестовое покрытие.

И если выбор между тестовым покрытием 100% по сравнению с 91% с поддержкой пороговых подписей на нескольких devices-- я выбрал бы порог подписи.

И, конечно же, самый высокий приоритет создания продукта или услуги, и заслуживающим доверия, и что люди хотят использовать.
Гэвин Андресен сейчас офлайн Пожаловаться на Гэвин Андресен   Ответить с цитированием Мультицитирование сообщения от Gavin Andresen Быстрый ответ на сообщение Гэвин Андресен

3 декабря 2014, 4:58:24 PM   # 5
 
 
Сообщений: 96
Цитировать по имени
цитировать ответ
по умолчанию Re: криптографического программного обеспечения - написание безобразный бит.

У меня нет ничего, чтобы добавить здесь, как тот, кто имеет (в лучшем случае) начинающего уровня C / знания C ++.
Но я хочу поблагодарить вас обоих за добавление к этому.
Это те вопросы, которые каждый человек должен иметь в их сознании при написании чувствительную кода шифрования.

Как говорит Гэвин в окольным путем; мы можем только сделать наше самое лучшее со временем нам дано, но у нас есть ответственность здесь.

Я уверен, что я не только один, что иногда удивляешься, как программное обеспечение управляет функционировать на всех. Он часто чувствует, как будто есть тысячи потенциальных векторов входа на моей машине, и только один достаточно. Но это не значит, что не стоит пытаться изо всех сил.

Редактирование: Просто заметил этот драгоценный камень от должности gmaxwell в:
котировка
Он заслуживает дополнительную работу, чтобы сделать его полностью прав, и пользователей, которые будут зависеть от него заслуживаю тоже.
.

Акцент на последнем пункте там, даже если ни один из технических моментов не утонуть в.
Вы инженерно автомобиль. Алиса не обязательно знать, и нельзя ожидать, чтобы знать потенциальные точки отказа.
azeteki сейчас офлайн Пожаловаться на azeteki   Ответить с цитированием Мультицитирование сообщения от azeteki Быстрый ответ на сообщение azeteki

3 декабря 2014, 5:15:56 PM   # 6
 
 
Сообщения: 2366
Цитировать по имени
цитировать ответ
по умолчанию Re: криптографического программного обеспечения - написание безобразный бит.

Я чувствую, что это вводит в заблуждение и является анти-модель. Не то, что тестовое покрытие 100%, это плохо, но это приводит к ложному чувству безопасности в отношении качества вашего кодовой базы. 100% охват является довольно низкий уровень, чтобы быть достижение.
Также в центре внимания номер вида глупо, это хорошо для инструмента, чтобы не сообщать 100%, если это действительно 100% от фактического кода, который работает ... одержимо о количестве может привести к плохим стимулам, как удаление кода обработки ошибок , Кроме того, 100% охват линии способа отличается от 100% охвата отрасли. Я упоминаю покрытие, потому что это безумно полезно просто посмотреть на это, независимо от численности, и потому, что некоторые мощные подходы тестирования я назвать не возможно, если вы не имеете в основном полный охват.

Для таких вещей, как маленькая безопасности криптографических ядер и другого сфокусированного высокого риск работать его довольно разумно ожидать, в основном полный охват; меньше, так и на других кодовых баз.

(В основном завершена:.. Иногда может иметь кода обработки ошибок, которые вы не можете вызвать Вы можете _believe_ это невозможно попасть, но вы не можете _prove_, что это так, вы не можете удалить код и не следует даже рассматривать его удаления или у вас есть какой-то жгут самодовольный дурак, понижающий Зафиксировано покрытие. Все эти вещи должны получить тщательную проверку, но они не должны приводить к вам ощущение, что вы не в состоянии получить полный охват.)

котировка
Я уверен, что я не только один, что иногда удивляешься, как программное обеспечение управляет функционировать на всех. Он часто чувствует, как будто есть тысячи потенциальных векторов входа на моей машине, и только один достаточно. Но это не значит, что не стоит пытаться изо всех сил.
Это очень плохо. Я имею в виду, инструменты часто программирования являются одними из наиболее сильно испытанных и надежных частей программного обеспечения (в конце концов, многие из их пользователей хорошо квалифицирован, чтобы найти, отчет и исправления ошибок в них) ... и все же я не считаю, мой код хорошо протестирован, если я не нашел новую набор инструментов или системы библиотек ошибки во время тестирования.

Приоритетные комментарии довольно хорошо. Полный результат, что имеет значение.
gmaxwell сейчас офлайн Пожаловаться на gmaxwell   Ответить с цитированием Мультицитирование сообщения от gmaxwell Быстрый ответ на сообщение gmaxwell

3 декабря 2014, 9:24:15 PM   # 7
 
 
Сообщения: 840
Цитировать по имени
цитировать ответ
по умолчанию Re: криптографического программного обеспечения - написание безобразный бит.

Это бедро в эти дни, чтобы включить кнопки на ваши проекты для тестового покрытия. 100%! или 97,3%!. По указанной выше причине, я чувствую, что это вводит в заблуждение и является анти-модель. Не то, что тестовое покрытие 100%, это плохо, но это приводит к ложному чувству безопасности в отношении качества вашего кодовой базы. 100% охват является довольно низкий уровень, чтобы быть достижение.

Хех. Я на самом деле был менеджер пришел ко мне с нажимной обратно на код, который я написал, потому что он не может достичь 100% покрытия. При исследовании выяснилось, что код пух тестер не может достичь было довольно равномерно типа,

Код:
/ * Вы не можете иметь два элемента то же значение в перестановке! * /
если (Р [х] == Р [у]) {
    DebugPrint ("одинаковые значения, обнаруженные в PRNG состояния перестановки после возвращения из PSWAP. \ п");
    утверждают (1 == 0);
}
IE, это был код пух тестер * НЕ ДОЛЖЕН * никогда не сможет достичь. В конце концов мы остановились на модификацию макроса DebugPrint иметь #ifdef DEBUG блоков, чтобы он мог получить его 100% покрытия на производственной сборке, но я все еще мог бы он написать сообщение и зависания мгновенно при обнаружении ошибки в отладочном.

Кстати, "Написать сообщение и аварии мгновенно" это, безусловно, проще всего для отладки. Бросание исключений, которые получают обрабатываемые далеко от обнаружения ошибки НИКОГДА не является хорошей идеей.
Cryddit сейчас офлайн Пожаловаться на Cryddit   Ответить с цитированием Мультицитирование сообщения от Cryddit Быстрый ответ на сообщение Cryddit

4 декабря 2014, 3:27:52 AM   # 8
 
 
Сообщения: 836
Цитировать по имени
цитировать ответ
по умолчанию Re: криптографического программного обеспечения - написание безобразный бит.

Я всегда озадачен, чтобы увидеть, как криптография сообщество по-прежнему настаивает на квалификации, а не технологии, если речь идет о надежной реализации.

Могу ли я предложить некоторые современные меры предосторожности:

Используйте язык программирования, что:
- невосприимчив к стек манипуляции, переполнения буфера и не имеют арифметики указателей или нулевые строк с разделителями, например, Ява
- имеет immutables вместо синхронизации, например, Scala
Grau сейчас офлайн Пожаловаться на Грау   Ответить с цитированием Мультицитирование сообщения от Grau Быстрый ответ на сообщение Grau

4 декабря 2014, 6:55:04 AM   # 9
 
 
Сообщения: 840
Цитировать по имени
цитировать ответ
по умолчанию Re: криптографического программного обеспечения - написание безобразный бит.

Я всегда озадачен, чтобы увидеть, как криптография сообщество по-прежнему настаивает на квалификации, а не технологии, если речь идет о надежной реализации.

Могу ли я предложить некоторые современные меры предосторожности:

Используйте язык программирования, что:
- невосприимчив к стек манипуляции, переполнения буфера и не имеют арифметики указателей или нулевые строк с разделителями, например, Ява
- имеет immutables вместо синхронизации, например, Scala


Вы говорите о вещах, которые защищают от семантических ошибок, которые являются хорошими. Но криптографический код имеет требования, которые не рассматриваются в семантических моделей; мы должны избегать создания утечки информации.

Я сторонник того, чтобы использовать более сложные язык, если мы сможем найти реализацию им, что обещает не делать не копировать, не переселяющиеся переменные, никогда не распределяют свои собственные буферов над районами, которые могут по-прежнему содержат личные ценности, не делает "оптимизировать расстояние" пишет переменные, когда будущие значения не значат ничего, или, по крайней мере, позволяют нам заказать его не, позволяет нам знать, когда регистр разливы писать вещи в память и т.д. 

Я очень люблю хорошие языки, которые имеют хорошие средства защиты от семантических ошибок, и использовать их практически для всех без криптографической проекта. Но я никогда не находил язык, и имеет хорошие защиты от семантических ошибок вида вы говорите * И * достаточный контроль над утечками стороны канала низкого уровня, что он может быть использован для криптографической коды. 

Если я должен обойтись без одного или другого, я буду делать без того, что я могу по крайней мере, возможно восполнить с достаточной осторожностью и тестирования.

В других новостях, кто-то прислал мне личное сообщение со ссылкой я хотел бы поделиться с y'all: Получается, что мы не первые люди, чтобы иметь этот разговор.

https://cryptocoding.net/index.php/Coding_rules
Cryddit сейчас офлайн Пожаловаться на Cryddit   Ответить с цитированием Мультицитирование сообщения от Cryddit Быстрый ответ на сообщение Cryddit

4 декабря 2014, 10:06:20 AM   # 10
 
 
Сообщения: 836
Цитировать по имени
цитировать ответ
по умолчанию Re: криптографического программного обеспечения - написание безобразный бит.

Я всегда озадачен, чтобы увидеть, как криптография сообщество по-прежнему настаивает на квалификации, а не технологии, если речь идет о надежной реализации.

Могу ли я предложить некоторые современные меры предосторожности:

Используйте язык программирования, что:
- невосприимчив к стек манипуляции, переполнения буфера и не имеют арифметики указателей или нулевые строк с разделителями, например, Ява
- имеет immutables вместо синхронизации, например, Scala


Вы говорите о вещах, которые защищают от семантических ошибок, которые являются хорошими. Но криптографический код имеет требования, которые не рассматриваются в семантических моделей; мы должны избегать создания утечки информации.


Я понимаю, что язык с помощью ручного управления памятью дает больше контроля. Я сомневаюсь, однако, что контроль является практически эффективным. Если ваш код криптографии не работает встроенный в надежном вычислительном устройстве, вы не можете быть уверены, что его память не попадала информации в какой-то слой виртуализации.

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

Кстати, эти проблемы не являются "просто" Семантика, но богатые источники всех видов подвигов.
Grau сейчас офлайн Пожаловаться на Грау   Ответить с цитированием Мультицитирование сообщения от Grau Быстрый ответ на сообщение Grau

6 декабря 2014, 12:52:12 PM   # 11
 
 
Сообщения: 507
Цитировать по имени
цитировать ответ
по умолчанию Re: криптографического программного обеспечения - написание безобразный бит.

Очень информативно обсуждение, и я действительно ценю усилия.

На последнем бите, я должен принять сторону Грау. Портирование низкоуровневого кода на языке высокого уровня, возможно, потребуется немного усилий, но количество проверок стрелочных безопасности, пух испытаний и единичных испытания чрезвычайно снижается. Кроме того, не каждый кодер может писать безопасный код низкого уровня. Если проект требует вклада сообщества, будучи на языке низкого уровня может быть бременем для более начинающих программистов.
ed_teech сейчас офлайн Пожаловаться на ed_teech   Ответить с цитированием Мультицитирование сообщения от ed_teech Быстрый ответ на сообщение ed_teech

6 декабря 2014, 1:17:50 PM   # 12
 
 
Сообщения: 2366
Цитировать по имени
цитировать ответ
по умолчанию Re: криптографического программного обеспечения - написание безобразный бит.

На последнем бите, я должен принять сторону Грау. Портирование низкоуровневого кода на языке высокого уровня, возможно, потребуется немного усилий, но количество проверок стрелочных безопасности, пух испытаний и единичных испытания чрезвычайно снижается. Кроме того, не каждый кодер может писать безопасный код низкого уровня. Если проект требует вклада сообщества, будучи на языке низкого уровня может быть бременем для более начинающих программистов.
А некоторые виды безопасности, в частности, было почти исключительно говорить виды безопасности Cryddit о становится невозможным. Между тем, в виде кодов Cryddit, о которых говорят многие из проблем, вы надеялись решить уже конструктивно невозможно, и доказуема так ... например, потому что они делают _no_ динамическое выделение памяти на всех, потому что нет памяти данных динамических не обращается на всех, или доступы очень эффективно, ограничивает проверяются с помощью маскирования, и т.д. Это может также применяться к различным видам программного обеспечения, чем Cryddit говорило, те, где худший случай память или сложность процессора является существенным ограничением безопасности в связи с необходимостью противостоять атакам в виде патологических входов, или подавить временные побочные каналы.
gmaxwell сейчас офлайн Пожаловаться на gmaxwell   Ответить с цитированием Мультицитирование сообщения от gmaxwell Быстрый ответ на сообщение gmaxwell

6 декабря 2014, 2:32:09 PM   # 13
 
 
Сообщения: 1610
Цитировать по имени
цитировать ответ
по умолчанию Re: криптографического программного обеспечения - написание безобразный бит.

Марк Karpeles было поддерживать libtomcrypt, что-то я только недавно узнал. Думал, что я хотел бы поделиться этим.
Помните, помните 5 ноября сейчас офлайн Пожаловаться на Помните, помните 5 ноября   Ответить с цитированием Мультицитирование сообщения от Помните помню 5 ноября Быстрый ответ на сообщение Помните, помните 5 ноября

8 декабря 2014, 4:47:49 AM   # 14
 
 
Сообщения: 836
Цитировать по имени
цитировать ответ
по умолчанию Re: криптографического программного обеспечения - написание безобразный бит.

Я не подвергает сомнению ценности навыков в узкой сфере Cryddit обсуждался.

Я думаю, что это еще хороший совет, чтобы нарисовать границу, где мастерство доминирует над качеством коды как можно более узким.
Не обращая внимания на это приводит к) низкому уровню безопасности на уровень системы или б) медленные темпы развития.

Есть бесчисленное множество подвигов) в системах, которые на самом деле использовать хорошо написанные криптографических примитивов. Мир остро нуждается в очень сложные системы защиты свободы и неприкосновенности частной жизни, поэтому темпы развития не является незначительным аспект.
Grau сейчас офлайн Пожаловаться на Грау   Ответить с цитированием Мультицитирование сообщения от Grau Быстрый ответ на сообщение Grau



Как заработать Биткоины?

Bitcoin Wallet * Portefeuille Bitcoin * Monedero Bitcoin * Carteira Bitcoin * Portafoglio Bitcoin * Bitcoin Cüzdan * 比特币钱包

bitcoin-zarabotat.ru
Почта для связи: bitcoin-zarabotat.ru@yandex.ru

3HmAQ9FkRFk6HZGuwExYxL62y7C1B9MwPW