我知道如何在终端中使用 GCC 和 CC 编译 C 和 C++ 源文件,但是我想知道编译后在这些文件中包含密码是否安全。
例如..我检查用户输入的某个密码,例如123,但似乎已编译的C/C++程序可以被反编译。
是否有办法编译 C/C++ 源文件,同时保持源完全隐藏.. 如果没有,任何人都可以提供一个加密输入的小示例,然后检查密码,例如:(SHA1,MD5)
不,您无法在源文件中安全地包含密码。可执行文件中的字符串是纯文本形式,任何拥有文本编辑器的人都可以轻松查看您的密码。
一个不太安全但会践踏某些人的方法是存储加密的字符串。所以,基本上:
enc = "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"
bool check() {
pass = getPassFromUser();
encpass = myHashingFunction(pass);
return pass == encpass;
}
这会阻止一些人,但实际上并没有更安全,对于程序集黑客来说,用另一个具有已知明文值的 sha256 编码字符串替换可执行文件中的“enc”字符串相对简单。
即使您使用单独的身份验证服务器,设置一个伪造的身份验证服务器并欺骗您的程序连接到该伪造的身份验证服务器也不难。
即使您使用 SHA1 生成哈希值,如果您以正常方式(编写一个函数来检查密码)执行此操作,也并不是那么安全,任何有决心或知识渊博的黑客都可以访问可执行文件它(用已知的哈希值替换您的哈希值,或者只是用返回 true 的调用替换 checkPassword() 调用。
问题是你想保护谁?你的弟弟,黑客,国际间谍,工业间谍?
使用 SHA1 和代码(或配置文件)中包含的哈希值只能防止你的小兄弟? (请阅读那些不愿意尝试破解您的程序而不是支付共享软件价格的普通计算机用户)。在这种情况下,使用纯文本密码或 SHA1 哈希几乎没有什么区别(也许多几个百分点的人不会打扰)。
如果您想让您的代码免受其他任何影响,那么您将需要做更多的事情。关于安全的书是一个很好的起点,但唯一真正的方法是参加教授保护技术的安全课程。这是一个非常专业的领域,滚动您自己的版本可能会适得其反,并且不会为您提供真正的保护(使用哈希只是第一步)。
如果将它们存储为纯文本,则不安全,您可以转储文件或使用字符串等实用程序在可执行文件中查找文本。
您必须以某种方式对它们进行编码。
这里是一个可能对您有所帮助的代码示例,使用
OpenSSL
。
#include <openssl/evp.h>
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
库中获取了这个示例,并且必须对其进行调整。所以我不确定它是否可以在不进行修改的情况下编译。不过,它应该对你有帮助。
请注意,要确定在二进制文件中存储某些密码的哈希值是否安全,我们必须知道您想要它的用途。
如果您希望它禁止程序的某些功能,除非给出一些特殊的密码,那么它是无用的:攻击者可能会删除整个密码检查代码,而不是尝试猜测或反转存储的密码。
尝试找出哈希函数和加密方法来保护您的密码及其存储。