Enmascarar la entrada de contraseña desde la consola: Java


¿Cómo enmascarar una contraseña desde la entrada de la consola? Estoy usando Java 6.

He intentado usar console.readPassword(), pero no funcionaría. Un ejemplo completo podría ayudarme en realidad.

Aquí está mi código:

import java.io.BufferedReader;
import java.io.Console;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test 
{   
    public static void main(String[] args) 
    {   
        Console console = System.console();

        console.printf("Please enter your username: ");
        String username = console.readLine();
        console.printf(username + "\n");

        console.printf("Please enter your password: ");
        char[] passwordChars = console.readPassword();
        String passwordString = new String(passwordChars);

        console.printf(passwordString + "\n");
    }
}

Estoy obteniendo una excepción NullPointerException...

Author: ROMANIA_engineer, 2011-11-15

4 answers

Un ejemplo completo ?. Ejecutar este código: (NB: Este ejemplo se ejecuta mejor en la consola y no desde un IDE, ya que el Sistema.el método console () podría devolver null en ese caso.)

import java.io.Console;
public class Main {

    public void passwordExample() {        
        Console console = System.console();
        if (console == null) {
            System.out.println("Couldn't get Console instance");
            System.exit(0);
        }

        console.printf("Testing password%n");
        char passwordArray[] = console.readPassword("Enter your secret password: ");
        console.printf("Password entered was: %s%n", new String(passwordArray));

    }

    public static void main(String[] args) {
        new Main().passwordExample();
    }
}
 48
Author: bilash.saha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-12 04:04:48

Utilizarías la clase Console

char[] password = console.readPassword("Enter password");  
Arrays.fill(password, ' ');

Al ejecutar readPassword se deshabilita el eco. Además, después de validar la contraseña, es mejor sobrescribir cualquier valor en la matriz.

Si ejecuta esto desde un ide, fallará, por favor vea esta explicación para una respuesta completa: Explicado

 7
Author: Woot4Moo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-20 14:12:39
Console console = System.console();
String username = console.readLine("Username: ");
char[] password = console.readPassword("Password: ");
 2
Author: user1525941,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-21 16:22:34

Si está tratando con un array de caracteres Java (como los caracteres de contraseña que lee desde la consola), puede convertirlo en una cadena JRuby con el siguiente código Ruby:

# GIST: "pw_from_console.rb" under "https://gist.github.com/drhuffman12"

jconsole = Java::java.lang.System.console()
password = jconsole.readPassword()
ruby_string = ''
password.to_a.each {|c| ruby_string << c.chr}

# .. do something with 'password' variable ..    
puts "password_chars: #{password_chars.inspect}"
puts "password_string: #{password_string}"

Véase también "https://stackoverflow.com/a/27628738/4390019" y "https://stackoverflow.com/a/27628756/4390019"

 0
Author: Daniel Huffman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:30