3

次のコードを使用して入力されたパスワードの単純な暗号化を実行し、暗号化されたパスワードをラベルのキャプションに表示することができました。

procedure TfrmLogin.edtAddPasswordClick(Sender: TObject);
var
  NormalPassword, EncryptedPassword: string;
  PasswordChar: Char;
  EncryptedCharValue: string;
  CharPtr: Integer;
  Ptr, n: Integer;
begin
  NormalPassword := Edit1.text;
  EncryptedPassword := '';
  for CharPtr := 1 to Length(NormalPassword) do
  begin
    PasswordChar := NormalPassword[CharPtr];
    EncryptedCharValue := IntToStr (Ord(PasswordChar) * 5 + 14);
    EncryptedPassword := EncryptedPassword + EncryptedCharValue;
    Label1.Caption := EncryptedPassword;
  end;
end;

問題は、label1.captionに表示されている暗号化されたパスワードを、別のボタンをクリックするだけで元の形式に戻したいのですが、これをどのように行うことができるかわかりません。助言がありますか?

4

5 に答える 5

6

パスワードをハッシュ (または暗号化) するための独自のアルゴリズムを作成する代わりに、SHA1、MD5 などの十分にテストされた信頼性の高いアルゴリズムを使用してみてください。

暗号化された値を元の値に変換する質問に戻ります。アルゴリズムを逆にするだけです。このサンプルを試してください。

var
  NormalPassword, EncryptedPassword: String;
  PasswordChar : char;
  EncryptedCharValue : String;
  CharPtr : Integer;
begin
  NormalPassword    :='';
  EncryptedPassword := Label1.Caption; //here is stored the encrypted password
  CharPtr := 1;
  while CharPtr< length(EncryptedPassword) do
    Begin
      EncryptedCharValue:=Copy(EncryptedPassword, CharPtr, 3);
      Inc(CharPtr, 3);
      PasswordChar     := Chr((StrToint(EncryptedCharValue)-14) div 5);
      NormalPassword  :=NormalPassword+ PasswordChar;
    end;
    Label2.Caption := NormalPassword; 
end;
于 2012-04-09T20:31:07.793 に答える
4

これは宿題のためであり、逆コードを取得することが目的であり、他の人はその目的のために詳細を提供しすぎていることを知っていますが、その概念はメモで言うには重要すぎるため、これを答えとして与える必要があります。

本当にパスワードについて話しているのであれば、パスワードを元に戻せないようにしてはいけません。ユーザーは、自分のパスワードが安全で安全であり、元に戻せないことを期待しています。

これを行う理由が、パスワードを忘れた場合にパスワードを送信するためである場合、答えはdo notです。

人がパスワードをなくしたり忘れたりした場合、そのパスワードが安全でないことが証明されるため、パスワードを返してはいけません。代わりに、(電子メール アドレスまたはその他の方法で) サインアップしたユーザーであることを確認した後、選択した新しいパスワードを入力できるようにするのが適切です。

于 2012-04-09T20:43:17.780 に答える
2

説明した方法でそれを行うことに決めた場合は、次の行を変更して元に戻すことができます。

EncryptedCharValue := IntToStr (Ord(PasswordChar) * 5 + 14);

EncryptedCharValue := format('%.4d', [Ord(PasswordChar) * 5 + 14]);

これにより、後で文字列を 4 文字のチャンクに引き離し、14 を引き、5 で割り、文字に戻すことができます。ただし、以前のコメントを支持します。実際に可逆的なセキュリティを必要とするユースケースがある場合は、この質問で説明されているように、より強力なアルゴリズムを使用してください。

[編集: 4 文字の方が明らかに堅牢です]

于 2012-04-09T20:31:12.953 に答える
1

You 関数は、元に戻すことができない非常に単純なハッシュ アルゴリズムです。パスワードを元に戻すことができる方法で保存することは意味がありません。セキュリティの追加レイヤーを追加しないためです (非対称暗号に基づく複雑なスキームを使用する場合を除く)。

于 2012-04-09T20:16:22.700 に答える
0

単純なハッシュ アルゴリズム: Delphi で文字列をハッシュするにはどうすればよいですか?

秘密鍵アルゴリズムを使用したハッシュ (CRAM、HMac): Delphi の HMAC-SHA256

于 2012-04-10T05:34:40.367 に答える