見出し画像

No288 乱数表とワンタイムパスワード

前回のキーレスエントリーの話でチャレンジ&レスポンスの解説をしました。その中で「実際のクルマではチャレンジ&レスポンスの応用版であるワンタイムパスワードを使う」ということを書きました。

ここまで書くと「じゃあ、ワンタイムパスワードって何だよ」と気になる方も多いかと思いますので、今回はその考え方について解説をします。


1. パスワードとワンタイムパスワードは違うもの

ワンタイムパスワードというのは、文字通り、一回しか使えないパスワードです。一度使ったパスワードは使用済となり、二度と使えません。

一度しか同じパスワードが使えませんから、仮に盗聴などによりパスワードを入手しても使いものにならないわけですから、かなり安全な方式と言えます。

そんなに良いものなら今のパスワードなんてやめてしまえば良さそうなものですが、そうはいきません。

ワンタイムパスワードは通常のパスワードの代用品ではありません。
通常のパスワードといっしょに使うことで、より安全性を高めるための仕掛けと言えます。

両者は次のように違うものです。

パスワード
 ・利用者自身が設定する。
 ・「(利用者の)知識」を確認する。
 ・変更しない限り永続的に使える

ワンタイムパスワード
 ・サービス事業者側が設定する
 ・「(パスワード一覧などの)所持」を確認する。
 ・一度しか使えない。

2. 乱数表


いきなり話が変わりますが、乱数表というものをご存知でしょうか?
今は中学校の数学でも習うそうですが、筆者の時はありませんでした。(筆者の記憶力を考えるとイマイチ怪しいですが...)

要はアルファベットや数字をランダムに並べた表です。といっても出現頻度は同じになるようにキチンと計算されたもので、完全なランダム値というわけではありません。

この乱数表というものは、第二次世界大戦までの暗号化通信ではよく使われた技法でした。

当時は暗号化に使う鍵をいかに秘匿するかが重要なポイントでした。暗号化をする時には「乱数表の何番目の値を使って暗号化したか」がわかるようにしておき、復号する(暗号を解く)側は同じ乱数表で値を見つけてから復号していました。

こうすれば、鍵情報を秘密にできますから、安全な通信が行えるというわけです。

乱数表を使った暗号通信では、同じ鍵を何度も使わない方法(例えば日付を元に乱数表から値を拾うなど)で同じ鍵の重複利用を避けていました。

ワンタイムパスワードも同じパスワードを何度も使わないようにして、パスワードが盗まれても大丈夫だという発想ですので、乱数表もワンタイムパスワードも考えのベースは同じです。

ただし、乱数表には大きな問題がありました。

 1)暗号化する側と復号する側が同じ乱数表を持っていなければならない
 2)乱数表は敵にバレるとアウトなので毎月のように改訂が必要。
 3)盗まれないための管理が大変

「味方の間で鍵は共有しているが、敵には知られていない」という状況を実現するのは大変だったようです。

現在では、鍵交換という仕組みが発明され、鍵を盗まれずに安全に交換する手法があります。鍵交換について興味のある方は以下のバックナンバーをご参照ください。

 No180 暗号化で使われる鍵交換の秘密(2020年10月配信)
 https://note.com/egao_it/n/n14e0736f939a

3. 初期のワンタイムパスワード




ワンタイムパスワードの一番初歩的な仕組みは、乱数表を相手に渡しておく方法です。

実際、筆者も初期の(2000年頃だと思います)オンラインバンキングでこの技法を使ったサービスを使っていました。

サービス申込みをすると、先方から送られてくる案内書類に「パスワード表」が入っています。このパスワード表は小さな表形式の紙で、縦と横にExcelのような列名(A~G)と行名(1~7)が付いており、各セルには2ケタの文字が書いてあります。

このサービスの利用時には最初にIDとパスワード(一般的なパスワード)が求められます。それがOKとなると、画面上にはセル番号(B3やF2)が表示されるので、パスワード表からのそのセルに書いてある値を入力します。
この値が合っていれば無事ログインができるわけです。これは上述の乱数表と全く同じです。

もう少し後になると、このパスワード表がワンタイムパスワード方式になりました。
 
ワンタイムパスワード方式では、パスワード表ではなく、パスワードが100個とかずらーっと並んだパスワード一覧になります。
使い方は簡単です。最初にIDとパスワード(一般的なパスワード)を入力します。それがOKの場合は、ワンタイムパスワードの入力が求められます。
ここで、パスワード一覧を見て、初回ログイン時なら1つ目のワンタイムパスワード、2回目は2つ目の、その次は3つ目を入力します。
それが正しければ、ログインができるというわけです。

ここまで読んで「あれ?これって二要素認証と同じ?」と思った方もおられると思います。まさにその通りで、この時代のワンタイムパスワードというのは多要素認証(二要素認証)の原形だと思います。

