c++ - 如何安全地在两个进程之间交换号码
问题描述
这是和的示例myapp1
代码myapp2
:
myapp1 代码:
int main(int argc, char *argv[])
{
int secret = 123;
char buffer[20];
sprintf(buffer,"%d",secret);
char *argv[] = { "/bin/myapp2", buffer, 0 };
char *envp[] =
{
"HOME=/",
"PATH=/bin:/usr/bin",
0
};
int retval = execve(argv[0], &argv[0], envp);
printf("return value is: %d\n", retval);
return 0;
}
myapp2 代码:
int main(int argc, char *argv[])
{
int val = atoi(argv[1]);
some_process(val);
return val;
}
如您所见,我myapp2
正在myapp1
使用execve()
. myapp2
我在它的论点中
发送了一个秘密号码。myapp2
对其进行一些处理并将相同的密码返回给调用程序。现在,我的问题是我希望这个秘密号码对外界保密。使用该ps
命令可以轻松破解密码。我想要的是我想确保myapp2
被调用的是原始的。如果有人用 替换它myappfake
,它也返回相同的密码,我怎么知道我被愚弄了?
基本上,我想确保myapp2
我得到响应的那个是真实的。
解决方案
我会给你一个 RPC 的方向 - 远程过程调用。
这是一个旧协议,但我被一些现代操作系统(如 Linux 或 Windows)使用。
该协议可以在网络上使用。因此,您不仅限于本地站。
并且由于 Linux 和 Windows 都支持本地(无服务器)环境,因此测试或扩展协议都不是问题(而且调用次数不受限制,您可以进行)。
您可以加密或解密每一侧(应用程序点)上的所有数据。RPC 是一个古老的协议。所以,你必须自己做证券。而且,您可以在不同平台上编写 RPC 应用程序,因为 RPC 协议不依赖于任何平台(以本机形式)。但是您必须存储函数调用的两个副本(服务器/客户端)。如果你聪明的话,你可以扩展你的 RPC 包功能不断增长,而无需关心协议的增长。它总是一样的。所以,如果你想扩展你的应用程序,你是非常灵活的。
推荐阅读
- c# - 在 C# 中添加 ID 列表作为 Firebird 查询的参数
- c++ - 使用 C++ 使用 Win32 api 在特定偏移量处打开文件的正确方法
- java - 将 OCL 表达式解析为 AST(抽象语法树)
- python - igraph python中的标签绘制错误
- multithreading - 为什么我使用 openMP atomic 的并行代码比串行代码花费更长的时间?
- python - 使用 Python 计算单词中的字母
- ios - iOS 设备中 Flutter 应用程序中的 Firebase 推送通知不起作用
- python - django推送通知抛出gcm错误
- sql-server - 架构更改后如何检测损坏的存储过程?
- c++ - C++ 默认大括号括起来的初始值设定项列表