1

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

密钥分发过程:

  1. 每个服务器和客户端每天都会有一个初始密钥加密密钥 (KEK) 列表

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

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

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

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

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

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

4

4 回答 4

4

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

如果这台机器有可能捕获 Rootkit,那么您的所有密钥都是我们的。

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

  1. 它有权打开存储设备。
  2. 它有权打开进程 B 的虚拟内存。
  3. 它在内核中有一个朋友。

如果您可以完全控制机器上运行的内容,并且完全相信没有人可以带来任何惊喜,那么您就是黄金。

当然,这并不是 Windows 独有的。Windows 的独特之处在于 Rootkit 恶意软件的数量。

于 2010-05-25T01:01:37.440 回答
4

您的密钥分发过程并不安全:如果有人获得了初始密钥集,则一切都结束了。

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

于 2010-05-25T01:02:14.710 回答
2

还有一点信息是,即使您自己不将密钥写入磁盘,它也很可能最终出现在那里。所需要的只是虚拟内存系统将持有密钥的内存分页。

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

于 2010-05-25T01:09:36.533 回答
1

真的没有办法阻止其他进程读取你进程的内存。

为了使事情对无动机的攻击更具抵抗力,您可以考虑使用随机生成的密钥来加密不使用的真实密钥。您可以在每次程序运行时生成一个新的随机 KEK,甚至可能在程序运行时每隔几秒就更改一次。仅在您真正需要使用“真实”密钥时解密它,然后在完成后立即将密钥所在的内存归零。

当然,如果您一直在交流,这将不会真正起作用。但是,如果您的通信大部分时间都是空闲的,并且只是偶尔看到流量高峰,那么这种方法可能会奏效。

于 2010-05-25T02:24:56.927 回答