методы скрытия чувствительных строк в C ++ - PullRequest
82 голосов
/ 30 октября 2009

Мне нужно хранить конфиденциальную информацию (симметричный ключ шифрования, который я хочу сохранить в секрете) в своем приложении C ++. Простой подход заключается в следующем:

std::string myKey = "mysupersupersecretpasswordthatyouwillneverguess";

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

Какие методы следует использовать, чтобы скрыть такие конфиденциальные данные?

Edit:

ОК, так что почти все вы сказали "Ваш исполняемый файл может быть реверс-инжиниринг" - конечно! Это моя любимая мозоль, поэтому я собираюсь немного разглагольствовать здесь:

Почему 99% (хорошо, так что, возможно, я немного преувеличиваю) всех вопросов, связанных с безопасностью на этом сайте, отвечают потоком «нет никакого способа создать совершенно безопасную программу» - то есть не полезный ответ! Безопасность - это скользящая шкала между идеальным юзабилити и отсутствием безопасности на одном конце и идеальной безопасностью, но не удобством на другом.

Дело в том, что вы выбираете свою позицию на этой скользящей шкале в зависимости от того, что вы пытаетесь сделать, и среды, в которой будет работать ваше программное обеспечение. Я не пишу приложение для военной установки, я пишу приложение для домашнего ПК . Мне нужно зашифровать данные в недоверенной сети с помощью заранее известного ключа шифрования. В этих случаях «безопасность через неизвестность», вероятно, достаточно хороша! Конечно, кто-то, у кого достаточно времени, энергии и навыков, может перепроектировать двоичный файл и найти пароль, но угадайте, что? Мне все равно:

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

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

Ответы [ 13 ]

1 голос
/ 02 ноября 2009

Если вы используете Windows DPAPI, http://msdn.microsoft.com/en-us/library/ms995355.aspx

Как и в предыдущем посте, если вы работаете на Mac, используйте связку ключей.

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

Это решенная проблема, и ответ НЕ держать ключ в вашей программе:)

1 голос
/ 30 октября 2009

Вместо сохранения закрытого ключа в вашем исполняемом файле вы можете запросить его у пользователя и сохранить его с помощью внешнего менеджера паролей , похожего на Mac OS X Keychain Access.

0 голосов
/ 30 октября 2009

Зависит от контекста, но вы можете просто сохранить хеш ключа плюс соль (постоянная строка, которую легко скрыть).

Затем, когда (если) пользователь вводит ключ, вы добавляете salt , вычисляете hash и сравниваете.

В этом случае salt , вероятно, не нужен, он останавливает атаку по словарным переборам, если хеш может быть изолирован (поиск Google также работает).

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

...