我知道如何在终端中使用GCC和CC编译C和C ++源文件,但我想知道在编译后是否可以安全地将密码包含在这些文件中。
例如..我检查用户输入的某个密码,例如123,但看起来编译的C / C ++程序可以被反编译。
是否有编译C / C ++源文件,同时保持源完全隐藏.. 如果没有,任何人都可以提供一个加密输入的小例子,然后检查密码,例如:(SHA1,MD5)
答案 0 :(得分:4)
不,您无法在源文件中安全地包含密码。可执行文件中的字符串是纯文本的,任何拥有文本编辑器的人都可以轻松查看您的密码。
不太安全,但会踩踏一些人,就是存储加密的字符串。所以,基本上:
enc = "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"
bool check() {
pass = getPassFromUser();
encpass = myHashingFunction(pass);
return pass == encpass;
}
这会阻止一些人,但实际上并不是更加安全,汇编黑客用另一个带有已知明文值的sha256编码字符串替换你的可执行文件中的'enc'字符串相对微不足道。
即使您使用单独的身份验证服务器,也不难设置虚假身份验证服务器并欺骗您的程序连接到此虚假身份验证服务器。
答案 1 :(得分:4)
即使您使用SHA1生成哈希,如果您以正常方式执行此操作并不是那么安全(编写检查密码的函数),任何已确定或知识渊博的黑客都可以访问可执行文件绕过它(用已知的哈希替换你的哈希,或者用一个返回true的调用替换checkPassword()调用。
问题是你想要保护谁?你的小弟弟,黑客,国际间谍,工业间谍?
将SHA1与代码(或配置文件)中包含的哈希一起使用只能防止你的小弟弟? (阅读休闲计算机用户,这些用户不会费心去尝试和破解你的程序,而不是支付共享器价格)。在这种情况下,使用纯文本密码或SHA1哈希几乎没有什么区别(可能有几个百分点的人不会打扰)。
如果你想让你的代码安全,那么你需要做更多的事情。一本关于安全性的书是一个很好的起点,但实现这一目标的唯一真正方法是采用安全级别来教授保护技术。这是一个非常专业的领域,滚动你自己的版本可能会适得其反,并没有给你真正的保护(使用哈希只是第一步)。
答案 2 :(得分:3)
不建议在代码中保留任何敏感的静态数据。您可以使用配置文件。在那里你可以存储任何你喜欢的东西。
但是,如果您真的想要这样做,请首先记住通过调试调试器并修改代码可以轻松更改代码。只有用户无权访问的程序才能被视为更安全(例如网站)。
大多数(不同站点的)登录密码都没有以明文形式存储在数据库中,而是使用算法MD5,SHA1,Blowfish等加密。
我建议您使用algorithms库中的OpenSSL之一。
我要做的是使用一些public-key cryptographic algorithm。这可能需要更长时间才能被破解,因为在我看来,在谈论软件保护时,没有什么是100%肯定的。
答案 3 :(得分:2)
如果将它们存储为纯文本,则不安全,您只需转储文件或使用字符串等实用程序在可执行文件中查找文本。
您必须以某种方式对它们进行编码。
答案 4 :(得分:1)
以下是使用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
库中获取此样本并且必须对其进行调整。所以我不确定它是否会在没有修改的情况下编译。但是,它应该对你有帮助。
请注意,要确定在二进制文件中存储某些密码的哈希值是否安全,我们必须知道您的需要。
如果你希望它禁止你的程序的一些功能,除非给出一些特殊的密码,那么它是无用的:攻击者可能会删除整个密码检查代码,而不是试图猜测或反转存储的密码。 / p>
答案 5 :(得分:0)
尝试找出哈希函数和加密方法来保护您的密码及其存储。