Senha no prompt

Fala galera,

To com uma dúvida aqui e nem sei se é possivel resolve-la.
Eu criei um programa com swing que acessa banco pra fazer uns serviços pra mim, mas queria tirar a interface gráfica. O problema é que eu queria digitar a senha no prompt pra acessar ao banco sem que ela seja mostrada, como se ela pegasse cada tecla pressionada e salvasse retornando * na tela. Se alguem já tiver um código que faça isso e puder me enviar, agradeco.

É só usar JPasswordField.

:vamp:

Mas eu não queria usar swing, queria no prompt mesmo…sem nenhuma interface gráfica.

Nao da, pq Java nao vem com nenhuma biblioteca para tratamento de consoles em modo texto. Pq nao fazer com Swing?

Olá

Concordo com todas as respostas anteriores que solução portátil para rodar em qualquer SO é usar swing.

Mas se faz questão de não usar o ambiente gráfico a solução pode ser a seguinte:

  • Fazer uma função em C só para ler a senha
  • Acessar esta função por JNI

E seu programa fica amarrado ao hardware/SO, ou seja, será diferente no Win, no Linux, AIX, etc.

[]s
Luca

Olá

Peço desculpas aos amigos pela resposta apressada que dei anteriormente. Quando sai do escritório fiquei pensando nesta resposta. Será que é preciso mesmo chamar uma função em C para ler password no console?

Fiquei pensando mil maneiras de invalidar o echo. Chegando em casa dei uma breve googlada e vejam o que encontrei. Testem o código abaixo:

import java.io.*;

/**
 * This class prompts the user for a password and attempts to mask input with ""
 */

public class PasswordField {

  /**
   *@param prompt The prompt to display to the user.
   *@return The password as entered by the user.
   */

   String getPassword(String prompt) throws IOException {
      // password holder
      String password = "";
      MaskingThread maskingthread = new MaskingThread(prompt);
      Thread thread = new Thread(maskingthread);
      thread.start();
      // block until enter is pressed
      while (true) {
         char c = (char)System.in.read();
         // assume enter pressed, stop masking
         maskingthread.stopMasking();

         if (c == '
') {
            c = (char)System.in.read();
            if (c == '
') {
               break;
            } else {
               continue;
            }
         } else if (c == '
') {
            break;
         } else {
            // store the password
            password += c;
         }
      }
      return password;
   }
}



/**
 * This class attempts to erase characters echoed to the console.
 */

class MaskingThread extends Thread {
   private boolean stop = false;
   private int index;
   private String prompt;


  /**
   *@param prompt The prompt displayed to the user
   */
   public MaskingThread(String prompt) {
      this.prompt = prompt;
   }


  /**
   * Begin masking until asked to stop.
   */
   public void run() {
      while(!stop) {
         try {
            // attempt masking at this rate
            this.sleep(1);
         }catch (InterruptedException iex) {
            iex.printStackTrace();
         }
         if (!stop) {
            System.out.print("
" + prompt + " 
" + prompt);
         }
         System.out.flush();
      }
   }


  /**
   * Instruct the thread to stop masking.
   */
   public void stopMasking() {
      this.stop = true;
   }
}

Usem o seguinte main:

import java.io.*;

public class PasswordApp {
   public static void main(String argv[]) {
      PasswordField passfield = new PasswordField();
      String password = null;
      try {
         password = passfield.getPassword("Enter your password: ");
      } catch(IOException ioe) {
         ioe.printStackTrace();
      }
      System.out.println("The password entered is: "+password);
   }
}

O resultado será o seguinte:

Resumindo:
A classe MaskingThread mascara o echo da senha!
O programa acima não ecoa *****s. Ele limpa o console com System.out.flush(); e deixa a senha em branco que é muito melhor e mais seguro.

Vejam todo o artigo em:
http://java.sun.com/features/2002/09/pword_mask.html

1 x 0 para o Java

[]s
Luca

Luca, muito bom seu post! Valeu pela explicacao :smiley:

É necessário lembrar, no entanto, que se o seu console não se dá muito bem com os backspaces, é provavel que ele também não vá gostar desse método (acontece em alguns HP/UX velhos, especialmente em sessões de telnet).

Outro probleminha é que as teclas de função, como F2, e os acentos podem apresentar algumas esquisitices, mas não cheguei a testar…

Muito pelo contrário…era isso mesmo que eu queria…sabia que havia um jeito mas não imaginava qual seria…desse jeito parece a senha que colocamos em UNIX

Obriagado Luca, cv, Neo