防止存储在内存中的字符串被其他程序读取

时间:2010-12-27 05:50:40

标签: c++ string security

像ProcessExplorer这样的程序能够读取内存中的字符串(例如,代码中编写的错误消息可以很容易地显示,即使它已经编译过了。)

  1. 想象一下,如果我在内存中按顺序分配了密码字符串“123456”。如果黑客能够获取用户输入的密码怎么办?反正有没有阻止字符串被清楚地看到?

  2. 哦,是的,如果我将密码散列并从客户端发送到服务器以比较存储的数据库哈希值,黑客是否能够存储相同的哈希并重播它以获得访问权限用户帐号?反正是为了防止重播?

  3. 谢谢!

4 个答案:

答案 0 :(得分:8)

我相信你会混淆两件事。 ProcessExplorer发现的字符串也可以通过Unix中的“strings”命令找到。它只是将所有存储的字符串转储到可执行文件而不是当前内存中。

除非您在程序中编译了用户密码,否则ProcessExplorer不应读取分配用于存储数据的内存。

可能会出现许多问题。您最好的办法是确保在您的流程空间内不能运行任何其他代码。从虚拟内存时代开始,每个进程都有自己的虚拟内存空间,理想情况下阻止任何其他程序访问和搞乱其他程序的内存。有一些方法可以检测您的程序是否正在被调试。

您还需要确保用于存储密码的内存永远不会写入磁盘或被分页。该网站可以为您指明正确的方向。 https://www.securecoding.cert.org/confluence/display/seccode/MEM06-C.+Ensure+that+sensitive+data+is+not+written+out+to+disk

[编辑]

我想通过谈论重播预防来扩展我之前的帖子。

如果您真的认真对待完整的解决方案,则需要使用PKI系统实施双向身份验证。您的客户将拥有证书,您的服务器也将拥有证书。客户端的私钥只能通过用户输入的密码解锁。这将允许服务器验证客户端是否是他所说的人。然后,客户端将验证服务器是谁,他说他与客户端的方式相同。

通过使用此系统,您可以阻止某人作为服务器,并尝试让您向其发送密码。

这是我在本网站上无法涵盖的主题。您需要研究证书颁发机构和PKI。

您的漏洞是: 1.进入当前内存以提取密码 2.社会工程

参考:http://en.wikipedia.org/wiki/Public_key_infrastructure

答案 1 :(得分:2)

Andrew的回答为您提供了保护内存中字符串的良好提示。关于重放 - 你肯定是正确的,如果其他人截获哈希密码,他们可以重播它并危及安全性。失败的方法是质询 - 响应身份验证:http://en.wikipedia.org/wiki/Challenge-response_authentication

答案 2 :(得分:1)

不要将普通密码存储在内存中(至少可以对它们进行异或)。并阅读Introduction Into Windows Anti-Debugging

答案 3 :(得分:0)

我不知道它通常是怎么做的,但如果它对你很重要,你可以扩展你用来存储你的字符串的任何字符串类,至少是原始加密的,并用零或用破坏后的随机数据覆盖它/重新分配。