Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to mask a password in Java 5?

I am trying to mask a password in Java. Sun java has suggested a way to mask a password as follows.

Masking a password

It uses a simple way to do that.

public void run () {
  stop = true;
  while (stop) {
     System.out.print("\010*");
 try {
    Thread.currentThread().sleep(1);
     } catch(InterruptedException ie) {
        ie.printStackTrace();
     }
  }
}

But this approach has several drawbacks.

  1. If the user uses the arrow keys + delete keys the password gets revealed.

  2. If the user accidentally press 2 keys at the same time (Extremely high typing speed) some characters does not get masked.

Do you guys think of any way that can get a 100% correct masking?

like image 723
Chathuranga Chandrasekara Avatar asked Jul 10 '09 11:07

Chathuranga Chandrasekara


People also ask

How to mask password in java code?

To mask the password field, use the setEchoChar method. For example, to set the echo char to an asterisk, you would do: TextField password = new TextField(8); password.

What is masking in password?

Password masking is the act of hiding passwords as bullets or asterisks when the user enters the password. Password masking is an attempt to protect the user against shoulder surfers who look at the screen.

How to create show password in java?

Use the JPasswordField which has nice function jPasswordField. getPassword(); to get the password as char[] to work with. Use jPasswordField1. setEchoChar('*') to mask the password characters with * .


3 Answers

Use Console.readPassword().

like image 80
Bombe Avatar answered Sep 19 '22 15:09

Bombe


You can now use System.console();

Console c = System.console();
if (c == null) {
    System.err.println("No console.");
    System.exit(1);
}


char [] password = c.readPassword("Enter your password: ");
like image 36
Pierre Avatar answered Sep 21 '22 15:09

Pierre


Using certain syscalls (on windows and unix) you can disable echoing of characters to console. This is what System.console() does, but it works also in Java.

I'm using JNA to map certain syscall of unix and windows in a private branch of jline:

  • on unix I'm using the termios structure and tcgetattr/tcsetattr
  • on windows I'm using GetConsoleMode and SetConsoleMode.

If you need code example leave a comment.

like image 43
dfa Avatar answered Sep 22 '22 15:09

dfa