我正在开发一个C程序,它必须通过Java
调用main()
popen()
并将一些数据作为命令行参数发送给它。但是,还有一些数据需要从Java
发送到C
,这在性质上有些敏感(不过密码种类)。
我正在尝试查看除了加密之外是否还有其他选项可以将此额外数据从C发送到Java。我试图避免开销,因为数据不那么敏感以便加密,但我对这方面的任何建议持开放态度。
我无法通过popen()发送此额外数据,因为它将通过ps -f
显示。
同样,使用套接字似乎不可行,因为tcpdump
也可以显示该信息。
我考虑过使用共享mem (/dev/shm)
,但也可以查看或使用隐藏文件。因为,这也带来了为每次调用创建文件的开销,我并不完全赞成。
我查看了ANON
文件映射,但我想,我不能在Java端使用它。
同样,使用fmemopen()
引用似乎不可能通过Java实现。
FIFO
管道会更好吗?或者他们也可以轻松阅读?
如果我只使用普通mmap()
并向其写入数据(不在磁盘上创建它 - 在公开调用中没有O_CREAT ),而不是执行msynch
它会不会完全留在记忆中?我可以从中读取Java吗?
加密是我唯一的选择还是我遗漏了一些基本的东西?
这个link讨论从C发送普通数据到Java。
答案 0 :(得分:2)
如果用户可以使用tcpdump,则该用户具有root访问权限。即使在数据加密之前,该用户也可以在Java程序上放置调试器并确切地查看它的功能。实现您想要的唯一方法是采用完全混淆技术和加密,例如Skype客户端 1 。
但是既然你在同一时间说,数据不是那敏感,那么它似乎有些过分。也许一个简单的混淆技术所以输出对于一个不经意的观察者来说是不够的就足够了? (与建议Rocker一样。)或者确保“不受信任的”用户在运行系统(Java + C程序)的服务器上没有root访问权限。
一个体面的 2 混淆,可能是一个很好的权衡,就是使用mmap()(或System V shared mem)进行通信。
如果使用MAP_LOCKED选项和MAP_ANONYMOUS,则内存区域不会以磁盘结尾。 MAP_LOCKED阻止它进行交换,MAP_ANONYMOUS告诉操作系统不使用后备文件。
另外,您是否考虑使用JNI来访问您的C代码?这样,您的C代码将成为Java进程的一部分,不信任的用户需要调试器来监视正在发生的事情。
<小时/> 1 Skype客户端并非不可能窥探,但非常困难。这需要付出代价,在保持混淆技术完整的同时,维护代码必须是额外的代价。这也是Skype编码员和研究人员之间的军备竞赛,试图找出它的工作原理。
2 它会阻止我很长一段时间,在我弄清楚发生了什么之前,我必须阅读很多关于调试技术的知识,然后做了很多工作来弄清楚是什么关于这两个项目之间的“谈话”。一个更有才能的人最多可能在下午解读一切。
答案 1 :(得分:-1)
避免有意用户使用数据的最佳方法是加入。如果你还想要其他机制而不是一种方式 -
如果您的数据包含多种数据类型的混合,即int float char *等,则将数据转换为二进制格式。用户无法直接读取二进制数据。但如果他想要用户可以转换回原始格式。它的类型仅限用户可以根据需要进行decr。
但不建议这样做。使用一些标准的内容。