0

アプリケーションを Fastspring と統合する必要があります。HTTP POST を介して、Fastspring から入力を受け取るキー ジェネレーターを作成しました。入力には、検証する必要がある MD5 ハッシュ コードが含まれています。

Fastspring の仕様に従って、md5 ハッシュを検証するには、次のコードを使用します。


// RawForm and cstr are delcared as string (delphi xe4)

RawForm := UTF8Decode(HTTPDecode(RawForm)); // Convert from utf8, http encoded, to Unicode string

tsl := TStringList.Create;  
tsl.StrictDelimiter := True; 
tsl.Delimiter := '&'; 
tsl.DelimitedText := RawForm; 
// sort parameters by name, using ordinal sort order. Note: not correct, but all names are lowercase for now
tsl.Sort; 
// Checked: At this point I do have a correctly decoded stringlist of http post parameters

// concatenate all values except the hash code
cstr := ''; 
for i:=0 to tsl.Count-1 do 
begin 
  if (tsl.Names[i]='security_request_hash') then 
    rmd5 := tsl.ValueFromIndex[i] 
  else 
    cstr := cstr + tsl.ValueFromIndex[i]; 
end; 
// concatenate the private key at the end
cstr := cstr + FASTSPRING_PRIVATE_KEY; 

cmd5 := TIdHashMessageDigest5.Create; 
lmd5 := cmd5.HashStringAsHex(cstr);

Result := (Lowercase(lmd5) = Lowercase(rmd5));

デコードされた (http+utf8) 提供された http ポスト パラメーターは次のとおりです。

company=FooBar Inc.
email=vagif.samadoghlu@example.com
internalProductName=OBFUSCATED PRODUCT NAME
name=Вагиф Сәмәдоғлу
paymentprocessor=fastspring
product=OBFUSCATED PRODUCT NAME
quantity=1
reference=TEST_REF
servicekey=OBFUSCATED
servicename=OBFUSCATED
serviceversion=OBFUSCATED
subscriptionReference=SUB_TEST_REF
test=true
security_request_hash=84ffa39549f79a7be254b910217a47a7

注: 一部のパラメーター値は、明らかなセキュリティ上の理由から難読化されています。フォームは、私が取り組んでいるデータを説明するために提供されていますが、提供された値とハッシュ コードを使用して内容を確認することはできません。

問題: Fastspring が提供するものと同じハッシュ コードが見つからない。

ユニコード文字列を提供して正しい md5 を計算するために Indy を使用する方法は? TIdHashMessageDigest5 の使用方法の何が問題になっていますか?

Delphi XE4 PRO の使用

注:この質問はDelphiとFastspringに固有のものですが、この支払いプロセッサは広く使用されており、動作中のmd5ハッシュ計算は、Delphi keygenをfastspringと統合したい人にとって興味深いでしょう(FS Webサイトにサンプルコードはありません。そして彼らはそれを提供することはできません)

[編集] 別の md5 関数を使用すると、結果が fastspring によって提供されるものと同じになることがわかりました。そこで、Indy 関数の正しい使い方について質問します。代替ソリューションについては、私の回答を参照してください。

4

2 に答える 2

0

注: Delphi エンタープライズで提供されるユニットは、Unicode 文字列が提供されると、md5 ハッシュを正しく計算することがわかりました。

Jeroen に感謝し ます。

私が使用したユニットは、(デルファイ ソース ルート フォルダー)\Win32\soap\wsdlimporter\MessageDigest_5.pas の下にあります。

このユニットは PRO エディションでは利用できず、Enterprise および Architect エディションでのみ利用可能であることに注意してください。

私は Delphi 2010 Enterprise エディションの登録ユーザーでもあるので、MessageDigest_5.pas ユニットのインポートは問題ありませんでした。このユニットを使用した md5 の結果は、支払い処理業者が提供するコードと同じです。


  hash := MessageDigest_5.GetMD5();
  hash.Update(cstr);
  fingerprint := hash.AsString();
  lmd5 := LowerCase(fingerprint);

そのため、同じ結果に到達するために、質問を編集し、Indy コンポーネントの正しい使用法に焦点を合わせました (Indy は広く使用されています。これはバグではなく、私の側からの間違った使用法であると思います。インディ関数?)

于 2013-06-12T07:55:19.957 に答える
0

価値があるのは、 MessageDigest_5.pas が XE4 で削除されたようです。XE4 Enterprise を使用していますが、もう (\soap\wsdlimporter に) ありません。しばらく使っていたので残念です。今、私は別の解決策が必要です:(

参考までに

于 2013-06-12T20:09:22.043 に答える