Передача конфиденциальных данных с языка Си на язык Java


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

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

Я не могу отправить эти дополнительные данные через popen (), так как они будут видны через ps -f.

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

Я рассматривал возможность использования shared mem (/dev/shm), но это тоже можно просмотреть или использовать скрытые файлы. Поскольку это также связано с накладными расходами на создание файлов для каждого вызова, я не полностью за.

Я посмотрел на ANON отображение файлов, но я думаю, что, Я не могу использовать его в Java стороне. Аналогично, использование ссылки fmemopen() не представляется возможным через Java. Были бы трубы FIFO лучшим вариантом? Или их тоже можно легко прочитать?

Если я просто прибегну к простому mmap() и запишу в него данные (не создам его на диске-нет O_CREAT в открытом вызове ), а не выполню msynch, останется ли он полностью в памяти? Могу ли я тогда читать на Java из него?

Является ли шифрование моим единственным вариантом или я упускаю что-то основное?

Это link обсуждает отправку простых данных на Java из C.

2 2

2 ответа:

Если пользователь может использовать tcpdump, у него есть корневой доступ. Этот пользователь также может поставить отладчик на вашу программу Java и посмотреть, что именно она делает, даже до того, как данные будут зашифрованы. Единственный способ достичь того, что вы хотите, - это использовать методы полного запутывания и шифрования, как это делает клиент Skype1.

Но поскольку вы в то же время говорите, что данные не , что чувствительны, это кажется излишним. Может быть, простая техника обфускации, так что выход не виден случайному наблюдателю этого достаточно? (Какпредложил рокер .) Либо это, либо убедитесь, что "ненадежный" пользователь не имеет корневого доступа к серверу, на котором работает ваша система (программа Java + C).

Приличный2 запутывание и, вероятно, хороший компромисс, было бы использовать mmap() (или System V shared mem) для связи.

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

Кроме того, вы рассматривали возможность использования JNI вместо этого, чтобы получить доступ к вашему c-коду? Таким образом, ваш C-код будет частью процесса Java, и недоверчивый пользователь будет нуждаться в отладчике, чтобы следить за тем, что происходит.


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

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

Лучший способ избежать интенсивного использования данных пользователем-encr. Если вы все еще хотите другой механизм, чем один способ -
Если ваши данные содержат смесь нескольких типов данных, например int float char* и т. д. чем конвертировать данные в двоичный формат. двоичные данные не читаются непосредственно пользователем. Но напряженный пользователь, если он хочет, может конвертировать обратно в исходный формат. Его вид encr только пользователь может decr его, если они хотят.

Но это не рекомендуется. Используйте некоторые стандартные encr.