在C ++中加密硬编码字符串的最佳方法是什么?

时间:2013-10-01 10:59:04

标签: c++ string url encryption

警告:C ++ noob

我在StackOverflow上阅读了关于字符串加密的多篇帖子。顺便说一句,他们没有回答我的疑虑。 我必须在我的代码中插入一个或两个硬编码字符串,但我想在调试/逆向工程时以纯文本读取困难。这不是全部:我的字符串是URL,所以一个简单的数据包分析器(Wireshark)可以读取它。 我说很难,因为我知道,当代码运行时,字符串在某处(在RAM中?)解密为纯文本,有人可以读取它。因此,假设不可能完全保护我的字符串,那么在C ++中加密/解密它的最佳方法是什么? 我在考虑这样的事情:

//I've omitted all the #include and main stuff of course...
string encryptedUrl = "Ajdu67gGHhbh34590Hb6vfu6gu" //Encrypted url with some known algorithm
URLDownloadToFile(NULL, encryptedUrl.decrypt(), C:\temp.txt, 0, NULL);

分组分析怎么样?我确定没有办法隐藏URL,但也许我错过了什么?谢谢你,对不起我最糟糕的英语!

编辑1:我的应用程序做了什么?

这是一个简单的登录脚本。我的应用程序从URL下载文本文件。此文件包含使用fstream库读取的加密字符串。然后解密该字符串并用于在另一个站点上登录。它非常弱,因为没有数据库,没有盐,没有散列。我的成就是确保url和登录字符串都不容易从二进制文件的静态分析中读取,并且可能通过动态分析(调试,逆向工程等)尽可能地难以读取。

2 个答案:

答案 0 :(得分:5)

如果您想阻止数据包检查员,最低要求是使用带有硬编码服务器证书的https加入您的应用程序。

加密应用内内容并非灵丹妙药。无论你做什么,具有合适技能的坚定黑客都会获得简单的网址。你可以期待的最好的事情是让大多数人放弃的困难。实现此目的的方法是实现多种不同的混淆和绊线技术。包括但不限于:

  1. 将加密网址的部分内容和密码(最好是一次性密钥)存放在不同的位置,并将它们整合在一起。
  2. 将加密部分隐藏在与部件无法区分的大型随机性字符串中。
  3. 将零件拼凑在一起。例如,将加密url的第一个和第二个三分之一连接到一个初始化函数的单个缓冲区中,将此缓冲区与另一个不相关的init函数中的最后一个连接起来,并在另一个函数中使用最终串联,所有函数都来自不同的随机函数代码中的地方。
  4. 检测应用程序何时在调试器下运行并具有不同的功能,在不同的时间丢弃加密的内容。
    • 应使用不同的技术在各个呼叫站点进行检测,而不是通过调用单个“DetectDebug”功能或测试全局bool,这两者都会产生单点攻击。
  5. 请勿使用明显的名称,例如“DecryptUrl”作为相关功能。
  6. 从看似无关但一致的来源中收获关键部分。例如,读取时钟并仅使用一些高位(足够高以至于它们在可预见的未来不会改变,但足够低以至于它们不全为零),或者使用非易失性的随机采样初始化代码的结果。
  7. 这只是冰山一角,只会让新手脱离气味。它不会阻止甚至显着减慢一个熟练的攻击者,他只会使用隐形调试器拦截对SSL库的调用。因此,你必须问自己:

    1. 保护这个网址和攻击者是什么价值?
    2. 我可以以某种方式更改系统设计,以便我不需要保护网址吗?

答案 1 :(得分:0)

尝试XorSTR [12]。这是我在试图阻碍静态分析时常用的东西。大多数结果都来自游戏作弊论坛,也有一个html生成器。

然而正如其他人所提到的,对于在URLDownloadToFile上放置断点的人来说,获取字符串仍然很容易。但是,如果他们试图进行静态分析,你的生活会变得更加艰难。

我不确定你的网址是什么,以及你的目标是什么,但XorStr +反调试+打包二进制文件将阻止大多数业余爱好者对你的应用程序进行逆向工程。