5

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

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

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

4

6 回答 6

5

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

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

enc = "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"

bool check() {
    pass = getPassFromUser();
    encpass = myHashingFunction(pass);
    return pass == encpass;
}

这会阻止某些人,但实际上并没有更安全,对于程序集黑客来说,将可执行文件中的“enc”字符串替换为另一个具有已知明文值的 sha256 编码字符串相对来说是微不足道的。

即使您使用单独的身份验证服务器,设置一个伪造的身份验证服务器并欺骗您的程序连接到这个伪造的身份验证服务器也不难。

于 2010-06-14T09:52:51.507 回答
4

即使您使用 SHA1 生成哈希,如果您以正常方式执行(编写一个检查密码的函数),也不是那么安全(将您的哈希替换为已知哈希,或者将 checkPassword() 调用替换为返回 true 的调用。

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

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

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

于 2010-06-14T13:01:46.833 回答
3

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

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

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

我建议您使用 OpenSSL 库中的其中一种算法

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

于 2010-06-14T10:51:17.517 回答
2

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

您将不得不以某种方式对它们进行编码。

于 2010-06-14T09:29:53.780 回答
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,不得不对其进行调整。所以我不确定它是否可以在没有修改的情况下编译。但是,它应该对您有所帮助。

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

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

于 2010-06-14T10:22:21.330 回答
0

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

于 2010-06-14T09:36:52.813 回答