C++ 如果我不想让别人知道或更改硬代码值,宏是否比静态常量更安全?

C++ 如果我不想让别人知道或更改硬代码值,宏是否比静态常量更安全?,c++,c,security,C++,C,Security,我搜索了一些关于 #define PASSWORD "abcde" 及 似乎define没有将值存储在内存中,我不确定它是否正确。我听说它可能有一些工具可以检测和访问应用程序执行期间使用的内存地址,例如:更改游戏的某些值。我担心,如果我使用static const char*PASSWORD,可能会有人通过检测密码的地址来知道密码的值,并通过获取地址中的内容来获取密码的值 如果我希望硬代码值更安全,使用define是否更好?在这种情况下并不重要。由于两者都使用字符串文字,因此字符串本身将存储在

我搜索了一些关于

#define PASSWORD "abcde"

似乎define没有将值存储在内存中,我不确定它是否正确。我听说它可能有一些工具可以检测和访问应用程序执行期间使用的内存地址,例如:更改游戏的某些值。我担心,如果我使用static const char*PASSWORD,可能会有人通过检测密码的地址来知道密码的值,并通过获取地址中的内容来获取密码的值


如果我希望硬代码值更安全,使用define是否更好?

在这种情况下并不重要。由于两者都使用字符串文字,因此字符串本身将存储在字符串池中,而不是动态地存在于堆中的某个位置。此外,宏在技术上甚至不存在,因为编译器只是用define定义替换宏的所有实例。在运行时,程序不会看到任何差异

编辑:
正如有人提到的,如果你想扰乱安全,那就调查一下。这将使使用内存搜索程序提取密码变得更加困难。

您可能希望使用变量作为常量表达式

constexp char* = "abc";

它比define好,并且变量只在编译时存在,因此变量根本没有任何地址。然而,就像define一样,它将直接将abc打印到二进制文件中。您可能希望将其与哈希混合使用。

您无法找到完全隐藏它的方法,请使用哈希函数并比较哈希而不是密码。如果应用程序运行在您不控制的机器上,则无法保证应用程序不会被修改或监视。无论您使用宏、常量还是变量,数据在运行时仍将存在于磁盘和内存中;它为您节省了存储指针的空间,而您似乎无意改变指针。字符串池究竟是什么?因此,如果您有一个使用字符串文字hello world的程序!很多时候,在内存中有这个字符串的多个副本是愚蠢的。这是浪费。因此,每当您硬定义字符串时,您的程序都会将其保存在一个称为字符串池的位置。这只是一个存放字符串文字的地方,这样,在代码中引用字符串文字时,就可以随时使用它们。假设应用程序在作者的游戏中运行在终端用户的机器上,那么如果java字符串长且随机,哈希不出现在IEI中,那么只会使它更难找到实际值。java和C++中的站点是我混淆的。但是,C中肯定使用了字符串池。如果您想检查这一点,请创建两个不同的char*myString=Hello World!。它们将具有相同的指针地址。
constexp char* = "abc";