パスワード、パスフレーズ、秘密鍵、アクセストークン、二段階認証、ワンタイムパスワードの違い

理解が曖昧だったところもあったので調べた。

パスワード(Password)

言わずもがな、本人認証の常套手段。

パスフレーズ(Pass-phrase)

パスワードの一種で 「フレーズ(わかりやすい言葉)を組み合わせた」「長い」パスワード のこと。

いくつか例を挙げる。

  • 例1: yahariorenoseisyunrabukomehamatigatteiru
    • お気に入りのフレーズモロ
    • 「やはり俺の青春ラブコメはまちがっている」
  • 例2: K1ll_tw0_b1rds_w1th_0ne_st0ne
    • お気に入りのフレーズ + 換字
    • 「一石二鳥の英語 Kill two birds with one stone」
    • iを1に、oを0に、スペースを_に置換
  • 例3: vim-atom-sublime-emacs-eclipse-vscode
    • 好きな単語を並べて区切った(ここではテキストエディタやIDEの名前)

パスフレーズが生まれた背景

  • パスワードの設定は正直面倒くさい
  • でも短めにしてるとセキュリティ上危うい(クラックされる)
  • 強力なパスワードを考えるのは面倒くさいし、覚えるのも大変
  • 何か良い方法はない? → 覚えやすいフレーズを並べて長くするのはどう?

パスフレーズの特徴

  • 長いのでクラックされない(スパコンでも解読できない)
  • フレーズなので覚えやすい
  • 長いけどフレーズなので打ちやすい

パスフレーズの問題点

  • システムによっては文字数制限にひっかかって設定できない
    • 例: 「半角英数8文字以内」
  • フレーズの作り方を工夫しないとパターン(傾向や特徴)が出てしまい、クラックされてしまう
    • 例: 固有名詞やことわざを片っ端から総当たりすれば上記例1は解読される
  • (パソコンはともかく)スマホからは打ちづらい
  • そもそもタイピングに習熟してない人にとっては(入力に時間がかかるので)辛い

秘密鍵(アクセストークン)

プログラマやエンジニアにはお馴染みだが、平たく言うと「自分と相手のみが知っているおまじない」のこと。

  • クライアントは事前にシステムにログインし、秘密鍵を登録しておく
  • クライアントは秘密鍵(アクセストークン)を持っている
  • クライアントはログイン時、システムに秘密鍵を提示する
  • システムは提示された秘密鍵を調べ、正しいものであるか調べる
  • 正しくない → お前誰やねん
  • 正しい → ようこそ。ログインを許す。

普通にログインする際は使わず、スクリプトからシステムの機能を利用する(REST APIを叩くなど)といった用途で使う。たとえば REST API を叩く際に、リクエストヘッダにアクセストークンを付与しておくと、システム側でそれをチェックできる。

パスワードと違う点は、ID が必要ないことと、文字列がべらぼうに長くて複雑(数十から数百文字の英数字列)であること。

※この辺りの話は奥が深く、厳密には秘密鍵=アクセストークンではないが、ここではわかりやすさのためイコールにしている。

二段階認証

パスワード入力 +αで何かを入力させて認証させる方式。+αとして「ケータイに送信されたセキュリティコードを更に入力させる」やり方が多い。

GoogleDropbox を始め、主要なサービスは大体実装している。

Q: 二段階認証はなぜ必要?

パスワードは第三者に漏れたらおしまいだが、二段階認証があればおしまいにならない。たとえ第三者に漏れたとしても、そいつは続くセキュリティコードを知る術がない(コードは本人のケータイに送信される)ため先に進めない。

また、本人は「ログインしてないのになんでセキュリティコードが来てんの?誰か不正ログインしたやろ?」と気付けるメリットもある。

Q: でもいちいちコード打つのは面倒じゃない?

煩わしさを省くため、一度二段階認証した端末については以降のコード入力を省くようになっている。それでも他の端末からログインした場合はコード入力が発生するため、セキュリティは担保される。

ワンタイムパスワード

主に銀行で使われてる方式で、その場限り(ワンタイム)のパスワードを専用の装置やアプリによって生成し、それを使ってログインするというもの。ログイン後、そのパスワードは無効になるため、仮に漏れたとしても問題はない。

メリットとして「パスワードを覚える必要がない」ことが挙げられる。ユーザーは装置やアプリ上でボタンを押すだけで良い。それで表示されたパスワードを打てばいい。

もちろんその専用装置・アプリが第三者の手に渡ってしまうと意味がないので、紛失しないよう管理が必要。

Q: その場限りでパスワード作る?そんなのどうやって実現するの?

専門的な話になるが、 「認証」の基礎知識(7):ワンタイムパスワードの方式 – せぐなべ あたりで端的にまとまっている。

平たく言うと、ユーザー側が持ってる「ワンタイムパスワードを生成する装置 or アプリ」の生成アルゴリズムがシステム側でも保持されているので、システム側は「受け取ったパスワード」を復元して「ちゃんと正規の手順で作成したパスワードだよね?」がわかる。

参考

(おまけ) マジックリンク

初耳だったのでついでに紹介。

ログイン時に ID を入力すると自分のメアドに「ここに書いた URL にアクセスしてね。そしたらログインできるよ」というメールが送られ、そのとおりに URL にアクセスするとログインできる……という認証方法。

チャットツール Slack で導入されている。手順としては、ログイン画面に「マジックリンクを送信」ボタンがあり、これをクリックするだけという感じ。