JavaRush /Blogue Java /Random-PT /Perguntas e Respostas: Por que é melhor armazenar uma sen...

Perguntas e Respostas: Por que é melhor armazenar uma senha em Java em uma matriz de caracteres em vez de uma String?

Publicado no grupo Random-PT
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.
Perguntas e Respostas: Por que é melhor armazenar uma senha em Java em uma matriz de caracteres em vez de uma String?  - 1
Ambos Stringe 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 Stringsã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 JPasswordFieldque 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, Stringsempre 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
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION