Você pode muito bem ouvir essa pergunta em uma entrevista para o cargo Java Junior. Mas isso foi perguntado ao meu amigo durante uma entrevista para o cargo de Líder Técnico.
Ambos
String
e uma matriz de caracteres podem ser usados para armazenar dados de texto. Mas escolher conscientemente um ou outro para uma tarefa específica é difícil se você ainda não encontrou uma situação semelhante. Porém, como meu amigo destacou, qualquer questão relacionada a
String
, geralmente envolve uma propriedade especial de strings chamada imutabilidade (
Immutable
), e ele aproveitou isso na entrevista. Então, vejamos alguns motivos pelos quais você deve usar
char []
, e não , para armazenar sua senha
String
.
Razão 1. Strings são imutáveis
Como as strings são imutáveis em Java, sua senha em texto simples estará disponível na memória até que o coletor de lixo a limpe. E como
String
são usados
String pool
para uso repetido, há uma probabilidade bastante alta de que a senha permaneça na memória por muito tempo, o que não é nada seguro.
O pool Java String é um pool ou conjunto de objetos (strings) localizado em um local especial - o heap. String em Java é um dos tipos de dados mais comuns. Este não é um tipo primitivo, mas um objeto, pois consome muitos recursos. Portanto, para armazenar uma string de quatro caracteres, você precisa alocar 56 bytes de memória. É por isso que as strings, como outros objetos, são armazenadas no heap. |
Qualquer pessoa com acesso a um despejo de memória pode encontrar a senha em texto simples, o que é um bom motivo para usar uma senha criptografada em vez de texto simples. Como as strings são imutáveis, seu conteúdo não pode ser alterado. Qualquer alteração criará uma nova linha. Mas no caso de
char []
, você pode substituir qualquer um de seus elementos por zero ou um caractere vazio. Assim, armazenar a senha em uma matriz de caracteres reduz claramente o risco de interceptação da senha.
Razão 2. Recomendações dos autores
O próprio Java (bem, através de seus criadores, é claro) recomenda usar um método
getPassword ()
da classe
JPasswordField
que retorna
char []
. Você também pode tentar o método obsoleto
getText ()
. Por que não seguir as recomendações dos autores do idioma?
Razão 3. Imprimir
Com um tipo,
String
sempre existe o perigo de o texto armazenado na string ser impresso no arquivo de log ou no console. Ao mesmo tempo, se você usar
Array
, não imprimirá o conteúdo do array, mas apenas sua localização na memória. Claro, este não é exatamente um motivo sério, mas ainda assim faz sentido.
String strPassword = "Unknown";
char [] charPassword = new char [] {'U', 'n', 'k', 'w', 'o', 'n'};
System.out.println ("String password:" + strPassword);
System.out.println ("char password:" + charPassword);
String password: Unknown
Character password: [C@110b053
É claro que usar
char []
Java para armazenar senhas por si só não é uma panacéia. Você precisa tomar precauções de segurança, como trabalhar com hashes e criptografar senhas em vez de armazená-las em texto simples. E, claro, exclua-o da memória imediatamente após o procedimento de autenticação.
Baseado em materiais de Javarevisitado
GO TO FULL VERSION