ですが、この初期型ワンタイムパスワードは乱数表と同じで運用が非常に面倒でした。

パスワード一覧を紛失したり、全てのワンタイムパスワードを使い切るとサービスが利用できなくなります。
外出時にパスワード一覧が手元にないとサービスが利用できません。
肌身はなさず、パスワード一覧を持ち歩くというのはかなり不便です。

また、ワンタイムパスワードは一度しか有効ではありませんから、次回ログイン時に使えるワンタイムパスワードがどれかは利用者自身で管理しないといけません。

4. 次世代のワンタイムパスワード

さすがに初期のワンタイムパスワードは不便だったため、普及には至りませんでした。

次に出てきたのは、ワンタイムパスワード専用の小さな機器でした。ワンタイムパスワードトークンなどと呼ばれるものです。

これはキーホルダーに留められるくらいの小さなデバイスでボタンと数桁の文字が表示できる液晶ディスプレイが付いていました。

ボタンを押すと次に使えるワンタイムパスワードが表示されるので、それを入力すれば認証が得られる仕組みです。
パスワード一覧よりははるかに持ち歩きやすくなりましたので、この方式は今も入室管理などに使われています。

この機器(トークン)には小さなコンピュータが入っています。
トークンには数百桁程度の巨大な数値が鍵情報として格納されています。この値はトークンごとに異なります。
また、今までにボタンを押した回数(使用回数)も内部に持っています。
そして、ボタンが押されると、この2つの値を使ってワンタイムパスワードを計算する仕組みです。

ワンタイムパスワードを受け付ける機器側も同じ鍵情報と使用回数から同じ手順で計算を行います。

そして、両者の答えが一致していれば認証OKと判断するわけです。

5. キーレスエントリーでの工夫


前回解説したクルマのキーレスエントリーは上述のワンタイムパスワードをもう一ひねりした形で利用しています。

まず、キーレスエントリーでは生成したパスワードを表示したりはせず、直接クルマに対してその値を通信で送り込みます。

クルマの側も同じ計算を行って送られてきた値を比較して結果が一致していればロック解除するわけです。

しかし、ここで困った問題が起きます。

クルマのキーでも、トークンでもボタンを押すという行為によって使用回数を増やしていきます。
ですが、ポケットの中やカバンの中にトークンを入れていると、クルマと遠く離れた場所で間違ってボタンが押されてしまう場合があります。
キーやトークン側はクルマが近くにいるかどうか判断できませんから、使用回数を増やしてしまいます。

ですが、クルマ側はそんな事情知りませんから、クルマ側が認識している使用回数とキーやトークン側の使用回数に食い違いが生じます。

クルマとトークンで回数認識が違っていれば、計算の結果得られるパスワードが一致しません。
一致しなければ、ログインもロック解除も失敗してしまいます。
これでは使いものになりません。

このようなトラブルを防ぐため、実際のシステムではちょっとした工夫をしています。

認証する側(ログインサーバやクルマ)は通常通りの計算結果とトークン側の結果が違っている場合は「ひょっとして利用回数の認識がズレているのでは?」と考え、次回分の計算をして再比較を行います。それでもダメならさらに次の回と、複数回分のパスワードでの比較を行うのです。
この再計算処理はパスワードの食い違いに対する救済措置のようなものです。

実際に何回分を求めるのかはシステムによってまちまちですが、10回くらいトライするものが多いようです。なお、再計算も含めてミリ秒単位の話ですので、再計算によって反応が遅くなったりするわけではありません。

6. まとめ


現代の暗号化通信では鍵交換というシステムを使って、安全に鍵のやりとりが行えるようになっています。

その仕組みがない時代には同じ乱数表を送信と受信の双方で使う方式が一般的でした。

その考え方の応用としてワンタイムパスワード方式というものがあります。

これは、秘密情報と使用回数の2つを使って毎回異なるパスワードを求める方式です。
ここでも前回と同様にパスワードの生成にはハッシュ関数というものを使います。

ハッシュ関数にご興味のある方は以下のバックナンバーをどうぞ。
 No183 暗号っぽいけど暗号じゃないハッシュ関数ってナニ?
 https://note.com/egao_it/n/neb859006c961

キーレスエントリーやワンタイムパスワードトークンではボタンの押し間違いなどによって、クルマ側が思っている利用回数(キーロック解除回数やログイン回数)とキー側の回数がズレてしまうことがあります。

こういった場合は利便性を考え、認証する側(ログインサーバやクルマ)は何回か先のパスワードまで計算をし、そこでパスワードが合致するようであればOKとする仕組みが組み込まれています。

この工夫によって、認証エラーの発生を抑えつつ、安全性を確保しているわけです。

今回はワンタイムパスワード方式について解説をしました。
次回もお楽しみに。

(本稿は 2022年12月に作成しました)

この記事が気に入ったらサポートをしてみませんか?