2

我正在开发一个 C 程序,它必须调用一个Java main()throughpopen()并将一些数据作为命令行参数发送给它。但是,还有更多数据需要发送到Java这些数据,这些数据C在本质上有些敏感(但不是密码类型)。

我正在尝试查看除了加密之外是否还有其他选项可以将这些额外数据从 C 发送到 Java。我试图避免开销,因为数据并不像加密那么敏感,但我对这方面的任何建议持开放态度。

我无法通过 popen() 发送这些额外数据,因为它将通过ps -f.

同样,使用套接字似乎也不可行,因为tcpdump它也会泄露这些信息。

我考虑使用共享mem (/dev/shm),但也可以查看或使用隐藏文件。因为,这也带来了为每次调用创建文件的开销,我并不完全赞成。

我查看了ANON文件映射,但我想,我不能在 Java 端使用它。同样,fmemopen()似乎无法通过 Java 使用引用。管道会FIFO是更好的选择吗?或者它们也可以轻松阅读?

如果我只是诉诸普通mmap()并向它写入数据(不在磁盘上创建它 - 在公开调用中没有 O_CREAT),并且不执行msynch它会完全保留在内存中吗?然后我可以从中读取Java吗?

加密是我唯一的选择还是我缺少一些基本的东西?

链接讨论从 C 向 Java 发送纯数据。

4

2 回答 2

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这会让我停顿很长一段时间,在弄清楚到底发生了什么之前,我必须阅读大量有关调试技​​术的内容,然后还要进行大量工作才能弄清楚两个程序之间“谈论”了什么。一个更有天赋的人,可能最多一个下午就能破译一切。

于 2013-09-23T06:22:54.133 回答
-1

避免用户过度使用数据的最佳方法是 encr。如果您仍然想要其他机制而不是一种方式 -
如果您的数据包含多种数据类型的混合,即 int float char* 等,则将数据转换为二进制格式。用户不能直接读取二进制数据。但是如果他愿意,强烈的用户可以转换回原始格式。它的那种 encr 只有用户可以根据需要对其进行解密。

但这不推荐。使用一些标准的 encr。

于 2013-09-23T06:17:17.377 回答