Announcement

Collapse
No announcement yet.

Kennwort in Objectinspector codiert anzeigen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Kennwort in Objectinspector codiert anzeigen

    hi,

    wie kann ich im Objectinspector ein Property welches vom Typ string ist codiert also als * anzeigen?

    bsp.: Eingabe vom String 'Test' --> '****'

    Mit freundlichen Grüssen

    David Wenzlow

  • #2
    Hallo,
    Du kannst in der Get-Methode der Property einfach Sterne zurückgeben, oder einen Property Editor schreiben.

    Walte

    Comment


    • #3
      @David: Wozu soll das gut sein? Schalte beim Formular auf die Ansicht als Quelltext und Du siehst es erneut im Klartext.<p>
      Schöne Grüße,
      Mario Noac
      Schöne Grüße, Mario

      Comment


      • #4
        In der Komponente definierst du eine Get/Set Methode. In der Get Methode gibts du immer '******' zurück, und die Set Methode setzt das Passwort. Die Property definierst du als storred FALSE damit sie nicht in der DFM gespeichert wird. Nun überschreibst du .DefineProperties() und darin definierst du eine eigene Schreib/Lese Callback für eine "versteckte" Property. Deine Schreib/Lese Funktionen speichern nun das korrkte Password, aber eben verschlüsselt.

        <pre>

        type
        TMyCompo = class()
        private
        FPassword: String;
        function GetPassword: String;
        procedure SetPassword(Value: String);
        procedure WritePassword(Stream: TStream);
        procedure ReadPassword(Stream: TStream);
        protected
        procedure DefineProperties(Filer: TFiler); override;
        published
        property Password: String read GetPassword write SetPassword; stored false;
        end;<br>

        function TMyCompo.GetPassword: String;
        begin
        Result := '****';
        end;<br>

        procedure TMyCombo.SetPassword(Value: String);
        begin
        if Value <> '****' then
        FPassword := Value;
        end;<br>

        function Protect(const Value: String): String;
        var
        I,Seed: Integer;
        begin
        Seed := RandomSeed;
        SetLength(Result, Length(Value));
        for I := 1 to Length(Value) do
        Result[I] := Char(Ord(Value[I]) xor Random(256));
        RandomSeed := Seed;
        end;<br>

        procedure TMyCombo.ReadPassword(Stream: TStream);
        var
        Len: Byte;
        begin
        Stream.ReadBuffer(Len, SizeOf(Len));
        SetLength(FPassword, Len);
        Stream.ReadBuffer(FPassword[1], Len);
        FPassword := Protect(FPassword);
        end;<br>

        procedure TMyCombo.WritePassword(Stream: TStream);
        var
        Len: Byte;
        begin
        Temp := Protect(FPassword);
        Len := Length(Temp);
        Stream.WriteBuffer(Len, SizeOf(Len));
        Stream.WriteBuffer(Temp[1], Len);
        end;<br>

        procedure TMyCombo.DefineProperties(Filter: TFiler);
        begin
        inherited DefineProperties(Filter);
        Filter.DefineBinaryProperty('xData', ReadPassword, WritePassword, True);
        end;<br>

        </pre>

        Mehr Aufwand würde ich nicht treiben, denn es ist im Grunde nicht sicher zu bekommen. Jedes Password das in der EXE gespeichert wird kann in irgendeiner Form geknackt werden.

        Gruß Hage

        Comment

        Working...
        X