In this article
Segurança em Java: explicação
Conheça a segurança no ecossistema Java
O Java está presente em uma grande parte dos aplicativos e softwares atuais. Por ser tão popular, a segurança das aplicações Java afeta inúmeros usuários e equipes de desenvolvimento. A boa notícia é que o Java Developer Kit (JDK) conta com recursos de segurança bastante robustos — a Sun Microsystems (hoje Oracle) realmente projetou o Java pensando em segurança.
Ainda assim, a segurança de aplicações Web em Java tem limitações. As organizações precisam entender quais recursos de segurança vêm integrados ao Java e quais não. Neste artigo, vamos explicar o que está — e o que não está — incluído no pacote Java Security.
Fundamentos da segurança em Java
O que é segurança em Java?
A segurança em Java inclui três camadas — ferramentas, APIs e bibliotecas, além da segurança da linguagem Java e do ambiente de execução. Embora a plataforma ofereça ótima segurança por padrão, os desenvolvedores precisam conhecer e habilitar alguns outros recursos de segurança.
O Java é seguro por padrão?
O pacote Java Security oferece recursos como criptografia, autenticação e infraestrutura de chave pública. Além disso, a segurança do código Java é inerentemente mais robusta do que a de algumas outras linguagens de programação, graças à tipagem forte e a outras medidas de segurança integradas. A equipe responsável pelo JDK também se destaca por lançar atualizações de segurança em tempo hábil. Por exemplo, os novos recursos do Java 17 incluíram uma forma de combater o problema persistente da desserialização insegura.
Quais recursos de segurança o Java oferece?
Tanto a própria linguagem Java quanto os recursos adicionais do pacote Java Security fazem dela uma plataforma segura.
Segurança da plataforma Java
A própria linguagem Java é inerentemente segura de várias maneiras. Alguns de seus recursos incluem:
Gerenciamento automático de memória - O gerenciamento de memória por coleta de lixo do Java descarta objetos automaticamente, mantendo o código o mais limpo e robusto possível. Isso contribui para a segurança, pois um código limpo facilita os testes e reduz as chances de vulnerabilidades.
Tipagem forte - Por ser uma linguagem fortemente tipada, o Java exige que os desenvolvedores sigam parâmetros rigorosos no código. Isso reduz os bugs e as vulnerabilidades de segurança que poderiam surgir por causa deles.
Verificação de bytecode - Durante a compilação, o Java converte o código em bytecode independente de plataforma. A verificação integrada do bytecode garante que ele seja analisado antes da execução, reduzindo a chance de bytecode malicioso ser introduzido.
Carregamento seguro de classes - O carregamento dinâmico de classes é um recurso importante do Java, pois permite instalar componentes de software durante a execução. No entanto, esse mecanismo também pode permitir que invasores carreguem arquivos diretamente na aplicação em execução. Felizmente, a equipe do JDK levou essa possibilidade em conta. Os carregadores seguros de classes permitem que o controlador de acesso da máquina virtual avalie cada arquivo de classe e aplique políticas relacionadas ao contexto da solicitação. Eles também impõem regras aos namespaces dos arquivos de classe, ajudando a impedir que agentes maliciosos falsifiquem classes e as executem no sistema.
Mas esses recursos de segurança só ajudam se as equipes mantiverem atualizada a versão do Java que usam. Em geral, versões desatualizadas do Java não recebem atualizações, incluindo correções de segurança — a menos que você trabalhe com um fornecedor externo que ofereça períodos de suporte mais longos. Atualmente, as equipes podem escolher entre duas versões diferentes do Java. Os desenvolvedores podem optar pela versão mais recente do Java sem LTS, que segue um ciclo regular de lançamentos (a cada 6 meses), ou escolher o Java LTS, que oferece suporte e atualizações por mais tempo. Em resumo: as equipes precisam escolher o modelo mais adequado para manter suas versões atualizadas. Caso contrário, deixarão de receber os recursos de segurança mais recentes, o que pode levar a vulnerabilidades.
Recursos de segurança do Java
Além das medidas de segurança integradas à plataforma Java, os desenvolvedores também podem adicionar alguns recursos de segurança ao criar aplicações. Todos esses recursos estão disponíveis no pacote Java Security (pacote java.security), que inclui classes para:
Criptografia - A Java Cryptography Architecture oferece suporte a várias APIs que permitem assinaturas digitais, resumos de mensagens, cifras, códigos de autenticação de mensagens e geração de chaves. A criptografia reduz o risco de exposição de dados confidenciais.
Autenticação - Um conjunto de APIs chamado Java Authentication and Authorization Service (JAAS) ajuda a garantir que o código Java seja executado por fontes confiáveis. Essas APIs permitem funções de segurança como logon único (SSO), acesso granular a recursos confidenciais e medidas de identificação para verificar usuários. Além disso, o Java conta com outros módulos de login conectáveis que podem ser usados para autenticação.
Autorização - O JAAS também verifica se os usuários têm direitos de controle de acesso para realizar determinada ação.
Infraestrutura de chave pública (PKI) - O Java oferece ferramentas e APIs com recursos que facilitam o desenvolvimento e a implantação de aplicações PKI. Uma estrutura PKI usa certificados digitais para proteger a comunicação entre servidor e cliente.
Comunicação segura - O Java também oferece recursos para proteger a integridade e a privacidade da transferência de dados entre pares em uma rede não confiável. Por exemplo, a API padrão JSSE habilita soquetes seguros para dados TLS/DTLS, o SunJSSE oferece serviços criptográficos e o Java Simple Authentication and Security Layer (SASL) cria um protocolo de autenticação e adiciona uma camada de segurança entre aplicações cliente e servidor.
Assinaturas XML - O Java também permite usar assinaturas XML, que verificam a integridade dos dados fornecendo documentação que comprova a validade de um conjunto de dados.
A maioria desses recursos se concentra no controle de acesso rigoroso — garantindo que cada entidade tenha direito de acessar os dados com os quais precisa interagir — ou na transferência segura de dados. Reforçar o controle de acesso e a transferência de dados melhora significativamente a postura geral de segurança. O Java facilita esse trabalho para os desenvolvedores.
Para fazer uma verificação rápida da segurança do seu código Java, experimente nossa ferramenta de análise de código.
Segurança para aplicações baseadas em Spring
O framework Spring Security oferece recursos adicionais de segurança, facilitando a criação de aplicações seguras baseadas em Spring.
O Spring Security inclui recursos de autenticação e autorização compatíveis com os ambientes Servlet e WebFlux. Em especial, oferece mecanismos seguros para armazenar senhas, o que ajuda na autenticação.
O Spring Security também inclui proteções contra explorações comuns, como:
Proteção contra falsificação de solicitação entre sites (CSRF) - Esse ataque ocorre quando um agente malicioso falsifica um site confiável, redireciona um usuário para ele e o manipula para que revele informações pessoais ou transfira dinheiro. O Spring impede isso com dois mecanismos: o token sincronizador e a exigência de especificar o atributo SameSite em cada cookie de sessão. Ambos autenticam a identidade de um site exigindo provas de confiabilidade nas solicitações.
Cabeçalhos de resposta HTTP de segurança - O Spring Security oferece suporte a vários cabeçalhos de resposta HTTP. Esses cabeçalhos de segurança ajudam a proteger os usuários finais contra vários ataques, como script entre sites, ataques do tipo man-in-the-middle e clickjacking. Os cabeçalhos de resposta HTTP de segurança são uma das maneiras mais simples e eficazes de restringir atividades suspeitas entre o servidor e o navegador.
Redirecionamento para HTTPS - O Spring Security pode ser configurado para redirecionar para HTTPS sempre que um cliente usar HTTP. Isso também impede que atividades suspeitas interfiram na comunicação entre o servidor e o navegador.
Como usar a Snyk para proteger sua aplicação Java

Muitas aplicações Java são desenvolvidas com frameworks robustos, como Spring ou Quarkus. Eles trazem muitas dependências, por isso é essencial analisá-las em busca de vulnerabilidades. Nosso novo relatório State of Open Source mostra que a quantidade média de vulnerabilidades nas dependências de uma aplicação Java é bastante alta. É essencial fazer análises com o Snyk Open Source no seu sistema local, no pipeline e no repositório.
Proteger suas aplicações Java com a Snyk é simples: a plataforma pode ser instalada e configurada em poucos minutos. A Snyk oferece a você as melhores práticas de segurança para Java em todas as etapas do ciclo de vida do desenvolvimento de software (SDLC), para que você crie aplicações Java melhores e mais seguras para seus usuários.
Mesmo com a melhor linguagem, erros acontecem. Com o Snyk Code, você encontra facilmente problemas de segurança no seu código personalizado. Confira estes exemplos de como a Snyk resolveu problemas de segurança em Java no Spring e no IntelliJ IDEA.
Proteja o código Java enquanto desenvolve
Encontre e corrija problemas de segurança no código da sua aplicação em tempo real durante o desenvolvimento.