Как скрыть секретные ключи в коде? - PullRequest
43 голосов
/ 18 апреля 2009

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

  • Программное обеспечение DVD-проигрывателя скрывает клавиши CSS
  • Программное обеспечение с серийными номерами / регистрационными кодами скрывает ключи / хэши, используемые для проверки серийных номеров

Очевидно, что эти программы делают нечто большее, чем просто имеют ключ в байте [], так как это облегчило бы кражу их ключей и генерирование ваших собственных серийных номеров и т. Д.

Какие стратегии используются для сокрытия этих ключей, чтобы их нельзя было легко найти?

Ответы [ 10 ]

37 голосов
/ 18 апреля 2009

Причины, по которым эти секретные ключи были так легко обнаружены, в том, что они были спрятаны в программном обеспечении.

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

13 голосов
/ 19 апреля 2009

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

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

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

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

6 голосов
/ 18 апреля 2009

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

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

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

Секретные ключи как часть пары Public-Private Keypair должны храниться в файлах данных, которые могут быть защищены. Симметричные ключи должны генерироваться на лету как Session Keys, а затем отбрасываться. Всегда предполагайте, что любой, кто имеет секретный или сеансовый ключ на своем компьютере, сможет его обнаружить и использовать против ваших намерений.

Для получения дополнительной информации прочитайте " Прикладная криптография " Брюса Шнайера.

5 голосов
/ 18 апреля 2009

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

2 голосов
/ 18 апреля 2009

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

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

1 голос
/ 19 мая 2016

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

1 голос
/ 18 апреля 2009

Вам не всегда нужен ключ для подтверждения лицензии.

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

0 голосов
/ 22 декабря 2017

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

ЕДИНСТВЕННЫЙ способ гарантировать, что ключ шифрования является безопасным, - это ввести его вручную пользователем, когда это необходимо.

0 голосов
/ 18 апреля 2009

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

0 голосов
/ 18 апреля 2009

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

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