Passworteingabe über Konsole

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
mbulm1
Beiträge: 15
Registriert: Do 8. Aug 2019, 11:44

Passworteingabe über Konsole

Beitrag von mbulm1 »

Guten Tag,
ich brauche mal wieder Eure Hilfe!
Wie kann ich unter Lazarus die Eingabe eines Passworts in der Konsole sofort maskieren - d.h. Buchstaben für Buchstaben?
Vielen Dank vorab für Eure Bemühungen.
Beste Grüße
mbulm1

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2640
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Passworteingabe über Konsole

Beitrag von m.fuchs »

Schnell und schmutzig so:

Code: Alles auswählen

function ReadMasked: String;
var
  c: Char;
begin
  Result := EmptyStr;
  repeat
    c := ReadKey;
    if not (c = #13) then begin
      Result := Result + c;
      Write('*');
    end;
  until c = #13;
end;

Benötigt die Units Crt und SysUtils.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Warf
Beiträge: 1910
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Passworteingabe über Konsole

Beitrag von Warf »

m.fuchs hat geschrieben:Schnell und schmutzig so:

[...]
Benötigt die Units Crt und SysUtils.

Wenn man noch eine abfrage auf #8 (backspace) zum löschen des letzten characters einfügt ist das denk ich mal ne ausreichende funktion. Aber, ich persönlich bin kein sonderlich großer fan der CRT Unit, da sie eigenes buffering vornimmt, und man wenn man sie benutzt einige sachen nicht mehr so trivial zu benutzen sind (da praktisch zwischen jeder ausgabe die CRT unit geschaltet wird, was es wiederum nicht erlaubt eigene low level sachen zu machen)
Dafür hatte ich mal in dieser Unit einiges an Funktionalität geschrieben, unter anderem auch eine ReadChar methode: Link

mbulm1
Beiträge: 15
Registriert: Do 8. Aug 2019, 11:44

Re: Passworteingabe über Konsole

Beitrag von mbulm1 »

Hallo "Warf",
das mit #8(Backspace) habe ich jetzt nicht so richtig verstanden - kannst Du das mit Quellcode etwas erläutern?
Lieben Dank vorab!
BG
mbulm1

Warf
Beiträge: 1910
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Passworteingabe über Konsole

Beitrag von Warf »

Ich hab dir hier mal ne etwas ausgefeiltere Version geschrieben. Das problem ist, um das ganze richtig gut zu machen müsste man viel mehr arbeit reinstecken (damit z.B. Pfeiltasten nicht als Chars gehandelt werden, etc.)

Code: Alles auswählen

function ReadMasked(const Prefix: String; const MaskChar: Char): String;
 
function getClearText(len: Integer): String;
begin
  SetLength(Result, Prefix.Length + len + 2);
  Result[1] := #13;
  FillChar(Result[2], Prefix.Length + len, ' ')
  Result[Result.Length] := #13;
end;
 
var
  Masked: String;
  c: Char;
  clearLength: Integer;
begin
  clearLength:=0;
  Masked := '';
  Result := '';
  while True do
  begin
    Write(getClearText(clearLength), Prefix, Masked);
    clearLength:=Masked.Length;
    c := ReadKey;
    case c of
    #0..#7,#10..#12,#14..#31:
      // Non Printable chars
      continue;
    #8:
    begin // Backspace -> remove last char
      Result := Result.Remove(Result.Length - 1);
      Masked := Masked.Remove(Masked.Length - 1);
    end;
    #13: // Enter -> break loop and return password
      break;
    else
    begin // other, printable chars
      Result += c;
      Masked += MaskChar;
    end;
  end;
  end
  Writeln;
end;
 
// Benutzung:
var
  PW: String;
...
  PW := ReadMasked('Password: ', '*');

mbulm1
Beiträge: 15
Registriert: Do 8. Aug 2019, 11:44

Re: Passworteingabe über Konsole

Beitrag von mbulm1 »

Danke "Warf" - Du bist mehr als SUPER - jetzt habe ich es verstanden!
BG
mbulm1

Antworten