2012-02-26 10 views
2

テスト値を指定:私はRubyで0 HMACを取得しようとした場合このRFC 4226は間違っていますか? RFCの

Appendix D - HOTP Algorithm: Test Values 

    The following test data uses the ASCII string 
    "123456789" for the secret: 

    Secret = 0x3132333435363738393031323334353637383930 

    Table 1 details for each count, the intermediate HMAC value. 

    Count Hexadecimal HMAC-SHA-1(secret, count) 
    0  cc93cf18508d94934c64b65d8ba7667fb7cde4b0 
    1  75a48a19d4cbe100644e8ac1397eea747a2d33ab 

は、だから私は得る:

[20] pry(AuthyOTP)> secret_key = "123456789" 
=> "123456789" 
[22] pry(AuthyOTP)> OpenSSL::HMAC.hexdigest(digest, secret_key, "0") 
=> "32a67f374525d32d0ce13e3db42b5b4a3f370cce" 

私はそうcc93cf18508d94934c64b65d8ba7667fb7cde4b0

を取得することが期待されました私はjavaで実装を書いたが、私は同じことを得る:

シークレットが "123456789"のとき、16進数のSHA1-HMACは "0"ですか?

答えて

5

RFC4226が正しい。

文字列をバイトと混同しています。あなたは '0'のhmac-sha1を計算すると仮定していないので、0から始まる8バイト整数のhmac-sha1を計算すると仮定します。javaの場合、hmac-sha1はbyte [] counter = {0, 0, 0, 0, 0, 0, 0, 0};

+0

あなたは正しいです....それはちょうど混乱していますが。特に、他の言語のHMAC関数はバイトではなく文字列上で動作します。 – daniel

+0

Javaプログラマとして、他の言語が文字列とバイトの違いを理解できないかどうかは気にしません。これらのアルゴリズムはすべてバイト用に定義されているため、明示的にエンコーディングを実行する方がはるかに優れています。なぜなら、とにかく標準エンコーディングが定義されていないからです。 –

+0

はい。私は、PHPのような言語が_everything_のために文字列を使用する方法を理解したことはありません – SLaks

関連する問題