我需要在我的C++应用程序中存储敏感信息(我想保密的对称加密密钥).简单的方法是这样做:
std::string myKey = "mysupersupersecretpasswordthatyouwillneverguess";
但是,通过该strings过程(或从二进制应用程序中提取字符串的任何其他应用程序)运行应用程序将显示上述字符串.
应使用哪些技术来掩盖这些敏感数据?
编辑:
好的,所以你们所有人都说"你的可执行文件可以进行逆向工程" - 当然!这是我的一个宠儿,所以我要在这里咆哮:
为什么99%(好吧,或许我夸大一点)这个网站上所有与安全相关的问题都会被"没有可能的方法来创建一个完全安全的程序"所回答 - 这不是一个有用的回答!安全性是完美可用性与一端无安全性之间的滑动尺度,完美的安全性,但另一方面没有可用性.
关键在于,您可以根据您要执行的操作以及运行软件的环境来选择滑动比例.我不是在为军事装置编写应用程序,我正在为家用PC编写应用程序.我需要使用预先知道的加密密钥在不受信任的网络上加密数据.在这些情况下,"通过默默无闻的安全"可能已经足够了!当然,有足够时间,精力和技能的人可以对二进制文件进行逆向工程并找到密码,但猜猜是什么?我不在乎:
实施顶级安全系统所花费的时间比破解版本的销售损失更为昂贵(不是说我实际上是卖这个,但你明白了我的意思).在新程序员的编程中,这个蓝天"让我们尽可能做到绝对最好的方式"的趋势至少可以说是愚蠢的.
感谢您抽出宝贵时间回答这个问题 - 他们最有帮助.不幸的是,我只能接受一个答案,但我已经投了所有有用的答案.
我发现可以从二进制文件中提取硬编码字符串.
例如,Process Explorer的属性视图显示超过3个字符的所有字符串.
这是我编写的简单可执行文件的代码,只是为了测试它:
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
#endif
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
_TCHAR* hiddenString1 =_T("4537774B-CC80-4eda-B3E4-7A9EE77991F5");
_TCHAR* hiddenString2 =_T("hidden_password_or_whatever");
for (int i= 0; i<argc; i++) {
if (0 == _tcscmp(argv[i],hiddenString1)) {
_tprintf (_T("The guid argument is correct.\n")); }
else if (0 == _tcscmp(argv[i],hiddenString2)) {
_tprintf (_T("Do something here.\n")); }
}
_tprintf (_T("This is a visible string.\n"));
//Keep Running
Sleep(60000);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
字符串可以清楚地从相应的可执行文件中提取:

我认为找到字符串有点太容易了.
我的问题是:
c++ security obfuscation defensive-programming reverse-engineering
我想在iOS应用程序中包含一个密钥,以便应用程序可以向某个服务器"证明"请求来自应用程序本身而不是其他系统.我知道简单地将密钥硬编码到代码本身是非常容易的,因为任何人都可以越狱他们的手机并将GDB附加到我的应用程序的进程以获取密钥.有没有更安全的方法来做到这一点?是否有可能使密钥充分混淆,使其几乎不可能?
我认为这与序列号验证类似.不幸的是,这似乎经常被轻易破解.这有什么解决方案吗?
与我的服务器的所有通信都将通过HTTPS完成,因此至少嗅探/中间人攻击不应该是一个问题.
谢谢,M
我想在编译时加密/编码一个字符串,以便原始字符串不会出现在已编译的可执行文件中.
我已经看过几个例子,但他们不能把字符串文字作为参数.请参阅以下示例:
template<char c> struct add_three {
enum { value = c+3 };
};
template <char... Chars> struct EncryptCharsA {
static const char value[sizeof...(Chars) + 1];
};
template<char... Chars>
char const EncryptCharsA<Chars...>::value[sizeof...(Chars) + 1] = {
add_three<Chars>::value...
};
int main() {
std::cout << EncryptCharsA<'A','B','C'>::value << std::endl;
// prints "DEF"
}
Run Code Online (Sandbox Code Playgroud)
我不想像它那样单独提供每个角色.我的目标是传递一个字符串文字,如下所示:
EncryptString<"String to encrypt">::value
Run Code Online (Sandbox Code Playgroud)
还有一些像这样的例子:
#define CRYPT8(str) { CRYPT8_(str "\0\0\0\0\0\0\0\0") }
#define CRYPT8_(str) (str)[0] + 1, (str)[1] + 2, (str)[2] + 3, (str)[3] + 4, (str)[4] + 5, (str)[5] + …Run Code Online (Sandbox Code Playgroud) 是否可以有一个宏:
CHAR_LIST(鸡肉)
扩展到:
'鸡'
[我想要它的原因:因为即使是中等大小的字符串,宏也比手动扩展方便得多。我需要扩展的原因是将字符串传递给可变参数模板]
我想在我的代码中"隐藏"一些信息,我不确定这是否能解决问题.我知道在编译的应用程序中很容易找到和查看字符串文字,但整数呢?假设我定义了一个数字#define kHiddenNumber 1234567然后在我的代码中使用kHiddenNumber作为整数引用它.这会在编译的代码中可见,还是会有效地隐藏数字?
谢谢!
c++ ×4
security ×3
c ×2
obfuscation ×2
objective-c ×2
cocoa ×1
compile-time ×1
ios ×1
macros ×1
string ×1
templates ×1