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

在C+;中加密硬编码字符串的最佳方法是什么+;? 警告:C++ NOOB ,c++,string,url,encryption,C++,String,Url,Encryption,我读过多篇关于StackOverflow的关于字符串加密的文章。顺便说一下,他们没有回答我的疑问。 我必须在我的代码中插入一个或两个硬编码字符串,但我希望在调试/逆向工程时使纯文本阅读变得困难。这还不是全部:我的字符串是URL,所以一个简单的数据包分析器(Wireshark)可以读取它。 我说困难是因为我知道,当代码运行时,字符串在某个地方(在RAM中?)被解密为纯文本,有人可以读取它。因此,假设不可能完全保护我的字符串,在C++中加密/解密它的最佳方法是什么? 我在想这样的事情: //I've

我读过多篇关于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,并在应用程序中烘焙硬编码的服务器证书

加密应用程序内内容没有灵丹妙药。无论你做什么,一个具有正确技能的坚定的黑客都会得到一个简单的url。你能指望的最好办法就是让它变得足够困难,以至于大多数人都会放弃。实现这一点的方法是实现多种不同的模糊处理和tripwire技术。包括但不限于:

  • 将部分加密url和密码(最好是一次性密钥)存储在不同的位置,并以代码的形式将它们组合在一起
  • 将加密的部分隐藏在看起来与部分无法区分的大随机字符串中
  • 把各个部分零碎地组合起来。例如,将加密url的第一个和第二个三分之一从一个初始化函数连接到一个缓冲区中,将此缓冲区与另一个不相关的init函数中的最后三分之一连接,并在另一个函数中使用最终连接,所有这些都从代码中的不同随机位置调用
  • 检测应用程序何时在调试器下运行,并在不同的时间使用不同的功能丢弃加密内容。
    • 应该使用不同的技术在不同的调用站点进行检测,而不是调用单个“DetectDebug”函数或测试全局bool,这两种方法都会产生单个攻击点
  • 不要对相关函数使用明显的名称,如“DecryptUrl”
  • 从看似无关但一致的来源获取部分密钥。例如,读取时钟并仅使用少量高位(足够高,在可预见的未来不会改变,但足够低,不会全部为零),或使用初始化代码非易失性结果的随机采样
  • 这只是冰山一角,只会让新手失去兴趣。所有这些都不会阻止甚至显著降低熟练攻击者的速度,他们只会使用隐形调试器截获对SSL库的调用。因此,你必须问问自己:

  • 对我来说,保护这个url值多少钱,以及防止什么样的攻击者
  • 我是否可以改变系统设计,这样就不需要保护url

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

    加密应用程序内内容没有灵丹妙药。无论你做什么,一个具有正确技能的坚定的黑客都会得到一个简单的url。你能指望的最好办法就是让它变得足够困难,以至于大多数人都会放弃。实现这一点的方法是实现多种不同的模糊处理和tripwire技术。包括但不限于:

  • 将部分加密url和密码(最好是一次性密钥)存储在不同的位置,并以代码的形式将它们组合在一起
  • 将加密的部分隐藏在看起来与部分无法区分的大随机字符串中
  • 把各个部分零碎地组合起来。例如,将加密url的第一个和第二个三分之一从一个初始化函数连接到一个缓冲区中,将此缓冲区与另一个不相关的init函数中的最后三分之一连接,并在另一个函数中使用最终连接,所有这些都从代码中的不同随机位置调用
  • 检测应用程序何时在调试器下运行,并在不同的时间使用不同的功能丢弃加密内容。
    • 应该使用不同的技术在不同的调用站点进行检测,而不是调用单个“DetectDebug”函数或测试全局bool,这两种方法都会产生单个攻击点
  • 不要对相关函数使用明显的名称,如“DecryptUrl”
  • 从看似无关但一致的来源获取部分密钥。例如,读取时钟并仅使用少量高位(足够高,在可预见的未来不会改变,但足够低,不会全部为零),或使用初始化代码非易失性结果的随机采样
  • 这只是冰山一角,只会让新手失去兴趣。所有这些都不会阻止甚至显著降低熟练攻击者的速度,他们只会使用隐形调试器截获对SSL库的调用。你不能