Pergunta

Eu tenho um arquivo de propriedades em java, em wich i armazenar todas as informações do meu aplicativo, como nome do arquivo imagem do logotipo, nome do banco, o usuário do banco de dados e senha de banco de dados.
I pode armazenar a senha criptografada no arquivo de propriedades.
Mas, a chave ou senha podem ser lidos fora do frasco usando um decompiler.
Existe uma maneira de armazenar o passe db em um arquivo de propriedades de segurança?

Foi útil?

Solução

Existem várias maneiras de gerenciar isso. Se você pode descobrir uma maneira de ter um usuário fornecer uma senha para um armazenamento de chave quando a aplicação inicia-se a forma mais adequada seria a de criptografar todos os valores usando uma chave, e guarde esta chave no armazenamento de chaves. A interface de linha de comando para o armazenamento de chaves é usando keytool. No entanto JSE tem APIs para acessar programaticamente o armazenamento de chaves também.

Se você não tem a capacidade de ter um usuário fornecer manualmente uma senha para o armazenamento de chave na inicialização (dizer para uma aplicação web), uma maneira de fazer isso é escrever uma rotina de ofuscação excepcionalmente complexo que pode ofuscar a chave e armazená-lo em um arquivo de propriedade também. coisas importantes a lembrar é que a lógica de ofuscação e deobfuscation deve ser multi camadas (poderia envolver lutando, codificando, introdução de caracteres espúrios etc. etc.) e em si deve ter pelo menos uma chave que poderia ser escondido em outras classes na aplicação usando nomes não intuitivos. Este não é um mecanismo totalmente seguro, pois alguém com um decompiler e uma quantidade razoável de tempo e inteligência ainda pode trabalhar em torno dele, mas é o único que eu conheço que não exige que você quebrar em código nativo (ie. Não facilmente descompilável) .

Outras dicas

Você pode armazenar um hash SHA1 da senha em seu arquivo de propriedades. Então, quando você validar uma senha de usuários, você botar sua tentativa de login e certifique-se de que os dois hashes corresponder.

Este é o código que vai botar alguns bytes para você. Você pode facilmente ger bytes de uma string usando o método getBytes().

/**
     * Returns the hash value of the given chars
     * 
     * Uses the default hash algorithm described above
     * 
     * @param in
     *            the byte[] to hash
     * @return a byte[] of hashed values
     */
    public static byte[] getHashedBytes(byte[] in)
    {
        MessageDigest msg;
        try
        {
            msg = MessageDigest.getInstance(hashingAlgorithmUsed);
        }
        catch (NoSuchAlgorithmException e)
        {
            throw new AssertionError("Someone chose to use a hashing algorithm that doesn't exist.  Epic fail, go change it in the Util file.  SHA(1) or MD5");
        }
        msg.update(in);
        return msg.digest();
    }

Não, não é. Mesmo se você criptografá-lo, alguém vai descompilar o código que decifra-lo.

Você poderia fazer um arquivo separado propriedades (fora do jar) para senhas (password DB direta ou ou senha de chave) e não incluir esse arquivo de propriedades com a distribuição. Ou você pode ser capaz de fazer o servidor só aceita que o login de uma máquina específica para que spoofing seria necessário.

Além de criptografar as senhas como descrito acima colocar todas as senhas em arquivo de propriedades separado e em tentativa de implantação para dar a este arquivo mais bloqueados permissões possível.

Por exemplo, se suas corridas servidor de aplicativos no Linux / Unix como root em seguida, fazer as propriedades senha do arquivo de propriedade da root com 400 permissões / -r--------.

Não foi possível você tem o contato aplicativo um servidor através de https e baixar a senha, depois de autenticar, de alguma forma, é claro?

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