Защитите закрытый ключ в приложении Qt - PullRequest
3 голосов
/ 30 августа 2009

У меня есть приложение Qt, написанное на C ++, которое использует SSL-соединение (QSslSocket) с другим приложением для дополнительной безопасности. Однако в приложение встроен закрытый ключ.

С такими приложениями, как Process Explorer, действительно легко получить секретный ключ. (Свойства файла -> Строки)

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

Ответы [ 4 ]

4 голосов
/ 30 августа 2009

«strings» находит только блоки, которые являются фактическими строками Ascii / UTF8 / Unicode. Если вы храните свой ключ как двоичный буфер, то ничто не отличает его от случайных двоичных данных, которые обычно игнорируются строками.

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

1 голос
/ 30 августа 2009

Вам может понадобиться решение вашей проблемы под другим углом.

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

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

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

Чтобы снизить риски, я обычно стараюсь обеспечить, чтобы в случае нарушения безопасности была нарушена только одна «установка».

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

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

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

Надеюсь, это поможет.

1 голос
/ 30 августа 2009

Зашифруйте его с помощью простого симметричного алгоритма. Например, определите массивы cryptedData и cryptedDataKey, чтобы n -й байт вашего личного ключа можно было получить по cryptedData[cryptedDataKey[n]]. Это спасет вас от кого-то, кто смотрит на ваш двоичный исполняемый файл с текстовым редактором, но не поможет против более или менее опытного человека.

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

0 голосов
/ 30 августа 2009

Другой распространенный метод - поместить секретные данные в двоичный ресурс, такой как изображение значка.

...