Wie Sie den Scanner verwenden zu leise gelesen von STDIN in Java?
Möchte ich ein Java-Programm, das liest ein Passwort von STDIN im hintergrund. Ich meine, ohne die Ausgabe zu jedem gedrückten Zeichen für das terminal und halten Sie es versteckt von der Kommandozeile Geschichte und das Betriebssystem processlist ps
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Klasse java.io.Konsole kann hilfreich sein:
Dieser liest eine Folge von Zeichen von der Konsole aus, ohne echo, nichts.
Beachten Sie, dass es nur funktioniert, wenn Sie starten Sie Ihren java-Anwendung mit einer echten Konsole. Ansonsten System.Konsole() null zurück.
Eine weniger sichere option, um das Passwort per STDIN, arbeitet mit hintergrund-jobs, virtuelle Konsolen und die normalen Konsolen:
Dieser ist besser verträglich und weniger sicher, es sollte funktionieren mit Ihrem virtuellen Konsole in deiner IDE für hintergrund-Prozesse, die nicht über eine TTY -, und normal-Konsolen. Wenn eine Konsole nicht gefunden wird, fällt es zurück zu verwenden ein BufferedReader welcher wird setzen Sie das Kennwort auf dem Bildschirm, wie der Benutzer es in einigen Fällen.
Java-Code:
Hier ist, was es sieht aus wie durch das Eclipse-virtual console:
Hier ist, was es sieht aus wie Sie durch die normale Konsole.
Möchten Sie vielleicht zu geben java.io.Konsole einen Blick
Es hat eine readPassword-Methode, die "Liest ein Passwort oder eine passphrase von der Konsole mit echo deaktiviert".
Sicherste option für Java um ein Passwort zu erhalten, mit STDIN:
Diese demonstration ist mit Java auf Ubuntu 12.10 terminal. Greifen Sie das Kennwort mit STDIN ist eine gute Idee, Sicherheit klug, da das Passwort nicht ausgesetzt, Geschichte der Befehlszeile oder innerhalb der processlist mit
ps
. Das Passwort Buchstaben eingegeben werden weggeworfen und nicht aufbewahrt.Java-Code:
Bedingungen, wenn Sie mit dem obigen code
Wenn super-high-Sicherheit ist Ihre oberste Priorität nicht sogar speichern Sie das Kennwort in einer
String
. Verschlüsseln Sie es sofort nach Erhalt durch den Benutzer. So, wenn einige clevere person durchsucht den Speicher des Programms, werden Sie nicht finden Sie Ihre Klartext-Passwort gibt.Wenn Sie versuchen, führen Sie dieses Programm durch einen hintergrund-job scheduler, dann ist es möglich, dass
System.console().readPassword()
gibt eine NullPointerException, das ist ein feature, um die Sicherheit zu erhöhen. Es verweigert den Zugriff auf Spielereien wie virtuelle Konsolen und hintergrund-tasks. Wenn Sie wollen, dass es richtig funktioniert mit virtuellen Konsolen siehe meine andere Antwort auf dieser Seite.Wenn Sie versuchen, diesen code über eine IDE wie Eclipse, Netbeans oder anderen virtuellen Konsole, dann
System.console().readPassword()
wirft eine NullPointerException, weil keine echte Konsole ist gefunden, und das Programm wird angehalten. Dies ist ein feature, kein bug.Was aussieht wie auf der Konsole: