由于我无法在此线程中解释的原因,我正在使用旧版本的 Delphi (Delphi 5) 编写。我正在尝试实现一个 HOTP,目前我的所有代码都没有 HMACSHA1 部分,我不明白为什么。我根据 RFC 2202 实现了 HMACSHA,并将我的结果与许多其他 HMACSHA1 生成器进行了比较。所有这些都匹配。
然后我开始为 HOTP 实施 RFC 4226,并惊讶地发现我的中间 HMACSHA1 结果与他们在 RFC 底部提供的示例数据相比是错误的(https://www.ietf.org/rfc/rfc4226.txt)。
这是来自 RFC 的测试向量
以下测试数据使用 ASCII 字符串“12345678901234567890”作为密钥:
秘密 = 0x3132333435363738393031323334353637383930
表 1 详细说明了每个计数、中间 HMAC 值。
计数十六进制 HMAC-SHA-1(秘密,计数)
0 cc93cf18508d94934c64b65d8ba7667fb7cde4b0
但是,使用我的 HMACSHA1 函数,如下所示:
function HMAC_SHA1(Text, Key: AnsiString): AnsiString;
var
ipad, opad, s: AnsiString;
n: Integer;
SHA1Context: TSHA1Ctx;
begin
if Length(Key) > 64 then
Key := SHA1(Key);
ipad := StringOfChar(#$36, 64);
opad := StringOfChar(#$5C, 64);
for n := 1 to Length(Key) do
begin
ipad[n] := AnsiChar(Byte(ipad[n]) xor Byte(Key[n]));
opad[n] := AnsiChar(Byte(opad[n]) xor Byte(Key[n]));
end;
SHA1Init(SHA1Context);
SHA1Update(SHA1Context, ipad);
SHA1Update(SHA1Context, Text);
s := SHA1Final(SHA1Context);
SHA1Init(SHA1Context);
SHA1Update(SHA1Context, opad);
SHA1Update(SHA1Context, s);
Result := SHA1Final(SHA1Context);
end;
我尝试:
HMAC_SHA1('12345678901234567890', '0');
我的回答是
948d4b44f3e0aac05904d6fd82ab7b8bbe761a4c
这与下面链接的在线生成器相同
http://www.freeformatter.com/hmac-generator.html#ad-output
那么,我做错了什么?