在C++中混淆敏感字符串的技巧

105

我需要在我的C++应用程序中存储敏感信息(对称加密密钥,我希望保持私密)。简单的方法是这样做:

std::string myKey = "mysupersupersecretpasswordthatyouwillneverguess";
然而,通过strings进程(或任何其他从二进制应用程序提取字符串的进程)运行应用程序将会显示上述字符串。有哪些技术可以用来模糊这种敏感数据? 编辑:好的,几乎所有人都说过“您的可执行文件可以被反向工程化”——当然!这是我讨厌的事情之一,所以我要在这里发泄一下:
为什么在这个网站上99%(好吧,也许我有点夸张)与安全相关的问题都被回答成:“没有可能创建一个完全安全的程序”这不是一个有用的答案! 安全是在完美的可用性和无安全性的一端和完美的安全但没有可用性的另一端之间的滑动比例尺。
关键是,你根据你想要做什么和你的软件将在其中运行的环境来选择你在那个滑动比例尺上的位置。 我不是为军用装置编写应用程序,我正在为家庭PC编写应用程序。 我需要使用预先已知的加密密钥加密跨不受信任的网络的数据。 在这些情况下,“安全通过模糊”可能已经足够了! 当然,有足够的时间,精力和技能的人可能会反向工程二进制文件并找到密码,但是猜猜? 我不在乎:
实施顶尖安全系统的时间比由于破解版本而失去的销售量更昂贵(虽然我实际上并没有出售这个软件,但你理解我的意思)。 在新程序员中,“让我们以最好的方式来做”的蓝天趋势至少是愚蠢的。
感谢您抽出时间回答这个问题-它们非常有帮助。 不幸的是,我只能接受一个答案,但我已经投票支持了所有有用的答案。

2
也许如果您描述一下使用加密密钥所要实现的目标,我们可以提供如何避免需要这样做的建议。 - joshperry
3
如何在exe或dll中隐藏字符串 - Kirill V. Lyadvinsky
4
@Kirill:很难说这个问题完全与你提到的那个问题相同。的确,思路是一样的,但问题并不一样。 - xtofl
2
@xtofl,你可以选择不投票。对我来说,这两个问题看起来是完全相同的。 - Kirill V. Lyadvinsky
2
(与抱怨无关)“私钥”的定义是公共/私有密钥对中不公开的一半。在这种情况下,私钥是您保存在服务器上的那个;客户端应用程序中的那个是公共的。 - MSalters
显示剩余5条评论
14个回答

1

如果你是Windows用户,使用DPAPI,http://msdn.microsoft.com/en-us/library/ms995355.aspx

正如之前的帖子所说,如果你使用Mac,请使用钥匙串。

基本上,所有那些将私有密钥存储在二进制文件中的可爱想法从安全角度来看都不够好,你不应该这样做。任何人获取到你的私钥都是很大的问题,不要把它保存在程序中。根据你的应用程序的重要性,你可以将私钥保存在智能卡上、远程计算机上,或者像大多数人一样,在本地计算机上的一个非常安全的地方("密钥库",类似于奇怪的安全注册表),受到权限和操作系统所有强大功能的保护。

这是一个已解决的问题,答案不是将密钥保存在程序内部 :)


1
尝试this。源代码解释了如何在给定的Visual Studio c++项目中即时加密和解密所有字符串。

0

不要将私钥存储在可执行文件中,您可以考虑从用户那里请求并通过外部密码管理器进行存储,类似于Mac OS X的Keychain Access。


好的,有一定道理,但也不完全是这样。通常情况下我会同意你的看法,但在这种情况下,我正试图将这个隐藏起来,不让软件的用户看到,所以把它存储在外部系统中并不是一个好主意(许多钥匙链系统可以在给定适当授权的情况下向用户公开密码)。钥匙链软件非常适合用户密码,但对于应用程序加密密钥来说并不是很理想。 - Thomi
如果感觉不安全(尽管根据您的澄清,也许是足够的),您可以结合使用钥匙链和一些硬编码的东西 :) - user172783

0

上下文相关,但您可以只存储密钥的哈希值加上一个盐(常量字符串,容易混淆)。

然后当用户输入密钥时,您添加盐,计算哈希值并进行比较。

在这种情况下,盐可能是不必要的,它可以防止暴力字典攻击,如果哈希可以被隔离出来(谷歌搜索也已知可行)。

黑客仍然只需要在某个地方插入jmp指令即可绕过全部内容,但这比简单的文本搜索要复杂得多。


这是一个加密密钥,而不是密码哈希。我需要实际的密钥来编码和解码数据。用户永远看不到密钥,它从未存储在二进制文件之外。 - Thomi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接