如何在C ++应用程序中安全地存储字符串(即密码)?

时间:2011-03-28 10:55:21

标签: c++ string security

我正在开发一个wxWidgets GUI应用程序,允许用户将文件上传到FTP服务器,并且需要一对用户名/密码才能访问FTP服务器。

据我所知,即使程序已经编译,STL字符串甚至char *字符串对于最终用户也是可见的,使用十六进制编辑器或者像Sysinternals String Utility这样的字符串提取器。

那么,是否有一种安全/可靠的方式在C ++应用程序中存储敏感信息?

PS。我不能在这个应用程序中使用.NET。

5 个答案:

答案 0 :(得分:7)

这实际上与使用的编程语言无关。

FTP是一种以纯文本形式传输密码的协议。没有多少混淆会改变这种情况,并且攻击者可以在传输时轻松拦截密码。

无论使用何种协议,任何模糊处理都不会改变您的应用程序必须能够解码该密码的事实。任何能够访问应用程序二进制文件的攻击者都可以对该解码进行反向工程,从而产生密码。

一旦开始查看安全协议(如SFTP),在查看自动访问时,您还可以获得安全身份验证(例如公钥/私钥)的基础结构。

即便如此,您也有责任不让该密钥文件可供文件系统上的任何其他人访问,这取决于操作系统和整体设置 - 可能还不够。

但是,由于我们讨论的是交互式应用程序,最简单的方法是根本不自动进行身份验证,而是查询用户的用户名和密码。毕竟,他应该知道,不应该吗?

修改:对Kate Gregory的优秀评论进行扩展,如果用户共享访问您服务器的常见“技术”(或匿名)帐户,则您的应用上传的文件不应显示在某种过滤之前的服务器是由你完成的。执行此操作的常见方法是使用“上载”目录,可以将文件上载到但不能从中下载。如果您不采取这些预防措施,人们将使用您的FTP服务器作为所有非法文件共享的转盘,而将是对此负有法律责任的人。

答案 1 :(得分:2)

我不确定这是否可行,如果不是那么容易。如果密码是嵌入的并且您的程序可以读取它,那么每个具有足够知识的人都应该能够做到。

您可以通过加密或混淆来提高对低级尝试(如hexeditor等)的安全性(例如,两个密码在运行时通过XOR生成真实密码,并且仅在您需要时生成密码。)

但这并不能防止经验丰富的人员进行严重攻击,这可能会对您的程序进行反编译或对其进行反编译(好吧,有很多方法可以检测到它,但它就像是冷战 - 调试的相互军备竞赛 - 针对运行时的技术 - 检测这些)。

编辑:如果一个人知道保护数据的可接受工作量的好方法(在c ++中没有巨大的和/或昂贵的框架),请纠正我。我会对这些信息感兴趣。

答案 2 :(得分:0)

虽然你无法防御那些反编译你的代码并弄清楚你正在做什么的人,但是你可以稍微模糊一下密码,这样它就不会在代码中以纯文本形式出现。您不需要进行真正的加密,只需要知道秘密的任何事情。例如,反转它,rot13它,或交错两个文字字符串,如“pswr”和“asod”。或者使用单个字符变量(未在同一位置一起初始化)并使用数字来设置它们(ascii),而不是在代码中使用“a”。

在您的位置,我会觉得窥探FTP服务器的流量比反编译您的应用程序并阅读代码对文字字符串所做的工作要少。您只需打败打开十六进制的人,并查看易于识别为ID和密码的字符串。在这种情况下,小小的模糊将会有很长的路要走。

答案 3 :(得分:0)

正如其他人所说,存储密码永远不会真正保存,但如果你坚持,你可以使用cryptlib进行加密和解密。

答案 4 :(得分:-3)

只是一个让你考虑的原始想法。

计算密码的md5或SHA-2并将其存储在可执行文件中。

然后对输入用户名/密码执行相同操作并与存储值进行比较。

简单明了。
http://en.wikipedia.org/wiki/MD5
http://en.wikipedia.org/wiki/SHA-2