3

OAuth 1.0aを使用し、署名にHMAC-SHA1を必要とするサードパーティのサービスを使用しようとしています。私はC#で動作するバージョンを作成し、それをDelphiXE2に移行しようとしました。私はすぐに何かがおかしいことに気づきました。サーバーは私の「署名が無効です」と言って私の呼び出しを拒否していました。これは、署名を生成するための私の方法です。

function TOAuth1.GenerateSignature(signatureBase, key : string) : string;
var
  hmacSha1 : TIdHMACSHA1;
  keyBytes, textBytes, hashedBytes : TBytes;
begin
  if(AnsiCompareText(fSignMethod,'PLAINTEXT') = 0) then
  begin
    Result := key;
  end
  else if(AnsiCompareText(fSignMethod,'HMAC-SHA1') = 0) then
  begin
    hmacSha1 := TIdHMACSHA1.Create;
    SetLength(keyBytes,Length(key));
    Move(key[1],keyBytes[0],Length(key));
    hmacSha1.Key := keyBytes;
    SetLength(textBytes,Length(signatureBase));
    Move(signatureBase[1],textBytes[0],Length(signatureBase));
    hashedBytes := hmacSha1.HashValue(textBytes);
    Result := EncodeBase64(hashedBytes,Length(hashedBytes));
    keyBytes := nil;
    textBytes := nil;
    hashedBytes := nil;

    hmacSha1.Free;
    hmacSha1 := nil;
  end;
end;

自分にとって間違っていると思われるものを見つけることができなかったので、C#テストからsignatureBaseとを取得しましたkey

署名ベース:POST&https%3A%2F%2Fapi.twitter.com%2Foauth%2Frequest_token&oauth_callback%3Dhttp%253A%252F%252Flocalhost%252Fsign-in-with-twitter%252F%26oauth_consumer_key%3DcChZNFj6T5R0TigYB9yd1w%26oauth_nonce%3Dea9ec8429b68d6b77cd5600adbbb0456%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1318467427%26oauth_version%3D1.0

鍵:L8qq9PZyRg6ieKGEKhZolGC0vJWLw8iEJ88DRdyOg&

これらの値をC#で使用すると、署名が与えられましたF1Li3tvehgcraF8DMJ7OyxO4w9Y=。これは、Twitterが私に与えた期待値でした。しかし、Delphiでは、私は署名を与えられました/kov410nJhE6PTlk0R8bjP7JQq4=

Delphiでは、次のように関数を呼び出しました。

  signature := self.GenerateSignature('POST&https%3A%2F%2Fapi.twitter.com%2Foauth%2Frequest_token&oauth_callback%3Dhttp%253A%252F%252Flocalhost%252Fsign-in-with-twitter%252F%26oauth_consumer_key%3DcChZNFj6T5R0TigYB9yd1w%26oauth_nonce%3Dea9ec8429b68d6b77cd5600adbbb0456%26oauth_signature_method'+'%3DHMAC-SHA1%26oauth_timestamp%3D1318467427%26oauth_version%3D1.0','L8qq9PZyRg6ieKGEKhZolGC0vJWLw8iEJ88DRdyOg&');
  assert(AnsiCompareStr(signature,'F1Li3tvehgcraF8DMJ7OyxO4w9Y=') = 0,'Signature generated is invalid');

だから私の質問はこれです:私はHMAC-SHA1を間違って使用していますか?もしそうなら、それを修正するためにどのような手順を踏む必要がありますか?そうでない場合、IndyでのHMAC-SHA1の実装は正しく行われていませんか?もしそうなら、それを正しく処理できる使いやすい(できれば無料の)ユニットはありますか?それとも、ここでまったく間違っていることがありますか?

4

1 に答える 1

6

一般的な Unicode 文字列の誤解のように見えます。Delphi 2009 以降、 UTF-16 でエンコードされた にstringマップされ、 にはマップさUnicodeStringれなくなりましたAnsiString。そう、

Move(key[1],keyBytes[0],Length(key));

おそらく、1文字あたり2バイトの文字列の前半のみをコピーします。UTF8Encode最初にキーを UTF8 に変換し、それを keyBytes にコピーするために使用します。

于 2012-09-18T20:10:07.383 に答える