在编译的C或C ++代码中加密密码

我知道如何在终端中使用GCC和CC编译C和C ++源文件,但是我想知道在编译后是否可以安全地将密码包含在这些文件中。

例如..我检查用户输入的某个密码,例如123,但看起来编译的C / C ++程序可以被反编译。

无论如何编译一个C / C ++源文件,同时保持源完全隐藏..如果没有,任何人都可以提供加密输入的小例子,然后检查密码,例如:(SHA1,MD5)

建议不要在代码中保留任何敏感的静态数据。 您可以使用配置文件。 那里你可以存储你喜欢的任何东西。

但是,如果您真的想要这样做,请首先记住可以通过调试调试器并修改代码来轻松更改代码。 只有用户无权访问的程序才能被认为更安全 (例如网站)。

大多数登录密码(不同站点)不是在数据库中以明文forms存储,而是使用算法MD5,SHA1,Blowfish等加密。

我建议您使用OpenSSL库中的这些算法之一。

我要做的是使用一些公钥加密算法 。 这可能需要更长时间才能被破解,因为在我看来,在谈论软件保护时没有什么是100%肯定的。

不,您无法在源文件中安全地包含密码。 可执行文件中的字符串是纯文本的,任何拥有文本编辑器的人都可以轻松查看您的密码。

一个不太安全,但会践踏一些人,是存储加密的字符串而不是。 所以,基本上:

enc = "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4" bool check() { pass = getPassFromUser(); encpass = myHashingFunction(pass); return pass == encpass; } 

这会阻止一些人,但实际上并不是那么安全,汇编黑客用另一个带有已知明文值的sha256编码字符串替换你的可执行文件中的’enc’字符串是相对微不足道的。

即使您使用单独的身份validation服务器,也不难设置虚假身份validation服务器并欺骗您的程序连接到此虚假身份validation服务器。

即使您使用SHA1生成哈希,如果您以正常方式执行此操作并不是真的那么安全(编写一个检查密码的函数)任何已确定或知识渊博的黑客都可以绕过它来访问它(用已知的哈希替换你的哈希,或者用一个返回true的调用替换checkPassword()调用。

问题是你想要保护谁? 你的小弟弟,黑客,国际间谍,工业间谍?

使用SHA1与代码(或配置文件)中包含的哈希只会防止你的小弟弟? (阅读不能试图破解你的程序而不是支付共享器价格的休闲计算机用户)。 在这种情况下,使用纯文本密码或SHA1哈希几乎没有区别(可能会有几个百分点的人不会打扰)。

如果你想让你的代码安全,那么你需要做更多的事情。 一本关于安全性的书是一个很好的起点,但实现这一目标的唯一真正方法是参加一个教授保护技术的安全课程。 这是一个非常专业的领域,滚动你自己的版本可能会适得其反,并没有给你真正的保护(使用哈希只是第一步)。

如果将它们存储为纯文本,则不安全,您可以转储文件或使用字符串等实用程序在可执行文件中查找文本。

您必须以某种方式对它们进行编码。

以下是使用OpenSSL可能对您有所帮助的代码示例。

 #include  bool SHA256Hash(const char* buf, size_t buflen, char* res, size_t reslen) { if (reslen >= 32) { EVP_MD_CTX mdctx; EVP_MD_CTX_init(&mdctx); EVP_DigestInit_ex(&mdctx, EVP_sha256(), NULL); EVP_DigestUpdate(&mdctx, buf, buflen); EVP_DigestFinal_ex(&mdctx, res, &len); EVP_MD_CTX_cleanup(&mdctx); return (len == 32); } return false; } 

我从systools库中取了这个样本,不得不对它进行调整。 所以我不确定它是否会在没有修改的情况下编译。 但是,它应该对你有所帮助。

请注意,要确定在二进制文件中存储某些密码的哈希值是否安全,我们必须知道您的需要。

如果你希望它禁止你的程序的某些function,除非给出一些特殊的密码,那么它是无用的:攻击者可能会删除整个密码检查代码而不是试图猜测或反转存储的密码。

尝试找出哈希函数和加密方法来保护您的密码及其存储。