- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用旧版本的 Delphi(Delphi 5)进行编写,原因我无法在该线程中解释。我正在尝试实现 HOTP,目前我的所有代码都缺少 HMACSHA1 部分,我不明白为什么。我按照 RFC 2202 实现了 HMACSHA,并将我的结果与许多其他 HMACSHA1 生成器进行了比较。所有这些都匹配。
然后,我开始为 HOTP 实现 RFC 4226,并惊讶地发现,与他们在 RFC ( https://www.ietf.org/rfc/rfc4226.txt ) 底部提供的示例数据相比,我的中间 HMACSHA1 结果是错误的。
这是来自 RFC 的测试向量
The following test data uses the ASCII string "12345678901234567890" for the secret:
Secret = 0x3132333435363738393031323334353637383930
Table 1 details for each count, the intermediate HMAC value.
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
那么,我做错了什么?
最佳答案
至少有一个问题 - 您正在检查 > block 大小 (64) 的键,但您还必须检查短于 block 大小 (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));
注意 - 使用字节数组效果更好
关于Delphi HMAC-SHA1 意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22338236/
我是一名优秀的程序员,十分优秀!