2023年4月21日にActiveTK.さんがツイートした「16文字以内で最強のパスワード」が、記事作成時点で1万2000件のリツイート、7万件のいいねを集めています。この「16文字以内で最強のパスワード」は果たして本当に最強のパスワードなのか、エンジニアに聞いてみました。





ActiveTK.さんがツイートした「16文字以内で最強のパスワード」が以下。

';-- :․
,"}`|@

ActiveTK.さんはパスワードについて「SQL→ ';--によるDB破壊」「CSV→
,によるファイル破壊」「コマンド→ |による構文破壊」「2byte文字や特殊文字を混在」という4つの特徴を挙げていますが、それぞれどういった意味なのか、エンジニアに聞いてみた回答が以下です。

◆1:SQL→';--によるDB破壊

関係データベース管理システムでデータの操作や定義を行うために使用されるデータベース言語のSQLでは、コマンドが「(コマンド);」と記述されます。当該パスワードには「';--」が含まれるので、「;」までがコマンドであると誤認される一方、「--」以降はコメントとして処理されるため、パスワード全体がデータに含まれなくなってしまいます。

つまり、パスワードに「';--」を含めることでシンプルなSQLインジェクション攻撃を実行できるようになります。データベースが破壊されるような状況は考えづらいものの、以下のような雑なコードならエラーで処理を停止させることが可能です。

UPDATE users SET password = ' + pass + ' WHERE id = '+ id + ';

今回のパスワードを入れると以下のようになります。

UPDATE users SET password = '';-- :․
,"}`|@' WHERE id = '+ id + ';

「--」以降がコメント文として無視されると、最終的には以下のようになります。

UPDATE users SET password = '';

◆2:CSV→
,によるファイル破壊

表計算ソフトやデータベースソフト向けのファイル形式として使用されているCSVでは、「 」がタブ文字、「
」が改行を意味します。ユーザーIDやパスワードをまとめてCSVにエクスポートするなどした場合、パスワードの「
」の部分で改行されたり、「 」の部分でタブが挿入されたりしてしまうわけです。

つまり、このパスワードが漏えいしても、パスワードを盗んだ人物がパスワードをCSV形式で保存していた場合、パスワードに勝手に改行やタブが入ってしまい、正しいパスワードが何かわからなくなってしまうというわけ。

なお、「 」は別の表計算データ向けのファイル形式であるTSVにも対応しているので、TSVでもパスワード漏えいを防いでくれる可能性があります。

◆3:コマンド→|による構文破壊

「|」はパイプ(あるコマンドの出力を別のコマンドの入力とするもの)として扱われるため、パスワードのこの部分でコマンドが強制的に切れます。

◆4:2byte文字や特殊文字を混在

このパスワードには2バイト文字(全角文字)や特殊文字が含まれているため、パスワードを解読するために総当たり攻撃を実行する場合、半角文字だけのパスワードよりも解読に時間がかかります。

ただし、「2バイト文字を考慮に入れるようなシステムは存在しないため、実質的にこのパスワードは総当たり攻撃に対して無敵」との指摘もあります。

なお、通常のシステムは2バイト文字の入力に対応していないため、JavaScriptを使ったパスワードの入力をActiveTK․さんは推奨しています。





上記の説明だけを読むと確かに「16文字以内で最強のパスワード」であるかのように思えますが、◆1〜3はいずれも適切にエスケープ処理を施していれば簡単に回避することが可能だそうです。そもそも、「◆1〜3が機能するシステムを探す方が難しい」という指摘も。

加えて、基本的にパスワードはハッシュ化した状態で保存されており、ハッカーが盗み出すのもこの「ハッシュ化されたパスワード」であるため、ハッカー側がパスワードを扱う上で◆1〜4のような効果に出くわすことはほとんどありえないとのことです。