Pergunta

Eu sei como compilar arquivos de origem C e C ++ usando GCC e CC no terminal, no entanto, gostaria de saber se é seguro incluir senhas nesses arquivos, uma vez compilado.

Por exemplo .. Eu verifico a entrada do usuário para uma determinada senha, por exemplo, 123, mas parece que os programas C/C ++ compilados podem ser descompilados.

De qualquer forma, existe para compilar um arquivo de origem C/C ++, mantendo a fonte completamente escondida. Caso contrário, alguém poderia fornecer um pequeno exemplo de criptografar a entrada e depois verificar contra a senha, por exemplo: (sha1, md5)

Foi útil?

Solução

Não é recomendável manter quaisquer dados estáticos sensíveis dentro do código. Você pode usar arquivos de configuração para isso. Lá você pode armazenar o que quiser.

Mas se você realmente deseja fazer isso primeiro, lembre -se de que o código pode ser facilmente alterado investigando com um depurador e modificando -o. Somente programas aos quais o usuário não tem acesso pode ser considerado mais seguro (Sites da Web, por exemplo).

A maioria das senhas de login (de sites diferentes) não é armazenada em clara no banco de dados, mas criptografada com algoritmos MD5, SHA1, Blowfish etc.

Eu sugiro que você use um desses Algoritmos a partir de OpenSSL biblioteca.

O que eu faria é usar alguns Algoritmo criptográfico de chave pública. Provavelmente, isso levará um pouco mais para ser quebrado, porque, na minha opinião, não há nada 100% certo ao falar sobre proteção de software.

Outras dicas

Não, você não pode incluir com segurança a senha no seu arquivo de origem. Strings no arquivo executável estão em texto simples, qualquer pessoa com um editor de texto pode facilmente olhar para sua senha.

Um não tão seguro, mas atropelaria algumas pessoas, é armazenar a corda criptografada. Então, basicamente:

enc = "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"

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

Isso impedirá algumas pessoas, mas não é muito mais seguro, é relativamente trivial para o Hacker de montagem substituir a string 'ENC' em seu executável por outra string codificada por SHA256 por um valor conhecido de ClearText.

Mesmo se você usar um servidor de autenticação separado, não é difícil configurar um servidor de autenticação falso e enganar seu programa conectar -se a este servidor de autenticação falso.

Mesmo se você usar o SHA1 para gerar um hash, não é realmente tão seguro se você fizer isso de maneira normal (escreva uma função para verificar uma senha) qualquer hacker determinado ou qualificado com acesso ao executável poderá contornar isso (Substitua seu hash por um hash conhecido ou apenas substitua a chamada checkPassword () por uma chamada que retorna true.

A questão é com quem você está tentando proteger? Seu irmãozinho, um hacker, espiões internacionais, espionagem industrial?

Usar o SHA1 com o hash que acabou de ser contido no código (ou um arquivo de configuração) só protegerá contra seu irmãozinho? (Leia os usuários casuais de computador que não podem se dar ao trabalho de tentar hackear seu programa em vez de pagar o preço do Share Ware). Nesse caso, o uso de senha de texto simples ou um hash sha1 faz pouca diferença (talvez alguns por cento mais pessoas não se incomodem).

Se você deseja tornar seu código seguro contra qualquer outra coisa, precisará fazer muito mais. Um livro sobre segurança é um bom ponto de partida, mas a única maneira real de fazer isso é fazer uma aula de segurança onde as técnicas de proteção são ensinadas. Este é um campo muito especializado e é provável que a sua própria versão seja contra -produtiva e não ofereça nenhuma proteção real (usar um hash é apenas a primeira etapa).

Não é seguro se você os armazenar como texto simples, basta despejar o arquivo ou usar um utilitário como strings para encontrar texto no executável.

Você terá que codificá -los de alguma maneira.

Aqui está uma amostra de código que pode ajudá -lo, usando 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;
}

Eu peguei esta amostra do systools biblioteca e teve que adaptá -lo. Portanto, não tenho certeza se isso compila sem modificações. No entanto, deve ajudá -lo.

Observe que, para determinar se o armazenamento de um valor de hash de alguma senha em seu binário é seguro, devemos saber para o que você deseja.

Se você espera que ele proíba algumas funcionalidades do seu programa, a menos que seja fornecida uma senha especial, é inútil: é provável que um invasor remova todo o código de verificação de senha, em vez de tentar adivinhar ou reverter a senha armazenada.

Tente descobrir funções de hash e métodos de cifra para proteger suas senhas e seu armazenamento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top