我们正在为服务器和客户端应用程序添加AES 256位加密,以加密包含敏感信息的TCP / IP流量。我们将每天旋转钥匙。因此,密钥将与应用程序一起存储在内存中。
密钥分发流程:
每个服务器和客户端将按日列出初始密钥加密密钥(KEK)
如果客户端刚启动或服务器刚刚启动,客户端将使用初始密钥从服务器请求每日密钥。服务器将使用每日密钥进行响应,使用初始密钥加密。每日密钥是随机生成的一组字母数字字符。我们使用AES 256位加密。
所有后续通讯都将使用该每日密钥进行加密。
每晚,客户端将使用当前每日密钥作为当前KEK从服务器请求新的每日密钥。客户端获取新密钥后,新的每日密钥将替换旧的每日密钥。
另一个糟糕的应用程序是否可能非法访问此内存或在Windows中受到保护?密钥不会写入文件,只存储在内存中的变量中。
如果应用程序可以非法访问内存,如何保护内存不被篡改?
我们正在使用C ++和XP(未来Vista / 7可能是一个选项,所以我不知道这是否会改变答案)。
答案 0 :(得分:4)
您的密钥分发流程并不安全:如果有人获得了初始密钥集,那么它就会全部结束。
是的,其他应用程序可以使用调试器挂钩访问Windows上的进程内存,而且几乎没有办法阻止它。从本质上讲,如果盒子以任何方式受到损害,那么你几乎无能为力。
答案 1 :(得分:3)
我认为你手上可能有一个更基本的问题。
如果这台机器最有可能抓到rootkit,那么你的所有密钥都是我们的,就像它一样。
在Windows上,如果满足以下任何条件,则进程A可以读取进程B的内存:
如果您完全掌控机器上正在运行的内容,并完全相信没有人会带来任何惊喜,那么您就是金色的。
这当然不是Windows独有的。 Windows独有的是rootkit恶意软件的数量。
答案 2 :(得分:2)
还有一点信息是,即使你没有自己将密钥写入磁盘,它也可能最终会在那里结束。所需要的只是虚拟内存系统将页面输出密钥寄出。
正如其他人所指出的那样,如果你不能相信你所在的盒子,你就会被搞砸了。有一些方法可以使用一些额外的硬件使这种事情更安全,基本上将加密任务移动到您可以更好地控制的子卡上。这是一些金融机构和一些政府机构使用的技术。这可能超出了您的预算范围。
答案 3 :(得分:1)
实际上没有办法阻止其他进程读取进程的内存。
为了使对未受到攻击的攻击更具抵抗力,您可以考虑使用随机生成的密钥来加密真实密钥,而不使用它。每次运行程序时都可以生成一个新的随机KEK,甚至可以在程序每隔几秒运行一次时更改。只有在您真正需要使用它时才解密“真实”密钥,然后在完成后立即将密钥清零。
当然,如果你经常沟通,这将无法真正起作用。但是,如果您的通信大多数时间处于闲置状态,并且只看到偶尔的流量高峰,则此方法可能会有效。