Замечание-уточнение по поводу очистки памяти от «секретных» данных: просто забить память нулями — это недостаточно! Наши «регуляторы» в области криптографии требуют, чтобы очищаемая память многократно (обычно 3-5 раз) «забивалась» качественным «шумом».
Это относится к DRAM или дискам?
И нет ли ещё требования на использование membar в дополнение к этому, чтобы гарантировать инвалидацию этой части памяти в кэше?
Дилетантский вопрос: можно ли запустить несколько собственных процессов на той же машине, где и происходит, например, шифрование и по отклонению во времени выполнения операций в них извлечь полезную информацию? Есть ли название у этой разновидности атак?
Да, конечно можно. Timing attacks лет десять назад начали обсуждать теоретически, а сейчас уже вроде какие-то практические демонстрации появились.
Отсюда — некоторое количество приведённых в статье рекомендаций. Конечно на практике их не применяют: сложно и дорого, а при современном наплевательском подходе к безопасности — и не нужно (других дыр хватает).
Работает в предположении, что собирается только gcc и пофиг на оптимизацию от слова совсем, может образоваться hot spot, так что при таком подходе надо ещё профилировать.
Возможно глупый вопрос. А может кто-то посоветовать код сочетающий свойства:
1) Pure C код в одном файле, желательно просто функцию вида get_random()
2) Максимально рандомную
3) Мультиплатформенную
Пишу небольшое статистическое приложение, а просто rand() никуда не годится.
А зачем вам для «небольшого статистического приложения» «pure C код»? На современных процессорах с поддержой AESNI использовать что-то другое без «уважительных причин» попросту глупо (пример «уважительной причины»: вы хотите генерировать одни и те же последовательности на ARM и на x86 и, разумеется, вас больше волнует скорость работы на ARM).
Просто потому что у меня PureC код приложения. Сейчас я использую #include , который за собой тянет уже компилятор С++. И честно говоря даже там распределение хоть и лучше чем у rand(), но все равно не очень радует. )
Безопасное криптопрограммирование. Часть 2, заключительная