2016-08-17 3 views
1

HOTPを使用して数値ワンタイムパスワードを作成できることを理解します。ビーイングの後ろのアルゴリズムは:HOTPを使用したアルファニューメリックOTPの生成

Kは秘密鍵
カウンタ
HMAC(K、C)= SHA1(K⊕0x5c5c ...∥SHA1(K⊕0x3636 ...∥C))とををC⊕XORなどであります、∥連結ように、数学的に

によって定義さ

切り捨ては、定義されたよう

そしてHOTP(K、C)にHMACの結果から4つのバイトを選択する関数である(Cはメッセージです)

HOTP(K、 C)=切り捨て(HMAC(K、C))& 0x7FFFFFFFで

私は私のテストのために、次の例の実装を使用している、それが正常に動作します:

https://svn.forgerock.org/openam/tags/10.0.0-docs/products/amserver/source/com/sun/identity/authentication/modules/hotp/HOTPAlgorithm.java

私の質問は、それはそれが可能です数値の代わりにHOTPを使用して英数字のOTPを生成します。利点は明らかに、OTPの強さが所与の長さに対して多くの倍数を増加させるということである。したがって、8桁の英数字コードは8桁の数字コードよりもはるかにストリンガーです。

おかげで、もちろん Abhi

答えて

1

、あなたはHMAC(K、C)の後に、あなたがやりたいことができます。それをHEXまたは英数字にマップすることができます。

しかし、ハードウェアトークンまたはスマートフォンアプリのいずれかで独自のOTPトークンを作成する必要があります。 これは標準に関する素晴らしいことです。自分で作成する必要はありません。 ;-)

+0

ありがとうcornelinux、それができることを知って良かった。どうすればいいか分かりますか?私のSHA1は20バイトの値(-127から127)を返します。英数字の値にするにはどうすればよいですか? – user1826116

+0

まず、使用したい文字を決めてください。したがって、おそらく(26 + 26 +10 = 56の可能な文字)のリストが得られます。次に、1バイトを文字にマップする必要があります... – cornelinux

+0

OK、256の可能なバイトの組み合わせをHMACから62の可能な文字セットにマップする必要があります。つまり、私の256バイトセットからの4バイトは、62バイトの出力セットからの1バイトに対応します。これは簡単に行うことができますが、これではHOTPのセキュリティ/強度がそれほど低下しないと思いますか? – user1826116

0

英数字は2つ以上の文字を使用できる場合は、基数64を使用できます(+/を好きな値に置き換えてください)。

それ以外の場合は、Java用のthis oneなどのBase Nエンコードライブラリを参照してください(試していない、正確さや性能についてコメントできません)。

生成されたHOTPビットと指定された表現の間に1対1の関係があるため、これはセキュリティに影響しません。言い換えれば、異なるベース表現とアルファベットは同じビット値で異なるビューです。

関連する問題