我正在编写一个Delphi 2010应用程序,它将连接到PHP Web应用程序以获取特定数据。服务器上的网页接受3个 GET 参数:
问题在于令牌。它是在Delphi中使用以下函数生成的:
function DigestToStr(Digest: array of byte): string;
var
i: Integer;
begin
Result := '';
for i := 0 to Length(Digest) do
Result := Result + LowerCase(IntToHex(Digest[i], 2));
end;
function GetStringHash(Source: string): string;
var
Hash: TDCP_sha256;
Digest: array[0..31] of Byte;
begin
Hash := TDCP_sha256.Create(nil);
Hash.Init;
Hash.UpdateStr(Source);
Hash.Final(Digest);
Hash.Free;
Result := DigestToStr(Digest);
end;
procedure TMain.Button3Click(Sendere: TObject);
var
TheToken,Sha256:string;
begin
salt:=FormatDateTime('yyyymmddhhnnsszzz',Now);
TheToken:=salt+'THE_SECRET_KEY'+MCity;
Sha256:=GetStringHash(TheToken);
end;
Delphi为令牌提供此字符串: ec4338bb3e7819a1148ffc01713f6d164f4f5940c5758d896b0a3d53f30f8c24f0
PHP的哈希函数提供完全不同的字符串:
<?php
hash('sha256','20120119115458592THE_SECRET_KEY1');
?>
8b4cff3b937bbcfae8fa7a67ce407b6185451a52e994ea2ef92a760676717490
我试图在网上寻找类似的问题,但发现只讨论了对称的加密/描述问题,我不需要对令牌进行对称加密
更新 我已经想通了!问题是错误的变量类型!
我使用了字符串,当我用 AnsiString 替换它时,它已经解决了!
function GetStringHash(Source: AnsiString): string;
var
...
除此之外,我更换了
for i := 0 to Length(Digest) do
与
for i := 0 to Length(Digest)-1 do
DigestToStr 功能中的
对不起造成干扰,但我希望这会对某人有帮助!