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.
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.
É 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