アプリケーションを 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 関数の正しい使い方について質問します。代替ソリューションについては、私の回答を参照してください。