2

TEdit フィールドをプレーン テキストで読み取ることができるツールから設定されたパスワード char を使用して効率的に保護する方法があるかどうか疑問に思っています。

たとえば、これらのツールは TEdit のターゲット ハンドルを取得し、gettext などを使用すると思います。

私がこれまでに試したことは、変数に保存されたパスワードのハッシュを作成し、TEdit のフォーカスが失われたときにそれを書き戻すことですが、内部にハッシュを計算するために別のパスワードを保存する必要があるため、これは意味がありません。実行可能ファイルの。

TEdit のテキストをそれらのツールから保護する方法について、誰かがより良い考えを持っているかもしれません。

4

3 に答える 3

1

他のプログラムが TEdit コンポーネントからテキストを読み取ってパスワードを抽出するのを防ぐことのみに関心がある場合は、代わりに TMaskEdit を使用することをお勧めします ( http://docwiki.embarcadero.com/Libraries/Berlin/en/Vcl.Mask.TMaskEdit ) 。 .

TEdit とは異なり、TMaskEdit は元のテキストをローカル変数内に保存しますが、異なる書式のテキストを表示できます。これは、これらのプログラムが、実際のパスワード テキストではなく、その書式設定されたテキストを常に取得することを意味します。

しかし、他の多くの人が言っているように、ほとんどの悪意のあるソフトウェアは、押されたキーを単純にログに記録するキー ロギング アプローチに依存しているため、これでは十分な保護が得られません。

それらをだますための最良のオプションは、標準の Windows テキスト処理 API さえ使用しない完全にカスタム コンポーネントを使用することです。

于 2016-06-20T13:40:12.373 に答える
1

スタイル付きの編集コントロールはES_PASSWORD、テキストがクリップボードにコピーされるのを防ぎます。残っているのは、そのウィンドウ テキストを他のアプリケーションに公開することと、パスワード文字を null にリセットすることを拒否することです。子孫クラスはこれらを処理できます。

type
  TPasswordEdit = class(TEdit)
  protected
    procedure EmGetPasswordChar(var Message: TMessage); message EM_GETPASSWORDCHAR;
    procedure EmSetPasswordChar(var Message: TMessage); message EM_SETPASSWORDCHAR;
    procedure WMGetText(var Message: TMessage); message WM_GETTEXT;
  end;

procedure TPasswordEdit.EmGetPasswordChar(var Message: TMessage);
begin
  // for nirsoft's BulletsPassView, probably only prevents further inspection, 
  // injecting a thread perhaps - I have no idea what it's doing..
  if (PasswordChar = #0) or not InSendMessage then
    inherited;
end;

procedure TPasswordEdit.EmSetPasswordChar(var Message: TMessage);
begin
  if (PasswordChar <> #0) and (Message.WParam <> 0) then
    inherited;
end;

procedure TPasswordEdit.WMGetText(var Message: TMessage);
begin
  if (PasswordChar = #0) or not InSendMessage then // allow owning thread
    inherited;
end;
于 2016-06-20T18:58:13.217 に答える
-3

このようなことができます。通常の Edit で ReadOnly=true を使用し、独自のパスワードを非表示にします。編集に含まれるコンテンツのみが *. この例は英数字で機能しますが、他の文字も簡単に追加できます。また、編集で選択を使用する場合は、それも処理する必要があります。

コード:

uses
  StrUtils;

var
  password: String;

...

procedure TForm1.FormCreate(Sender: TObject);
begin
  password:='';
end;

...

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var sel: Integer;
begin
  sel:=Edit1.SelStart;
  if((Key>=48) and (Key<=90))then
  begin
    if(ssShift in Shift)then
      password:=LeftStr(password, sel)+Char(Key)+RightStr(password, Length(Edit1.Text)-sel)
    else
      password:=LeftStr(password, sel)+LowerCase(Char(Key))+RightStr(password, Length(Edit1.Text)-sel);

    Edit1.Text:=Edit1.Text+'*';
    Edit1.SelStart:=sel+1;
  end
  else if((Key>=VK_NUMPAD0) and (Key<=VK_NUMPAD9))then
  begin
    password:=LeftStr(password, sel)+Char(Key-48)+RightStr(password, Length(Edit1.Text)-sel);
    Edit1.Text:=Edit1.Text+'*';
    Edit1.SelStart:=sel+1;
  end
  else if((Key=VK_BACK) and (sel>0))then
  begin
    Delete(password, sel, 1);
    Edit1.Text:=Copy(Edit1.Text, 1, Length(Edit1.Text)-1);
    Edit1.SelStart:=sel-1;
  end
  else if((Key=VK_DELETE) and (sel<Length(Edit1.Text)))then
  begin
    Delete(password, sel+1, 1);
    Edit1.Text:=Copy(Edit1.Text, 1, Length(Edit1.Text)-1);
    Edit1.SelStart:=sel;
  end
  else if(Key=VK_RETURN)then
  begin
    //handle the password check here (make hash etc)
    ShowMessage(password);
    password:='';
    Edit1.Text:='';
  end;

  //just for the testing, this should be removed of course
  Form1.Caption:=password;
end;
于 2016-06-20T08:36:08.417 に答える