Могу ли я надежно скрыть ключ шифрования c # exe (способом, который не может быть декомпилирован любым известным способом), как в C / C ++? - PullRequest
2 голосов
/ 16 августа 2011

Я люблю c # для программирования приложений (я считаю себя промежуточным с c #, и немного меньше с C / C ++, но я только учусь, ничего особенного пока на арене), и мне нравилось, пока я не обнаружил кого-либо«кто понимает MSIL (не простая задача для изучения ни того, ни другого), может декомпилировать мой код.Меня не волнует, кто-то декомпилирует мой код, но моя главная забота - безопасность для будущих пользователей программы.Я знаю, что существуют запутатели, и я даже знаю один или два, которые действительно хороши, я слышу (даже если они только задерживают декомпиляцию).

Например, если я хочу расшифровать что-то с помощью c #, где-то гдев коде ключ должен быть таким, чтобы он представлял опасность для тех, кто использует мою программу (кто-то, кто знает кого-то, кто зашифровал файл с помощью моей программы, может расшифровать его, изучив мой код MSIL, найдя мой ключ).Кроме того, разработка массивных приложений для шифрования / дешифрования (или OpenSSL) безумна с c #, я думаю, по этой причине.

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

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

Это происходит с Java?(Java имеет ту же структуру «интерпретации» и «декомпиляции», что и C #);Я имею в виду тот факт, что ключ виден в Java (каким-то образованным взглядом) где-то в файле сборки?Или же в Java используется какой-либо API на основе C / C ++, который усложняет (намного сложнее) декомпиляцию файла, в котором находится ключ, и, следовательно, затрудняет его получение?

Является ли я единственным вариантом написания моей программыс с / с ++?Потому что, если это так, мой единственный вариант - C ++ Builder, так как это ад, даже пытаться смотреть (и меньше изучать) код MFC / OWL;Я имею в виду: я не могу думать о ком-то, кому могло бы понравиться программирование MFC / OWL.На самом деле, я полагаю, что Assembly может быть более интересным в современном мире программирования.

Итак, я хочу найти кого-то, кто мог бы объяснить мне лучший способ надежно хранить крипто-ключи для шифрования / дешифрования илииспользовать OpenSSL с c #.Или даже с Java.Я хотел бы подтвердить, что C / C ++ - это единственный способ действительно использовать эти функции с некоторой безопасностью по причинам декомпиляции (как и другие скомпилированные языки программирования, например Delphi).

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

Извините за столь длительный вопрос о философском программировании.,

Спасибо,

МакНадди

Ответы [ 5 ]

16 голосов
/ 16 августа 2011

Могу ли я надежно скрыть ключ шифрования ac # exe (способом, который невозможно декомпилировать каким-либо известным способом), как в C / C ++?

Нет.Вы не можете сделать это на любом языке.

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

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

4 голосов
/ 16 августа 2011

Итак, если я хочу создать программу, которая загружает файл из Интернета, кто-то может помешать передаче и сделать что-то плохое, даже если я использую OpenSSL с c #, потому что где-то в файле c # есть ключ.

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

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

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

1 голос
/ 16 августа 2011

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

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

0 голосов
/ 16 августа 2011

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

Когда пользователю необходимо получить доступ к зашифрованным данным, пароль может быть предоставлен снова, и это генерирует ключ для использования во время этого сеанса.Как только программа закрывается, ключ отбрасывается (в C # есть методы / API, которые помогают обеспечить, чтобы конфиденциальные данные присутствовали в памяти как можно более короткое время).

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

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

0 голосов
/ 16 августа 2011

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

...