Maskieren der Passworteingabe von der Konsole: Java

Lesezeit: 5 Minuten

Maskieren der Passworteingabe von der Konsole Java
Neustart

Wie maskiere ich ein Passwort von der Konsoleneingabe? Ich verwende Java 6.

Ich habe versucht, mit console.readPassword(), aber es würde nicht funktionieren. Ein vollständiges Beispiel könnte mir tatsächlich helfen.

Hier ist mein Code:

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");
    }
}

Ich bekomme eine NullPointerException…

  • Wie genau nicht console.readPassword() arbeiten?

    – BalusC

    15. November 11 um 15:07 Uhr

  • laufen in der Konsole und nicht in einer IDE

    – bilash.saha

    15. November 11 um 15:25 Uhr

  • Dieser Code funktioniert nicht in einer IDE, siehe meine aktualisierte Antwort.

    – Woot4Moo

    15. November 11 um 15:29 Uhr

  • Also muss ich das Projekt als JAR-Datei exportieren und von der Befehlszeile aus ausführen? Wenn ja, habe ich das getan und diesen Fehler erhalten. “Failed to load Main-Class manifest attribute from C:……”

    – Neustart

    15. November 11 um 15:31 Uhr

  • Schau mal bei stackoverflow.com/questions/2591516/…

    – bilash.saha

    15. November 11 um 15:36 Uhr

1643821626 754 Maskieren der Passworteingabe von der Konsole Java
bilash.saha

Ein vollständiges Beispiel?. Führen Sie diesen Code aus: (Hinweis: Dieses Beispiel wird am besten in der Konsole und nicht in einer IDE ausgeführt, da die Methode System.console() in diesem Fall möglicherweise null zurückgibt.)

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();
    }
}

  • Ich habe gerade eine weitere NullPointerException erhalten … Ich verstehe nicht!

    – Neustart

    15. November 11 um 15:16 Uhr

  • Führen Sie dies in einer IDE aus? Läuft der Code nicht? Warum ablehnen?

    – bilash.saha

    15. November 11 um 15:18 Uhr


  • Für die Jungs, die den Nullzeiger bekommen, führen Sie ihn von der Konsole aus, von Eclipse aus wird dies nicht funktionieren

    – Sinisha Mihajlovski

    20. Dezember 2012 um 15:36 Uhr

  • @Woot4Moo Können Sie erklären, warum dies “höchst unsicher” ist? Ohne einen Zusammenhang mit dem Warum ist die Aussage allein nicht sehr nützlich, um das Verständnis zu fördern (und sie ist auch nicht leicht zu überprüfen oder zu widerlegen).

    – M. Justin

    18. September 15 um 3:58 Uhr

  • Es macht wenig Sinn, sich über das interne Speichersicherheitsrisiko einer Leitung zu ärgern, die das Passwort buchstäblich an die Konsole ausgibt.

    – Patrick Parker

    8. Oktober 17 um 17:10 Uhr

Maskieren der Passworteingabe von der Konsole Java
Woot4Moo

Sie würden die verwenden Konsole Klasse

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

Durch Ausführen von readPassword wird das Echoing deaktiviert. Auch nach der Validierung des Passworts ist es am besten, alle Werte im Array zu überschreiben.

Wenn Sie dies von einer IDE aus ausführen, schlägt dies fehl. Bitte lesen Sie diese Erklärung für eine gründliche Antwort: Erklärt

  • @Woot4Moo: Könnten Sie bitte erläutern, wie “die akzeptierte Antwort unsicher ist!”. Ich sehe, Sie überschreiben das Passwort, nachdem Sie es eingelesen haben, aber das scheint einfach albern zu sein. Das Passwort wird für einige Zeit im Speicher bleiben, egal was Sie tun. Selbst wenn Sie den Speicher mit dem Passwort nicht manuell überschrieben hätten, würde der Müll gesammelt und der Speicher mit etwas anderem aufgefüllt. Ehrlich gesagt, wenn jemand die Fähigkeit hat, beliebige Adressen im Speicher zu lesen, sollten Sie meiner Meinung nach größere Bedenken haben.

    – ArtOfWarfare

    20. April 15 um 14:19 Uhr

  • @ArtOfWarfare für den Fall, dass sich die “Antwort” jemals ändert: stackoverflow.com/a/8138549/205426 Der Grund, warum es unsicher ist, wie ich gesagt habe, ist folgender: new String (passwordArray) ein neuer String wird dem String-Pool zugewiesen, der ” never” verschwindet während der Lebensdauer einer JVM. Um Ihrer Aussage zur Garbage Collection entgegenzuwirken, ist Ihnen möglicherweise nicht bewusst, dass die String-Klasse “speziell” ist und keine GCd erhält. Und ja, ich stimme zu, dass das Passwort für einige Zeit im Speicher bleiben wird, ich reduziere diese Zeit nur zufällig so weit wie möglich.

    – Woot4Moo

    20. April 15 um 17:37 Uhr


  • @ArtOfWarfare Außerdem wird jedes System, das so komplex ist wie die JVM, Probleme damit haben. In den fast 4 Jahren, seit ich diesen Beitrag erstellt habe, wurden unzählige Schwachstellen gegen die JVM entdeckt. Wenn Sie also die JVM seit 2011 in Java 6 ausgeführt haben, wette ich, dass es einen „beliebigen Speicher“-Exploit gab

    – Woot4Moo

    20. April 15 um 17:41 Uhr

  • Das Überschreiben der Zeichenwerte im Array ist bestenfalls ein Pflaster. Es gibt keine Garantie dafür, dass der Inhalt des Zeichenarrays “Passwort” zwischen dem Lesen des Passworts aus dem Konsolenobjekt und dem Mal nicht einige Male um den Heap herum kopiert wurde Arrays.fill() Methode vervollständigt. Die Realität ist, dass die sichere Handhabung von In-Memory-Passwörtern in Java einfach ist nicht möglich.

    – Christoph Schultz

    30. April 19 um 14:43 Uhr

1643821627 163 Maskieren der Passworteingabe von der Konsole Java
Benutzer1525941

Console console = System.console();
String username = console.readLine("Username: ");
char[] password = console.readPassword("Password: ");

  • müssen das Passwort-Array füllen.

    – Woot4Moo

    26. November 13 um 16:13 Uhr

1643821627 766 Maskieren der Passworteingabe von der Konsole Java
Daniel Huffmann

Wenn Sie es mit einem Java-Zeichenarray zu tun haben (z. B. Passwortzeichen, die Sie von der Konsole lesen), können Sie es mit dem folgenden Ruby-Code in einen JRuby-String konvertieren:

# 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}"

Siehe auch “https://stackoverflow.com/a/27628738/4390019” und “https://stackoverflow.com/a/27628756/4390019”

1643821628 685 Maskieren der Passworteingabe von der Konsole Java
Amulja Koppula

Der gegebene Code funktioniert absolut gut, wenn wir von der Konsole aus laufen. und es gibt keinen Paketnamen in der Klasse

Sie müssen sicherstellen, wo Sie Ihre “.class”-Datei haben. denn wenn der Paketname für die Klasse angegeben ist, müssen Sie sicherstellen, dass die “.class”-Datei im angegebenen Ordner bleibt. Mein Paketname ist beispielsweise “src.main.code”, ich muss einen Codeordner im Hauptordner und im src-Ordner erstellen und Test.class im Codeordner ablegen. dann funktioniert es einwandfrei.

.

743940cookie-checkMaskieren der Passworteingabe von der Konsole: Java

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy