ぱろっと・すたじお

技術メモなどをまったりと / my site : http://parrot-studio.com/

例えば、パスワードを避ける

今回も長いメモ書きなのですが・・・

最近、パスワードに関する議論*1が多かったわけですが、
もっと根本的にどうにかならないのかな・・・と思いまして

自分でそう思ったというか、せんせー*2Tweetを見ていて、
「もう一つ上のレイヤーで考えないといけないんだな・・・」と気づいたというか

つまり、こういうことなのかなとΣ(・ω・ノ)ノ

考察の前提

この手の考察はいくらでも発散するので、大前提として、
「不特定多数に公開されたWebシステムにログインする場合」に限定します

「パスワード」の限界

極論ではありますが、「文字列のみで照合する」という仕組みである以上、
どうやったって「いつかは」突破されるわけです

そもそも、「辞書に載ってない文字列」というのは、
「人が覚えるのに適していない文字列」なので、面倒ですよね(´-ω-)

「認証」が満たすべき要件

私自身、実験的に「合い言葉(=マルチバイト文字列)認証」のシステムを作ったことがあります


下書きをひっそりと共有するサイト「紙片」を公開しました - ぱろっと・すたじお

この問題点を今改めて考えてみると、
「意味的な表現とバイナリ表現が一致するとは限らない」ってことで

つまり、「UTF-8で"ああああ"」くらいであれば、
ほとんどのブラウザで一致するはずです

しかし、絵文字のような最近定義された文字列を使われた場合とか、
そもそも日本語がまともに実装されてないブラウザ*3の場合、
そこは保証できません(´-ω-)

一方、ASCIIの範囲であれば、たいていのシステムでコードが一致するため、
「意味とバイナリ」が1対1で対応するはずです
そういった利点もあったのかな・・・と

なにより、こういった「自身が設定した"何か"による認証」は、
「それを記憶しておかなければならない」というコストが常に存在するわけです

つまり、「何も覚えてなくていい」状態が理想なのではと

デバイスの依存性と二段階認証

「覚える情報を減らす仕組み」として、
現時点で最適な回答としては「パスワードマネージャー」でしょう
実際、私も"ほぼ"移行しています

パスワードマネージャーの問題はシンプルで、
「パスワードマネージャーが使えない環境では結局手打ち」ということです

例えば、Twitterのパスワードをソフトウェア的に管理していたとしても、
Androidのクライアントアプリにログインするときは、
キーボード入力しないといけません

その辺の解決策として、iOS8版1Passwordは良くできていると思います

それでも、「アプリ側が仕組みに対応していないと使えない」*4だけでなく、
そもそも「iOS8以上のデバイスでしか使えない仕組み」であり、
Androidはもちろん、私のiPad miniはiOS7なので、iOS系なのに使えないわけです(´-ω-)


「パスワードを使い回したとしても、一定の効果がある手段」として、
最近では「OTPトークンによる認証」や「二段階認証」が存在します

OTPトークンはオンラインRPGのログインでもよく使われていますが、
1分ごとにアルゴリズムで値が変更されるため、
たとえある時点での値が漏れても、ログインは相当難しくなります

欠点はシンプルで、「OTPトークンがない限りログイン不可」ということです

スマフォにOTPトークンアプリを入れることである程度リスクを軽減はできますが、
OSのアップデートで動かなくなるとかよくあるので、
たいていは物理的トークンの方が楽、という結論に至ります(´・ω・`)

やはり、現時点で妥当なのは「二段階認証」でしょう。

GoogleやMSにログインする場合、IDとパスワードが正しくても、
送られてくるSMSやメールに書かれたコードがなければ、
最終的なログインはできません

OTPトークン方式を実装しているROでも、
トークンを設定してない場合、「電話による認証」が行われます

ログインすると「あちら」から電話がかかってきて、
コードが「音声で」読み上げられるので、
それを「Web画面に」入力するわけです

冷静に考えると、この方式はかなり「楽」で、
OTPトークンと電話、どちらを忘れる確率が高いかは自明ですし、
「OSのアップデートで電話ができない」ってことはまずないはずです*5

デメリットは、「(一時的とはいえ)電話番号を渡す」という心理的障壁と、
あと導入側の料金的コスト*6が、おそらくOTPより高いという点でしょうか

そして、あまりないことかもしれませんが、
「電話がない場合はどうしようもない」という問題もあります

とはいえ、最近は「スマフォでインターネット」が一般化しており、
「ネット環境はあるけど電話番号がない」というケースはだいぶ減っています

ですが、格安SIMでのSMS機能はまだまだ「オプション」扱いであり、
全くないとも言い切れません(´-ω-)

「パスワードの代わり」を「ユーザが選択する」

「年に一度ログインするかわからないレベルのサイト」で、
私が実際にやっていることなのですが、
「あえてめちゃくちゃなパスワードを登録し、ログインの都度リセットする」という手段があります

つまり、パスワードを覚えることを放棄しているわけですが、
冷静に考えれば、これは二段階認証の二段階目と同じようなものであり、
ならば「二段階目のみ」にはできないものでしょうか?

どうせGoogleでもMSでも、ログインしたブラウザでCookieが生きている限り、
再度の(二段階)認証を要求してこないわけですし、
「自分が設定したパスワード(のようなもの)」は必要なのでしょうか(´・ω・)?

・・・ということを先日の朝考えていたら、
夕方にこのようなものが流れてきました


Passwordless - A node.js/express module for token-based logins

Passwords are broken. Inspired by Justin Balthrop's article Passwords are Obsolete token-based one-time password (OTPW) authentication is faster to deploy, better for your users, and more secure.

https://passwordless.net/


この仕組みのポイントは、認証コードの送り先を任意に選択できる、というところです

Flexible

Deliver your tokens via email, text messages (SMS), or smoke signs. You can embed Sendgrid, emailjs, Twilio, or any other framework you like to get the token to your user.

https://passwordless.net/

つまり、この仕組みを使えば、実装によっては
「ユーザがコードの受け取り先を選択する」ということが可能になります

つまり、「今日は電話を忘れちゃったけど、メールなら使える」という場合に、
メールでコードを送ってもらう、ということが可能になりそうです(`・ω・´)

このフレームワークはnode.jsによるものですが、
同じ仕組みは他の言語でも可能なはずで、
今後こういった仕組みがどんどん出てくるかもしれません

問題点は・・・?

論理的に考えると、「パスワードを捨てる」というのは妥当に見えます

一方で、「パスワードで認証する」というのは「当たり前」であり、
「説明がいらない」という利点もあります

都度メールでコードが送られてくるのは「面倒」なので、
まだパスワードを入れる方が楽だし、もっといえばIDだけでログインできてもいい

こういう層には響きません(´・ω・`)

実際、初期のLINEでは、
パスワードの存在そのものを認識してないユーザが多数いたようです


「LINEのパスワードを忘れた」「ログインできない」が急増している理由とその対策 | LINEの仕組み

特に、最近のスマフォゲーでは、「ユーザ登録が不要」なのが常識*7であり、
「端末移行するための簡易パスワード」くらいなので、
「ログインしている」という認識は薄いと思われます

もちろん、「アプリとWebサイトでは違う」のですが、
今は「Webサイトがあってもアプリからアクセスする」のが一般化しており、
果たして「面倒な仕組み」が受け入れられるのか・・・というのは問題かと

このあたりは「時代の流れ」で決まるもので、
「それが当たり前」になるまでには時間がかかるわけですが、
今ですら、「二段階認証」の存在を認識してないユーザが多いわけですしね・・・

他にも、「仕組み的な穴」もまだあるはずで、
このあたりの議論を進めてもらえると、
「目指すべき方向性」が見えるのかな・・・と思います*8

おまけ:「Digits」に対する疑問点

そして今日、Twitterが新しい認証の仕組みを発表しました


Twitter、モバイルアプリ向け新SDK「Fabric」発表 パスワード不要の次世代認証「Digits」リリース - ITmedia ニュース


電話番号確認方式のユーザ認証をTwitterがデベロッパサービス(一種のAPIスイート)Digitsとして提供 - TechCrunch

これが「ログインのたびに都度電話番号を入れる仕組み」ならパーフェクトだったのですが、
ざっと読んだ限りではLINEと同じような仕組みであり、
「電話番号が変わったらどうするのか?」とか、同じ問題を抱えているようにも見えます

電話帳をUPして結びつける機能もあるようなので、
「以前その番号を使っていた人の知り合いがレコメンドされる」・・・という、
LINEで発生していた問題もあるのではないかと

このあたりは情報がもっと出てこないとなんとも言えないのですが、
さすがにTwitterならそこはクリアできている、
あるいはしてくれると思ってます(`・ω・´)

追記

書き終わってからこのような記事を見つけました


Windows 10はセキュリティキー不要の2段階認証機能搭載に - ITmedia ニュース

まだ詳細はわかりませんが、認証の安全性と利便性を、
どうにかして両立させたいんだな・・・という感じはします

ついでに、Googleの取り組みも(´・ω・)っ


Google、USB使った2段階認証サービスを提供 - ITmedia エンタープライズ

こっちは特定のデバイスが必要という意味でOTPトークンに近いですね
おそらく企業向けを想定しているのかもしれません

*1: ・・・か、どうかについては個々で判断していただいて・・・

*2: と、私が表記する場合は、この分野におけるラスボスである「あのお方」でございます

*3: 現状ほとんどないとは思いますが、今後ありえそうなのは例えばIoT系デバイスの簡易ブラウザとか

*4: これは時間が解決しますが

*5: おっと、アップデートで通信ができなくなった某OSの話はそこまでだ( ゚Д゚)y─~~

*6: 参考までに、Twilioの料金体系 http://twilio.kddi-web.com/price/

*7: 実際、私も「特定サービスへのユーザ登録を要求するゲーム」はその時点で(内容に興味があっても)蹴ってます

*8: 「筋の良い方々」の思考リソースは、こういう方面に使ってほしいのですよ・・・(´・ω・`)