8

FireMonkey でDelphi XE2を使用しています。

MD5 に関する他の多くの質問を読みましたが、私が抱えている問題に対する答えが見つかりませんでした...また、Delphi から MD5 を生成するさまざまなスクリプトをテストしました。

function MD5(const text: string) : string;
var
  md5 : TIdHashMessageDigest5;
begin
  md5    := TIdHashMessageDigest5.Create;
  Result := LowerCase(md5.HashStringAsHex(text, TEncoding.ANSI));
  md5.Free;
end;

また

function MD5(const text: String) : string;
var
  md5: IMD5;
begin
  md5:= GetMD5;
  md5.Init;
  md5.Update(TByteDynArray(RawByteString(AnsiString(text))), Length(AnsiString(text)));
  Result := LowerCase(md5.AsString);
end;

どちらも同じ結果が得られます...これは多くの場合、PHP内と同じです:

$md5 = md5($toencode);
$md5 = hash("md5", $toencode);

しかし、これらの文字のいずれかの MD5 を要求すると、Delphi または PHP を使用すると結果が異なります。"または、' 異なる結果を生成する他の文字が存在する可能性がありますが、テスト中にこれらの文字を見つけるだけです...

多くの拡張 ASCII 文字でテストしましたが、同じ MD5 を使用しています...

"だから、私はそれらのいくつか(または)と違いがある理由を理解していません'.文字が何であれ、DelphiからPHP MD5の結果を常に生成する方法があるかどうかを知りたい.

何か案が?

例えば:

デルファイで:

": b15835f133ff2e27c7cb28117bfae8f4

': 3590cb8af0bbb9e78c343b52b93773c9

PHPで:

": 3bd864034f446da13581129bb17f9191

': 024c94d6e03b6f67a86b952b914816c7

この質問を形式化する..答えを見つけました...ところで、他の人が同じ問題を抱えている可能性があるので投稿します...

"PHP ではエスケープされ'ます...そのため、Delphi 内でエンコードする必要が\"あり\'ます...文字を忘れたと思われる場合、または詳細を追加したい場合は、躊躇しないでください...

4

3 に答える 3

6

Delphi はこの右側にあります。

>>> hashlib.md5('"').hexdigest()
'b15835f133ff2e27c7cb28117bfae8f4'
>>> hashlib.md5("'").hexdigest()
'3590cb8af0bbb9e78c343b52b93773c9'

PHP はデフォルトでこれらの文字をエスケープする必要はありません。そうしないように構成されていることを確認してください。

于 2012-10-05T13:00:31.197 に答える
3

PHPhash関数はMD5を完全に実装します。

次のPHP:

$md5 = hash("md5", "\"");
echo "\":&nbsp;&nbsp;", $md5, "<br/>";
$md5 = hash("md5", "'");
echo "':&nbsp;&nbsp;", $md5, "<br/>";
$md5 = hash("md5", "\\\"");
echo "\\\": ", $md5, "<br/>";
$md5 = hash("md5", "\\'");
echo "\\': ", $md5, "<br/>";

結果は次のようになります。

":b15835f133ff2e27c7cb28117bfae8f4
':3590cb8af0bbb9e78c343b52b93773c9
\ ":3bd864034f446da13581129bb17f9191
\':024c94d6e03b6f67a86b952b914816c7

したがって、上位2つの値は、Delphiコードから取得した値であり、IgnacioがPythonから取得した値と同じです。したがって、PHPMD5コードに問題があると信じる理由はまったくありません。そして、下の2つの値は、PHPコードが返す値です。

これにより、DelphiコードにPHPコードにフィードする入力とは異なる入力をフィードしていると結論付けることができます。両方に同じ入力を与えると、同じ出力が得られます。

于 2012-10-05T13:53:33.437 に答える
1
    uses IdHashMessageDigest;

    function MD5(const texto:string):string;
    var
      idmd5 : TIdHashMessageDigest5;
    begin
      idmd5 := TIdHashMessageDigest5.Create;
      try
        result := idmd5.HashStringAsHex(UTF8Encode(texto));
      finally
        idmd5.Free;
      end;
    end;

まったく同じ使い方をするにLowerCase(MD5('1234'));は、これは PHP MD5 と同じです。

于 2015-03-17T23:20:17.047 に答える