Кроссплатформенный способ скрытия криптографических ключей в C ++? - PullRequest
4 голосов
/ 11 июля 2009

Моему приложению нужно использовать пару жестко закодированных симметричных криптографических ключей (хотя я знаю, что хранение открытого ключа было бы единственным идеальным решением, это не подлежит обсуждению). Мы хотим, чтобы ключи хранились обфусцированы , чтобы они не были распознаваемы при анализе исполняемого файла и оставались «живыми» в памяти как можно меньше времени - чтобы увеличить сложность памяти дамп извлечения их в виде открытого текста. Я заинтересован в использовании функций C ++ (на ум приходит использование каких-то scoped_key). Решение должно быть portable - Windows, Linux, MacOS -, поэтому оно не может использовать преимущества крипто API операционной системы.

Как бы вы занялись проектированием такой системы? Большое спасибо.

Ответы [ 6 ]

4 голосов
/ 11 июля 2009

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

У Джона Скита тоже есть хорошая статья на эту тему.

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

3 голосов
/ 11 июля 2009

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

if(!passesCheck()) {
  exit(1); 
}

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

3 голосов
/ 11 июля 2009

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

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

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

* Добавьте сюда заявление об отказе от того, насколько глупа безопасность через мрак *

2 голосов
/ 11 июля 2009

Вам следует обратиться к программному обеспечению Tamper Resistance, например Cloakware и Arxan .

TR не дешево :) 1007 *

0 голосов
/ 11 июля 2009

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

0 голосов
/ 11 июля 2009

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

...