0

我需要将我的应用程序与 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 函数上。有关替代解决方案,请参阅我的答案。

4

2 回答 2

0

注意:我发现当提供 unicode 字符串时,delphi Enterprise 提供的一个单元可以正确计算 md5 哈希。

感谢 Jeroen,在这里: http ://wiert.me/2009/12/11/delphi-md5-the-messagedigest_5-unit-has-been-there-since-delphi-2007/

我使用的单元位于(您的delphi源根文件夹)\Win32\soap\wsdlimporter\MessageDigest_5.pas

请注意,此单元在 PRO 版中不可用,仅在 Enterprise 和 Architect 版中可用

我也是 Delphi 2010 企业版的注册用户,所以导入 MessageDigest_5.pas 单元没有问题。该单元的 md5 结果与支付处理器提供的结果相同,代码如下:


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

所以,我已经编辑并将我的问题集中在正确使用 Indy 组件以达到相同的结果(Indy 被广泛使用,我想这不是一个错误,而是我这边的错误使用,可能是在 unicode 或编码处理上印地函数?)

于 2013-06-12T07:55:19.957 回答
0

对于它的价值,MessageDigest_5.pas 似乎已在 XE4 中删除。我正在使用 XE4 Enterprise,但它不再存在(在 \soap\wsdlimporter 中)。太糟糕了,因为我已经使用了一段时间了。现在我需要另一个解决方案:(

仅供参考

于 2013-06-12T20:09:22.043 回答