Pergunta

Suponha que haja uma variável String que contém uma senha de texto simples.

Existe alguma possibilidade de ler essa senha usando um despejo de memória. (Suponha usando cheat engine.) Estou intrigado com essa coisa JVM. Does JVM fornecer algum tipo de proteção contra isso. Se não, quais são as práticas que eu preciso usar para evitar tal "roubar".

A ameaça prático seria um Trojan; que envia os segmentos do despejo de memória para uma parte externa.

Foi útil?

Solução

Como já observado, sim, qualquer um pode extrair a senha, de várias maneiras. Criptografar a senha não irão realmente ajudar - se for decifrada pela aplicação, em seguida, o formulário descriptografado também estará presente em algum momento, mais a chave de decodificação (ou código) em si torna-se uma vulnerabilidade. Se ele é enviado para outro lugar de forma criptografada, então apenas saber a forma criptografada é suficiente para falsificar a transação, para que não ajuda muito.

Basicamente, enquanto o "atacante" é também o "remetente", você está indo eventualmente ficar rachado -. É por isso que as indústrias de música e vídeo não pode obter DRM ao trabalho

Eu sugiro que você pegar uma cópia do Applied Cryptography e ler a primeira seção, "Cryptographic Protocolos". Mesmo sem entrar em matemática da criptografia real, isso vai lhe dar uma boa visão geral de todos os tipos de padrões de projeto nesta área.

Outras dicas

Se você manter a senha em texto simples em seu aplicativo, em seguida, alguém pode lê-lo, jogando com despejos de memória, independentemente da língua ou tempo de execução que você usa.

Para reduzir a chance de isso acontecer só manter a senha em texto simples quando você realmente precisa, em seguida, despejar ou criptografá-lo. Uma coisa a notar aqui é que JPasswordField retorna um char [] em vez de uma string. Isso é porque você não tem controle sobre quando a corda vai desaparecer. Enquanto você também não tem controle sobre quando um char [] desaparecerá você pode preenchê-lo com junk quando você é feito com a senha.

Eu digo reduzir, isso não vai parar alguém. Contanto que a senha está na memória pode ser recuperada, e como a descriptografia tem que ser também parte da entrega também pode ser quebrada deixando sua senha aberta.

Isto não tem nada a ver com Java - exatamente o mesmo problema (se é realmente um) existe para aplicações escritas em qualquer idioma:

  • Se o executável contém uma senha, não importa quão ofuscado ou criptografado, todos que têm acesso ao executável pode descobrir a senha.
  • Se um aplicativo sabe a senha ou chave temporariamente (por exemplo, como parte de um protocolo de autenticação de rede), então qualquer um que pode observar a memória a aplicação está em execução no pode descobrir a senha.

O último é geralmente não é considerado um problema, uma vez que um sistema operacional moderno não permite que aplicativos arbitrários para observar memória do outro, e ataques de escalação de privilégios geralmente dependem de diferentes vetores de ataque.

Se o programa sabe a senha, qualquer um usando o programa pode extrair a senha.

Em teoria, você poderia apenas ligá-lo ao depurador ... definir um ponto de interrupção ... e ler o conteúdo de string

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