我需要将我的应用程序与 Fastspring 集成。我编写了一个密钥生成器,它通过 HTTP POST 接收来自 Fastspring 的输入。输入包括我需要验证的 MD5 哈希码。
为了验证 md5 哈希,根据 Fastspring 规范,我使用以下代码:
// 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 post 参数,一旦解码(http+utf8),是:
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 提供的哈希码相同的哈希码。
如何使用 Indy 通过提供 unicode 字符串来计算正确的 md5?我对 TIdHashMessageDigest5 的使用有什么问题?
使用德尔福 XE4 PRO
注意:即使这个问题是 Delphi 和 Fastspring 所特有的,这种支付处理器被广泛使用,任何想要将 delphi 密钥生成器与 fastspring 集成的人都会感兴趣的工作 md5 哈希计算(FS 网站上没有示例代码,他们不能提供一个)
[编辑] 我发现使用另一个 md5 函数,结果现在与 fastspring 提供的相同。所以我把我的问题集中在正确使用 Indy 函数上。有关替代解决方案,请参阅我的答案。