代码之家  ›  专栏  ›  技术社区  ›  user195488

防止应用程序内存被篡改

  •  0
  • user195488  · 技术社区  · 14 年前

    我们正在向服务器和客户端应用程序添加AES256位加密,以加密包含敏感信息的TCP/IP通信。我们将每天转动钥匙。因此,这些键将与应用程序一起存储在内存中。

    密钥分发过程:

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

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

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

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

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

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

    我们使用C++和XP(Vista/ 5月7日是未来的选择,所以我不知道这是否改变了答案)。

    4 回复  |  直到 14 年前
        1
  •  3
  •   bmargulies    14 年前

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

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

    在Windows上,如果以下任何一项为真,进程A可以读取进程B的内存:

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

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

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

        2
  •  4
  •   Andrew McGregor    14 年前

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

    是的,其他应用程序可以使用调试器挂钩访问Windows上的进程内存,而且几乎没有任何方法可以防止这种情况发生。从本质上讲,如果盒子被以任何方式损坏,你就没什么办法了。

        3
  •  2
  •   Ukko    14 年前

    还有一点信息是,即使你不自己写磁盘的密钥,它也可能最终会出现在磁盘上。虚拟内存系统需要的只是调出持有该键的内存。

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

        4
  •  1
  •   SoapBox    14 年前

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

    为了使事物对未激活的攻击有一点抵抗力,您可以考虑使用随机生成的密钥来加密不使用的真正的密钥。每次运行程序时,您都可以生成一个新的随机KEK,甚至在程序每隔几秒钟运行时可能会发生更改。只有在您实际需要使用“真正的”密钥时才对其进行解密,然后在完成后立即将该密钥所在的内存清零。

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