【问题标题】:Delphi HMAC-SHA1 unexpected resultsDelphi HMAC-SHA1 意外结果
【发布时间】:2014-03-12 08:58:53
【问题描述】:

由于我无法在此线程中解释的原因,我正在使用旧版本的 Delphi (Delphi 5) 编写代码。我正在尝试实现一个 HOTP,目前我的所有代码都没有 HMACSHA1 部分,我不明白为什么。我根据 RFC 2202 实现了 HMACSHA,并将我的结果与许多其他 HMACSHA1 生成器进行了比较。所有这些都匹配。

然后我开始为 HOTP 实施 RFC 4226,并惊讶地发现,与他们在 RFC (https://www.ietf.org/rfc/rfc4226.txt) 底部提供的示例数据相比,我的中间 HMACSHA1 结果是错误的。

这是来自 RFC 的测试向量

以下测试数据使用ASCII字符串 “12345678901234567890”的秘密:

秘密 = 0x3132333435363738393031323334353637383930

表 1 详细说明每个计数,中间 HMAC 值。

Count Hexadecimal HMAC-SHA-1(secret, count)

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

那么,我做错了什么?

【问题讨论】:

  • 您链接到的论文使用的是计数,而不是键。尝试传入 0,而不是 '0'。
  • 不是问题,但你想要一个字节数组而不是字符串

标签: delphi rfc rfc-4226


【解决方案1】:

至少有一个问题 - 您正在检查键 > blocksize (64),但您还必须检查比 blocksize (64) 更短的键,这些键需要右填充零。

上面的代码中有这样的内容...

//current check if > length
if Length(Key) > 64 then
    Key := SHA1(Key);

//also check < length
if Length(Key) < 64 then
   Key := Key + StringOfChar(#0, 64 - Length(Key));

注意 - 使用字节数组会更好

【讨论】:

    猜你喜欢
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 2019-12-20
    相关资源
    最近更新 更多