Ocultar entrada en la línea de comando

Sé que las interfaces de línea de comandos como Git y otros pueden ocultar la entrada de un usuario (útil para las contraseñas). ¿Hay alguna manera de hacerlo programáticamente en Java? Estoy tomando la entrada de contraseña de un usuario y me gustaría que su entrada esté “oculta” en esa línea en particular (pero no en todas). Aquí está mi código (aunque dudo que sea útil …)

try (Scanner input = new Scanner(System.in)) { //I'm guessing it'd probably be some property you set on the scanner or System.in right here... System.out.print("Please input the password for " + name + ": "); password = input.nextLine(); } 

    Pruebe java.io.Console.readPassword . Sin embargo, deberás ejecutar al menos Java 6.

      /** * Reads a password or passphrase from the console with echoing disabled * * @throws IOError * If an I/O error occurs. * * @return A character array containing the password or passphrase read * from the console, not including any line-termination characters, * or null if an end of stream has been reached. */ public char[] readPassword() { return readPassword(""); } 

    Sin embargo, ten cuidado, esto no funciona con la consola de Eclipse. Tendrá que ejecutar el progtwig desde una verdadera consola / shell / terminal / prompt para poder probarlo.

    Sí se puede hacer. Esto se llama enmascaramiento de entrada de línea de comando. Puedes implementar esto fácilmente.

    Puede usar un hilo separado para borrar los caracteres repetidos a medida que se ingresan, y los reemplaza con asteriscos. Esto se hace usando la clase EraserThread que se muestra a continuación

     import java.io.*; class EraserThread implements Runnable { private boolean stop; /** *@param The prompt displayed to the user */ public EraserThread(String prompt) { System.out.print(prompt); } /** * Begin masking...display asterisks (*) */ public void run () { stop = true; while (stop) { System.out.print("\010*"); try { Thread.currentThread().sleep(1); } catch(InterruptedException ie) { ie.printStackTrace(); } } } /** * Instruct the thread to stop masking */ public void stopMasking() { this.stop = false; } } 

    Con el uso de este hilo

     public class PasswordField { /** *@param prompt The prompt to display to the user *@return The password as entered by the user */ public static String readPassword (String prompt) { EraserThread et = new EraserThread(prompt); Thread mask = new Thread(et); mask.start(); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String password = ""; try { password = in.readLine(); } catch (IOException ioe) { ioe.printStackTrace(); } // stop masking et.stopMasking(); // return the password entered by the user return password; } } 

    Este enlace discute en detalles.

    JLine 2 puede ser de interés. Además del enmascaramiento de caracteres, proporcionará funciones de finalización, edición e historial de línea de comandos. En consecuencia, es muy útil para una herramienta Java basada en CLI.

    Para enmascarar tu entrada:

     String password = new jline.ConsoleReader().readLine(new Character('*')); 

    Ahi esta :

     Console cons; char[] passwd; if ((cons = System.console()) != null && (passwd = cons.readPassword("[%s]", "Password:")) != null) { ... java.util.Arrays.fill(passwd, ' '); } 

    fuente

    pero no creo que esto funcione con un IDE como Eclipse porque el progtwig se ejecuta como un proceso en segundo plano en lugar de un proceso de nivel superior con una ventana de consola.

    Otro enfoque es usar JPasswordField en swing con el método actionPerformed acompaña:

     public void actionPerformed(ActionEvent e) { ... char [] p = pwdField.getPassword(); } 

    fuente

    La clase Console tiene un método readPassword() que podría resolver su problema.

    Si está tratando con una matriz de caracteres Java (como los caracteres de contraseña que lee desde la consola), puede convertirla 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}" 

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