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

时间:2010-05-25 00:50:21

标签: c++ memory memory-management windows-xp protection

我们正在为服务器和客户端应用程序添加AES 256位加密,以加密包含敏感信息的TCP / IP流量。我们将每天旋转钥匙。因此,密钥将与应用程序一起存储在内存中。

密钥分发流程:

  1. 每个服务器和客户端将按日列出初始密钥加密密钥(KEK)

  2. 如果客户端刚启动或服务器刚刚启动,客户端将使用初始密钥从服务器请求每日密钥。服务器将使用每日密钥进行响应,使用初始密钥加密。每日密钥是随机生成的一组字母数字字符。我们使用AES 256位加密。

  3. 所有后续通讯都将使用该每日密钥进行加密。

  4. 每晚,客户端将使用当前每日密钥作为当前KEK从服务器请求新的每日密钥。客户端获取新密钥后,新的每日密钥将替换旧的每日密钥。

  5. 另一个糟糕的应用程序是否可能非法访问此内存或在Windows中受到保护?密钥不会写入文件,只存储在内存中的变量中。

    如果应用程序可以非法访问内存,如何保护内存不被篡改?

    我们正在使用C ++和XP(未来Vista / 7可能是一个选项,所以我不知道这是否会改变答案)。

4 个答案:

答案 0 :(得分:4)

您的密钥分发流程并不安全:如果有人获得了初始密钥集,那么它就会全部结束。

是的,其他应用程序可以使用调试器挂钩访问Windows上的进程内存,而且几乎没有办法阻止它。从本质上讲,如果盒子以任何方式受到损害,那么你几乎无能为力。

答案 1 :(得分:3)

我认为你手上可能有一个更基本的问题。

如果这台机器最有可能抓到rootkit,那么你的所有密钥都是我们的,就像它一样。

在Windows上,如果满足以下任何条件,则进程A可以读取进程B的内存:

  1. 它有权打开内存设备。
  2. 它有权打开进程B的虚拟内存。
  3. 内核中有一位朋友。
  4. 如果您完全掌控机器上正在运行的内容,并完全相信没有人会带来任何惊喜,那么您就是金色的。

    这当然不是Windows独有的。 Windows独有的是rootkit恶意软件的数量。

答案 2 :(得分:2)

还有一点信息是,即使你没有自己将密钥写入磁盘,它也可能最终会在那里结束。所需要的只是虚拟内存系统将页面输出密钥寄出。

正如其他人所指出的那样,如果你不能相信你所在的盒子,你就会被搞砸了。有一些方法可以使用一些额外的硬件使这种事情更安全,基本上将加密任务移动到您可以更好地控制的子卡上。这是一些金融机构和一些政府机构使用的技术。这可能超出了您的预算范围。

答案 3 :(得分:1)

实际上没有办法阻止其他进程读取进程的内存。

为了使对未受到攻击的攻击更具抵抗力,您可以考虑使用随机生成的密钥来加密真实密钥,而不使用它。每次运行程序时都可以生成一个新的随机KEK,甚至可以在程序每隔几秒运行一次时更改。只有在您真正需要使用它时才解密“真实”密钥,然后在完成后立即将密钥清零。

当然,如果你经常沟通,这将无法真正起作用。但是,如果您的通信大多数时间处于闲置状态,并且只看到偶尔的流量高峰,则此方法可能会有效。