如何用二进制代码隐藏字符串?有时,从二进制(可执行)文件中隐藏字符串很有用。例如,从二进制文件中隐藏加密密钥是有意义的。当我说“隐藏”时,我的意思是在编译的二进制文件中更难找到字符串。例如,这段代码:const char* encryptionKey = "My strong encryption key";// Using the key编译后生成一个可执行文件,其数据部分中包含以下内容:4D 79 20 73 74 72 6F 6E-67 20 65 6E 63 72 79 70 |My strong encryp|74 69 6F 6E 20 6B 65 79 |tion key |您可以看到我们的秘密字符串可以轻松找到和/或修改。我可以隐藏字符串......char encryptionKey[30];int n = 0;encryptionKey[n++] = 'M';encryptionKey[n++] = 'y';encryptionKey[n++] = ' ';encryptionKey[n++] = 's';encryptionKey[n++] = 't';encryptionKey[n++] = 'r';encryptionKey[n++] = 'o';encryptionKey[n++] = 'n';encryptionKey[n++] = 'g';encryptionKey[n++] = ' ';encryptionKey[n++] = 'e';encryptionKey[n++] = 'n';encryptionKey[n++] = 'c';encryptionKey[n++] = 'r';encryptionKey[n++] = 'y';encryptionKey[n++] = 'p';encryptionKey[n++] = 't';encryptionKey[n++] = 'i';encryptionKey[n++] = 'o';encryptionKey[n++] = 'n';encryptionKey[n++] = ' ';encryptionKey[n++] = 'k';encryptionKey[n++] = 'e';encryptionKey[n++] = 'y';......但这不是一个好方法。有更好的想法吗?PS:我知道仅仅隐藏秘密并不能对付坚定的攻击者,但它总比没有好......另外,我知道非对称加密,但在这种情况下它是不可接受的。我正在重构现有的应用程序,它使用Blowfish加密并将加密数据传递给服务器(服务器使用相同的密钥解密数据)。我无法更改加密算法,因为我需要提供向后兼容性。我甚至无法更改加密密钥。
3 回答
四季花海
TA贡献1811条经验 获得超5个赞
正如对pavium 答案的评论所指出的,你有两个选择:
保护密钥
保护解密算法
不幸的是,如果你必须求助于在代码中嵌入密钥和算法,那么这两者都不是真正的秘密,所以你通过默默无闻的方式留下了(远远弱于)安全性的替代方案。换句话说,正如您所提到的,您需要一种聪明的方法来隐藏可执行文件中的一个或两个。
以下是一些选项,但您需要记住,根据任何加密最佳实践,这些选项都不是真正安全的,并且每个选项都有其缺点:
将您的密钥伪装成通常出现在代码中的字符串。 一个例子是
printf()
语句的格式字符串,它往往有数字,字母和标点符号。在启动时散列部分或全部代码或数据段,并将其用作密钥。(你需要对此有点聪明,以确保密钥不会意外地改变!)这有一个潜在的副作用,即每次运行时验证代码的散列部分。
在运行时从系统唯一的(并且在系统内部)内生成密钥,例如,通过散列网络适配器的MAC地址。
通过从其他数据中选择字节来创建密钥。 如果你有静态或全局数据,而不管类型(
int
,char
,等),它的初始化(为非零值,当然)后,从什么地方采取一个字节每个变量中,并在改变之前。
请告诉我们您是如何解决问题的!
编辑: 您评论说您正在重构现有代码,因此我假设您不一定自己选择密钥。在这种情况下,请遵循两个步骤:使用上述方法之一加密密钥本身,然后使用该密钥解密用户的数据。
- 3 回答
- 0 关注
- 699 浏览
添加回答
举报
0/150
提交
取消