Получить байт-код из памяти, чтобы предотвратить взлом - PullRequest
2 голосов
/ 03 февраля 2009

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

EDIT: Защищает ли подписывание двоичных файлов код от изменения и исполнения? Столько, сколько я хочу защитить моих пользователей, чтобы убедиться, что они используют мое программное обеспечение. Я также хотел бы защитить программу (сервер) от использования взломанным клиентом.

Как я могу определить со стороны сервера, если кто-то вмешался в мой клиент?

Ответы [ 7 ]

15 голосов
/ 03 февраля 2009

То есть вы пытаетесь запретить каким-либо процессам с таким же (или более высоким) уровнем привилегий, как у вашего приложения, манипулировать вашим приложением?

Это задача, которая обречена на провал. Потому что, если вы добавите свои проверки безопасности, что помешает злоумышленнику изменить ваш метод isSecure(), заменив его простым return true;?

8 голосов
/ 03 февраля 2009

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

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

  • Что я пытаюсь защитить?
  • Какими возможностями обладает злоумышленник?

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

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

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

7 голосов
/ 03 февраля 2009

Может быть, вы хотите подписать ваши файлы jar вместо этого?

То, что вы хотите, должно быть возможно через Intrumentation, добавив собственный Transformer. Смотри http://java.sun.com/j2se/1.5.0/docs/api/java/lang/instrument/package-summary.html

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

5 голосов
/ 03 февраля 2009

Как мне определить, не вмешался ли кто-нибудь в мой клиент?

Вы не можете. В интернете никто не знает, собака ли ты; -)

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

NGSCB (ранее известный как Palladium) разработан, чтобы сделать это более безопасным, но у него есть свой собственный набор проблем .

2 голосов
/ 03 февраля 2009

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

1 голос
/ 03 февраля 2009

Подписание банок защитит код от изменения. Подписание включает в себя создание подписи на основе вашего личного ключа. Открытый ключ встроен в банку с этими подписями. Java проверит подписи против вашего открытого ключа и откажется загружать измененные классы.

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

От чего именно вы пытаетесь защититься?

0 голосов
/ 01 апреля 2010

На клиенте вы можете вызвать getResourceAsStream с именем пути к файлу класса в вашем банке.

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

...