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

标签 c++ string url encryption

警告:C++ 菜鸟

我在 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 和登录字符串都不容易从二进制文件的静态分析中读取,并且尽可能难以通过动态分析(调试、逆向工程等)读取。

最佳答案

如果您想阻止数据包检查员,最低要求是将 https 与硬编码的服务器证书一起使用到您的应用中。

加密应用内内容没有 Elixir 。无论您做什么,具有正确技能的坚定黑客都会获得普通 url。你所能期望的最好的事情就是让它变得足够困难,以至于大多数人都会放弃。实现这一目标的方法是实现多种不同的混淆和绊网技术。包括但不限于:

  1. 将部分加密的 url 和密码(最好是一次性 key )存储在不同的位置,并将它们放在代码中。
  2. 将加密部分隐藏在看起来与这些部分无法区分的大随机字符串中。
  3. 将各个部分零散地组合在一起。例如,将加密 url 的第一个和第二个三分之一连接到一个初始化函数的单个缓冲区中,将这个缓冲区与另一个不相关的 init 函数中的最后三分之一连接起来,并在另一个函数中使用最终连接,所有函数都从不同的随机调用放置在您的代码中。
  4. 检测应用程序何时在调试器下运行,并在不同时间使用不同的函数破坏加密内容。
    • 应该使用不同的技术在不同的调用站点进行检测,而不是通过调用单个“DetectDebug”函数或测试全局 bool 值,这两者都会造成单点攻击。
  5. 不要为相关函数使用明显的名称,例如“DecryptUrl”。
  6. 从看似无关但一致的来源中获取部分 key 。例如,读取时钟并只使用一些高位(足够高以至于它们在可预见的 future 不会改变,但又足够低以至于它们不全为零),或者使用非 volatile 的随机采样初始化代码的结果。

这只是冰山一角,只会让新手摸不着头脑。这些都不会阻止,甚至不会显着减慢熟练的攻击者的速度,他们只会使用隐身调试器拦截对 SSL 库的调用。因此,您必须问自己:

  1. 保护此 URL 对我来说值多少钱?免受哪种攻击者的攻击?
  2. 我能否以某种方式更改系统设计,以便我不需要保护 url?

关于c++ - 在 C++ 中加密硬编码字符串的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19114443/

相关文章:

c++ - 如果在 SQUARE 宏中传递前缀变量,为什么结果不同?

python - 将 DataFrame 字符串列拆分为 N 个拆分

url - 基于用户名的 URL

asp.net-mvc-3 - 如何在扩展方法中获取 Url.Action

java - 如何在 Java 中比较字符串?

java - 异常无法在 JMX 服务器中绑定(bind) URL

c++ - 如何使用 Dev C++ 检查数学库函数 sqrt() 中的代码?

c++ - 我在 Vista 上访问网络驱动器时遇到问题

c++ - USN中的文件引用号返回空

Python:如何让 StringIO.writelines 接受 unicode 字符串?