• パスワードが多すぎる

Webサイトへの登録につきもののパスワード、ちょっとでも個人的な情報を登録するようなところは、ほぼ例外なくユーザー登録時にパスワードを設定しなければならない。ユーザーからすると、パスワードは増えることはあっても、減ることがない。サイトやサービスが消滅したとしても、使わない「パスワード」が増えるだけで、パスワード管理が楽になるわけでもない。一度使ったパスワードを使いまわすのはリスクであり、消滅したサイトやサービスで使ったパスワードほど漏出の危険(誰も管理してない)があり、二度と使ってはならないパスワードだともいえる。しかし、これだけサイトが増えてくると使い回しするなというのがそろそろ限界だ。せいぜい記憶できるのは10個程度、それも最低でも週に一回程度はキーボードを打たないと忘れてしまう。

そんななか、頼りになるのが、ブラウザのパスワードキャッシュだが、ブラウザが覚えているということは、PCの紛失や画面を開いたままの離席などで危険な状態になる。そして、このパスワードキャッシュ、ブラウザごとに管理されており、複数のブラウザを使えば、複数のパスワードキャッシュが存在することになる。そのほかに、GoogleやMicrosoftなどのブラウザアカウントサイト側にもコピーがある。

つまり、多数のパスワードがブラウザごとに管理され、PCごとに保存されているわけだ。場合によっては、一人のユーザーが使う複数のPC同士で、ブラウザやOSのバージョンが異なることもある。こうした場合、個々のPC、ブラウザの漏洩確率は低くても、ユーザーひとりについて見ると、その合計値となるため、ちょっと心配になる。ブラウザやオペレーティングシステムの今後のアップデートで何か問題が発生しないとも断言もできない。あるいは、消滅したサイトやサービスから、登録したパスワードが大量に流失する可能性もあるなど、年々、状況は悪化している。

パスワードの自動生成はいいのだが

ブラウザが持つパスワード自動生成機能は、パスワードの使い回しを防ぎ、ユーザーが安易に考えるよりは堅固なパスワードを設定できるというメリットがあるが、パスワードキャッシュがブラウザごとになっているため、他のブラウザでは、必要なパスワードを入力する必要があり利便性が落ちる。ブラウザは1つだけと決めれば問題ないが、さまざまな事情により、複数のブラウザを利用することがある。優先言語やセキュリティ条件を変えたブラウザを使い分ける、あるいは、サイトとブラウザの「相性」があるので別のブラウザを使う、同一サービスに対してアカウントを使い分けるといった使い方などがある。筆者は、仕事の関係で複数のブラウザを使わざるを得ないが、たとえば、Web関連の開発でも検証のため複数のブラウザを使うことがある。

考えつくのは、パスワードキャッシュをエクスポートしてマージすればいいのではないか? ということだが、そうそう簡単ではない。主要なブラウザのうち、パスワードの登録更新日時を記録しているのはFireFoxのみ。ChromeとEdgeはURL、ユーザー名、パスワードのみの管理だ。少なくとも、エクスポートしたデータには含まれない。同一のURLでパスワードのみが異なる場合、どちらが新しいのか判断がつかない。個々のURLについて調べればいいのだろうが、筆者のChromeには450件、Edgeには400件ほどのパスワードが記録されていて、このうち、どちらにも同じURLが記録されていたものは350件あった。しかしパスワードはすべて同じではなかった。どこかに記録があるなら、照合して新しいほうを決定することもできるが、1カ所1カ所、どちらのパスワードが新しいのか調べるのはかなり面倒な作業だ。間違ったパスワードによるログインを複数回繰り返すとアカウントがロックされるサイトもあり、自動化するにしてもスクリプトの開発を慎重に行う必要がある。

もう1つの問題は、ブラウザのインポート時のルールだ。どのような項目が「異なる」データとして認識されるのか、パスワードのみが異なる項目では何が優先されるのかを調べたが、一筋縄ではいかなかった。

エクスポート時に出力されるname列は、インポート時には完全に無視され、ブラウザがURLのホスト名部から再生成する。URLは同一でもユーザー名が違えば個別のものとして扱われるが、URLとユーザー名が同じ場合には後から登録したほうが残る。しかし、ユーザー名とURLのホスト名部が同じで、URLのパス部のみ異なるデータは、パスワードが同一だと、先に登録したほうが残る(表01)。つまり、URLが同一ホストでパスが異なっていても同じパスワードが使われていると先に登録したものしか残らない。ただし、ChromeとEdgeは、個別のパスワードキャッシュを作るが、インポート時の解釈ルールは同一だった。

  • ■表01

Windows PowerShellで処理

パスワードの新旧判定が困難なので、とりあえず、利用時間が長いなどを理由に、どれか1つのブラウザが管理しているパスワードを「優先」させることにした。2つのブラウザがあり、片方のブラウザを優先ブラウザとして、そのパスワードを残したい場合、非優先ブラウザからエクスポートしたパスワード情報から、URLまたはユーザー名だけが異なる項目だけを取り出して、優先ブラウザからエクスポートしたパスワード情報の「後ろ」につける必要がある。このパターンにすれば、URLのパスが違っていてパスワードが同じ項目は、優先ブラウザのほうが残ることになる。PowerQuery(Excel)の「クエリーのマージ」でも処理可能だが、今回はWindows PowerShellを使ってみる。処理は実質1行(3行目)、ファイルの読み書き(1、2、4行目)も含めて4行でできる。

$chrome = (Get-Content .\Chrome.csv | ConvertFrom-Csv);
$edge = (Get-Content .\Edge.csv | ConvertFrom-Csv);
$diff=($edge | Where-Object -FilterScript { ($chrome.url -notcontains $.url) -or ($chrome.username -notcontains $.username)});
$chrome+$diff | Export-Csv  -NoTypeInformation -Encoding UTF8 .\NewPassword.csv ;

残念ながら、現行のChromeブラウザのOfficial Build Ver.93.0.4577.63では、Chrome://flagsを利用して、パスワードのインポート機能を有効にすることができなかった。設定項目そのものがない。調べたところ、Chrome Beta(Ver.94.0.4606.31)ではインポートを有効にできたため、こちらで検証を行った。Edgeは、公式ビルドVer.93.0.961.38を利用した。バージョンによる挙動の違いも考えられるため、パスワードキャッシュの処理(特にインポート)には、事前にバックアップやテストを行うなど慎重に願いたい。残念ながら、前記のスクリプトの実行結果を含め、筆者や本サイトは、なんの責任も取れないため、ご自身のリスクで実行していただきたい。

こうした問題の解決法の1つとしては、サードパーティのパスワード管理ツールがある。しかし、現状、多数のツールが競合状態であること、ブラウザのセキュリティ機能も落ち着いているとはいえず、今後が予想しにくい。筆者が見つけただけでも10種以上のパスワード管理ツールがあり、大半が有料で評価もしにくい。たしかにパスワードキャッシュは1つになり利便性は向上するが、セキュリティリスクはブラウザのパスワードキャッシュと変わらない。

パスワードを使わないFIDO2のような方式もあり、Windows PCやAndroidはFIDO2認証器として動作できる。インフラとしては整備されたが、対応しているサイト、サービスはごく一部だ。パスワードの増殖問題は、しばらく解決しそうにない。