c++ 保护应用程序的内存免受篡改

ar5n3qh5  于 2023-05-02  发布在  其他
关注(0)|答案(4)|浏览(171)

我们正在为服务器和客户端应用程序添加AES 256位加密,用于加密包含敏感信息的TCP/IP流量。我们将每天轮换钥匙。因此,密钥将与应用程序一起存储在内存中。
密钥分发流程:
1.每个服务器和客户端将有一个按天列出的初始密钥加密密钥(KEK)列表
1.如果客户端刚刚启动或服务器刚刚启动,则客户端将使用初始密钥向服务器请求每日密钥。服务器将用初始密钥加密的每日密钥进行响应。每日密钥是一组随机生成的字母数字字符。我们使用AES 256位加密。
1.所有后续通信都将使用该每日密钥加密。
1.每晚,客户端将使用当前每日密钥作为当前KEK从服务器请求新的每日密钥。在客户端获得新密钥之后,新的每日密钥将替换旧的每日密钥。
另一个坏的应用程序是否可能非法访问此内存,或者这在Windows中受到保护?密钥不会被写入文件,只存储在内存中的变量中。
如果应用程序可以非法访问内存,那么如何保护内存不被篡改?
我们正在使用C++和XP(Vista/7可能是未来的一个选择,所以我不知道这是否会改变答案)。

szqfcxe2

szqfcxe21#

我觉得你手上可能有个更根本的问题。
如果这台机器有哪怕是最微弱的机会抓住一个rootkit,那么你所有的钥匙都是我们的,就像它一样。
在Windows上,如果以下任一项为真,则进程A可以读取进程B的内存:
1.它具有打开存储器设备的特权。
1.它具有打开进程B的虚拟内存的特权。
1.它在内核中有一个朋友。
如果你完全控制了机器上运行的内容,并且完全相信没有人会带来任何惊喜,那么你就是黄金。
当然,这并不是Windows独有的。Windows的独特之处在于rootkit恶意软件的数量。

nnvyjq4y

nnvyjq4y2#

您的密钥分发过程不安全:如果有人得到了初始密钥集,一切都结束了。
是的,其他应用程序可以使用调试器钩子访问Windows上的进程内存,而且几乎没有办法阻止这种情况。从本质上讲,如果盒子以任何方式受到损害,你能做的很少。

hzbexzde

hzbexzde3#

还有一点信息是,即使您不自己将密钥写入磁盘,它也可能最终会在那里。所需要的只是虚拟存储器系统将保存密钥的存储器页出。
正如其他人所指出的,如果你不能相信你所在的盒子,你无论如何都会被搞砸。有一些方法可以使用一些额外的硬件使这类事情更安全,基本上是将加密任务转移到您可以更好控制的子卡上。这是一些金融机构和一些政府实体使用的技术。这可能是你的预算范围之外。

2lpgd968

2lpgd9684#

确实没有办法阻止其他进程阅读您的进程的内存。
为了更好地抵抗无动机的攻击,您可以考虑使用随机生成的密钥来加密未使用的真实的密钥。你可以在每次程序运行时生成一个新的随机KEK,甚至在程序运行时每隔几秒就改变一次。只有在实际需要使用“真实的”密钥时才解密它,然后在完成后立即将密钥所在的内存清零。
当然,如果你一直在交流,这就不起作用了。但如果您的通信大部分时间都是空闲的,并且只看到偶尔的流量峰值,则这种方法可能会奏效。

相关问题