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

Ang*_*elo 1 c++ string encryption url

警告: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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

Mar*_*tos 5

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

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

  1. 将加密URL的部分内容和密码(最好是一次性密钥)存储在不同的位置,并将它们组合在一起.
  2. 将加密部分隐藏在大块随机性中,这些随机性看起来与部件无法区分.
  3. 将零件零碎地组合在一起.例如,将加密url的第一个和第二个三分之一连接到一个初始化函数的单个缓冲区中,将此缓冲区与另一个不相关的init函数中的最后一个连接起来,并在另一个函数中使用最终串联,所有函数都来自不同的随机函数代码中的位置.
  4. 检测应用程序何时在调试器下运行并具有不同的功能在不同时间丢弃加密的内容.
    • 应使用不同的技术在各个呼叫站点进行检测,而不是通过调用单个"DetectDebug"功能或测试全局bool,这两者都会产生单点攻击.
  5. 不要使用明显的名称,例如"DecryptUrl"用于相关功能.
  6. 从看似无关但一致的来源收获关键部分.例如,读取时钟并仅使用一些高位(足够高以至于它们在可预见的未来不会改变,但足够低以至于它们不全为零),或者使用非易失性的随机采样初始化代码的结果.

这只是冰山一角,只会让新手脱离气味.它不会阻止甚至显着减慢一个熟练的攻击者,他只会使用隐形调试器拦截对SSL库的调用.因此,你必须问自己:

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