如何用二进制代码隐藏字符串?

如何用二进制代码隐藏字符串?

有时,从二进制(可执行)文件中隐藏字符串很有用。例如,从二进制文件中隐藏加密密钥是有意义的。


当我说“隐藏”时,我的意思是在编译的二进制文件中更难找到字符串。


例如,这段代码:


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加密并将加密数据传递给服务器(服务器使用相同的密钥解密数据)。


我无法更改加密算法,因为我需要提供向后兼容性。我甚至无法更改加密密钥。


慕妹3242003
浏览 700回答 3
3回答

四季花海

正如对pavium 答案的评论所指出的,你有两个选择:保护密钥保护解密算法不幸的是,如果你必须求助于在代码中嵌入密钥和算法,那么这两者都不是真正的秘密,所以你通过默默无闻的方式留下了(远远弱于)安全性的替代方案。换句话说,正如您所提到的,您需要一种聪明的方法来隐藏可执行文件中的一个或两个。以下是一些选项,但您需要记住,根据任何加密最佳实践,这些选项都不是真正安全的,并且每个选项都有其缺点:将您的密钥伪装成通常出现在代码中的字符串。 一个例子是printf()语句的格式字符串,它往往有数字,字母和标点符号。在启动时散列部分或全部代码或数据段,并将其用作密钥。(你需要对此有点聪明,以确保密钥不会意外地改变!)这有一个潜在的副作用,即每次运行时验证代码的散列部分。在运行时从系统唯一的(并且在系统内部)内生成密钥,例如,通过散列网络适配器的MAC地址。通过从其他数据中选择字节来创建密钥。 如果你有静态或全局数据,而不管类型(int,char,等),它的初始化(为非零值,当然)后,从什么地方采取一个字节每个变量中,并在改变之前。请告诉我们您是如何解决问题的!编辑: 您评论说您正在重构现有代码,因此我假设您不一定自己选择密钥。在这种情况下,请遵循两个步骤:使用上述方法之一加密密钥本身,然后使用该密钥解密用户的数据。

当年话下

将其作为代码高尔夫问题发布等待用J写的解决方案在您的应用中嵌入J解释器
打开App,查看更多内容
随时随地看视频慕课网APP