1password2john
は、有名なパスワード解析ツール John the Ripper (JtR) スイートに含まれるスクリプトの一つです。このツールの主な目的は、パスワード管理ツール 1Password の保管庫(Vault)ファイルから、マスターパスワードを解析するために必要な「ハッシュ」と呼ばれるデータを抽出することです。抽出されたハッシュデータは、John the Ripper 本体に入力することで、マスターパスワードの特定を試みることができます。
このブログ記事では、1password2john
の基本的な使い方、対応している1Passwordのデータフォーマット、そして John the Ripper を使った実際の解析プロセスについて、詳しく解説していきます。パスワードを忘れてしまった場合の回復や、自身のパスワード強度のテストなど、正当な目的での利用を前提としています。
事前準備 ⚙️
1password2john
を使用するには、以下のものが必要です。
-
John the Ripper (JtR) のインストール:
1password2john
は JtR の一部として配布されています。JtR をインストールする必要があります。多くの Linux ディストリビューションでは、パッケージマネージャー(例:apt
,yum
,pacman
)を通じてインストールできます。あるいは、John the Ripper 公式サイトからソースコードをダウンロードし、コンパイルすることも可能です。「bleeding-jumbo」バージョン(開発版)には、より多くのフォーマットやツールが含まれているため、こちらを利用することが推奨される場合もあります。# Debian/Ubuntu の場合 sudo apt update sudo apt install john # ソースからビルドする場合 (例) git clone https://github.com/openwall/john.git cd john/src ./configure && make -s clean && make -sj4 # 実行ファイルは ../run/ ディレクトリに生成されます
1password2john.py
スクリプトは通常、John the Ripper のrun
ディレクトリ内にあります。 -
1Password 保管庫ファイル:
解析対象の 1Password 保管庫ファイルが必要です。これには主に二つの形式があります。
- Agile Keychain (.agilekeychain): 古い形式で、通常は
.agilekeychain
という拡張子を持つディレクトリ(フォルダ)です。中には1Password.html
やdata/default/
といったファイルやフォルダが含まれています。 - OPVault (.opvault): より新しい形式で、こちらも通常は
.opvault
という拡張子を持つディレクトリです。Agile Keychain よりもセキュリティが強化されています。 - SQLite データベース (.sqlite): macOS 版の 1Password 4 や 1Password 6 など、一部のバージョンでは、保管庫データを
.sqlite
形式のデータベースファイルに保存しています。通常、~/Library/Application Support/1Password 4/Data/OnePassword.sqlite
のようなパスにあります。1password2john
はこの形式にも対応しています。
- Agile Keychain (.agilekeychain): 古い形式で、通常は
-
Python 環境:
1password2john.py
は Python スクリプトです。実行には Python 2.7 または Python 3 が必要になる場合があります。依存関係として特定のライブラリが必要になることもあります。
繰り返しになりますが、これらの保管庫ファイルへのアクセスは、正当な権限を持っていることが大前提です。
基本的な使い方:ハッシュの抽出
1password2john
の基本的なコマンド構文は非常にシンプルです。
python /path/to/1password2john.py /path/to/your/vault
または、John the Ripper の run ディレクトリにいる場合は、
./1password2john.py /path/to/your/vault
ここで、/path/to/1password2john.py
はスクリプトへの実際のパス、/path/to/your/vault
は解析したい 1Password 保管庫ファイル(.agilekeychain
ディレクトリ、.opvault
ディレクトリ、または OnePassword.sqlite
ファイル)へのパスに置き換えてください。
実行例
Agile Keychain フォーマットの場合:
./1password2john.py /Users/Username/Dropbox/1Password.agilekeychain
OPVault フォーマットの場合:
./1password2john.py /Users/Username/Library/CloudStorage/Dropbox/1Password.opvault
SQLite フォーマット (macOS 1Password 4/6) の場合:
./1password2john.py "/Users/Username/Library/Application Support/1Password 4/Data/OnePassword.sqlite"
パスにスペースが含まれる場合は、パス全体を引用符("
)で囲むことを忘れないでください。
出力:ハッシュデータ
コマンドが成功すると、標準出力にハッシュデータが表示されます。これは John the Ripper が理解できる形式になっています。出力形式は、元の保管庫のフォーマットによって異なります。
Agile Keychain の出力例(一部):
1Password.agilekeychain:$agilekeychain$*1*1000*288*[長い16進文字列]*1040*[長い16進文字列]
OPVault (Cloud Keychain) の出力例(一部):
1Password.opvault/default:$cloudkeychain$*1*650000*173*[長い16進文字列]
SQLite の出力例(一部):
OnePassword.sqlite:$1password$6*af3123...*100000*aes-256-cbc*9e4a...*a8d4...*509c...
これらの出力は、通常、ファイル名(または識別子)と、$
で区切られたハッシュ情報で構成されています。$agilekeychain$
, $cloudkeychain$
, $1password$6
といった部分は、John the Ripper がハッシュの種類を識別するためのマーカーです。
この出力されたハッシュデータを、テキストファイル(例: 1pass_hash.txt
)に保存します。John the Ripper はこのファイルを入力として使用します。
./1password2john.py /path/to/your/vault > 1pass_hash.txt
これで、マスターパスワード解析の準備が整いました。🔓
John the Ripper での解析実行
1password2john
でハッシュを抽出したら、いよいよ John the Ripper 本体を使ってマスターパスワードの解析を試みます。JtR は様々な攻撃モードを持っていますが、ここでは代表的なものを紹介します。
基本的なコマンド
最も基本的な実行方法は、抽出したハッシュファイルを JtR に渡すだけです。JtR はデフォルトのモード(シングルクラックモード、辞書モード、インクリメンタルモードを組み合わせたもの)で解析を開始します。
john 1pass_hash.txt
または、John the Ripper の run
ディレクトリから実行する場合:
../run/john 1pass_hash.txt
JtR は自動的にハッシュの形式を検出し(例: agilekeychain
, cloudkeychain
, 1password6
)、適切な解析処理を開始します。解析には時間がかかることがあります。
辞書攻撃モード (Wordlist Mode)
特定の単語リスト(辞書ファイル)を使用してパスワードを試すモードです。一般的な単語や、過去に漏洩したパスワードのリストなどを使うことが多いです。--wordlist
オプションで辞書ファイルを指定します。
john --wordlist=/path/to/password.lst 1pass_hash.txt
/path/to/password.lst
は使用する辞書ファイルのパスに置き換えてください。有名な辞書ファイルとして rockyou.txt
などがあります。
さらに、--rules
オプションを使って、辞書内の単語に特定の変換ルール(大文字小文字変換、数字や記号の付加など)を適用することもできます。これにより、より複雑なパスワードパターンを試すことができます。
john --wordlist=/path/to/password.lst --rules=All 1pass_hash.txt
インクリメンタルモード (Incremental Mode)
指定された文字セット(例: すべての小文字アルファベット、数字を含むすべての印刷可能文字など)を使って、可能なすべての組み合わせを総当たりで試すモードです。単純なパスワードには有効ですが、パスワードが長くなると天文学的な時間がかかります。--incremental
オプションで指定します。
john --incremental=Alnum 1pass_hash.txt
Alnum
は英数字を表す定義済みの文字セットです。他にも Digits
(数字のみ), Alpha
(英字のみ), All
(すべての印刷可能 ASCII 文字) などがあります。john.conf
ファイルでカスタム文字セットを定義することも可能です。
マスクモード (Mask Mode)
パスワードの構造がある程度わかっている場合に有効なモードです。例えば、「大文字1文字 + 小文字5文字 + 数字2桁」のようなパターンを指定して、そのパターンに合致する候補のみを試します。--mask
オプションを使用します。
# 例: "Password" + 4桁の数字 のようなパターン
john --mask='Password?d?d?d?d' 1pass_hash.txt
?d
は数字1桁、?l
は小文字1文字、?u
は大文字1文字などを表します。詳細は JtR のドキュメントを参照してください。
解析結果の表示
パスワードが見つかると、JtR はその結果をターミナルに表示し、john.pot
というファイル(pot ファイル)に記録します。解析を中断して再開した場合や、後で結果を確認したい場合は、--show
オプションを使用します。
john --show 1pass_hash.txt
これにより、既に見つかっているパスワードが表示されます。
もし “No password hashes left to crack” と表示されたら、現在の設定ではパスワードが見つからなかったか、すでに見つかって pot ファイルに記録されていることを意味します。
対応フォーマットについて 📄
1password2john
は、1Password のいくつかの主要な保管庫フォーマットからハッシュを抽出できます。
-
Agile Keychain (.agilekeychain):
- 2008年に導入された比較的古いフォーマットです。
- 実体はディレクトリ(フォルダ)で、中に
data/default/encryptionKeys.js
や1Password.html
といったファイルが含まれます。 1password2john
は主にencryptionKeys.js
ファイルを解析してハッシュ情報を抽出します。- 暗号化には PBKDF2-SHA1 と AES-128 CBC が使われています。
- 2015年頃、一部のメタデータ(アイテム名やURLなど)が暗号化されずに保存されているという問題点が指摘されました。
-
OPVault (.opvault):
- 2012年12月以降に導入された、Agile Keychain を置き換える新しいフォーマットです。「Cloud Keychain」とも呼ばれていました。
- こちらも実体はディレクトリで、中に
default/profile.js
といったファイルが含まれます。 - Agile Keychain の問題点を改善し、メタデータを含むより多くの情報が暗号化されるようになりました。
- Dropbox や iCloud での同期時のデフォルトフォーマットとして採用されました。
- 暗号化には PBKDF2-SHA512 と AES-256 GCM など、より強力なアルゴリズムが使用されています。
1password2john
は主にprofile.js
ファイルを解析します。
-
SQLite Database (.sqlite):
- 1Password 4 や 1Password 6 for macOS などで、ローカル保管庫のデータ保存に使用される形式です。
- 通常、
~/Library/Application Support/1Password 4/Data/OnePassword.sqlite
という名前のファイルです。 1password2john
はこの SQLite ファイル内のprofiles
テーブルからハッシュ関連情報(マスターキーデータ、ソルト、イテレーション回数など)を抽出します。- ただし、このテーブルが存在するのは「ローカル保管庫」オプションが有効になっている場合に限られることがあります。1Password.com アカウントのみを使用している場合は、このファイルが存在しないか、空である可能性があります。
- 暗号化方式はバージョンによって異なる可能性がありますが、PBKDF2 や AES が利用されています。
注意点として、1Password は継続的にアップデートされており、新しいバージョン(特に 1Password 7 や 1Password 8 以降、および 1Password.com アカウント中心の運用)では、データ保存形式や暗号化の仕組みが変更されている可能性があります。1password2john
が最新のフォーマットや、特定のプラットフォーム(例: iOS バックアップ)のデータ形式に完全に対応しているとは限りません。最新の John the Ripper (bleeding-jumbo) を使用するか、必要に応じてスクリプトの更新や代替ツール(例: Hashcat 用のハッシュ抽出スクリプト)の利用を検討する必要があります。
重要な考慮事項 🤔
1password2john
および John the Ripper を使用する際には、以下の点を十分に理解しておく必要があります。
- 合法性と倫理 🚫: 最も重要な点です。これらのツールは、自分が所有するデータ、または明示的な許可を得たデータに対してのみ使用してください。他人のアカウントやデータに対して無断で使用することは、多くの国や地域で違法行為であり、プライバシーの侵害にあたります。技術的な興味や学習目的であっても、必ず自身の管理下にあるデータを使用するか、許可されたペネトレーションテストの範囲内で実施してください。
-
解析にかかる時間とリソース ⏳:
マスターパスワードの解析(クラッキング)には、非常に長い時間と計算リソース(CPUパワー、場合によってはGPUパワー)が必要になることがあります。解析時間は以下の要因に大きく依存します。
- マスターパスワードの強度: 長く、複雑で、ランダムなパスワードほど解析は困難になります。単純な単語や短いパスワードは比較的短時間で見つかる可能性がありますが、強力なパスワードは現代のコンピューターを使っても現実的な時間内には解析できない場合が多いです。
- ハッシュの計算コスト: 1Password では、総当たり攻撃を防ぐために PBKDF2 のような鍵導出関数を使用しており、意図的にハッシュ計算に時間がかかるように設計されています。特にイテレーション(反復)回数が多いほど、1回のパスワード試行にかかる時間が増加します。OPVault や SQLite 形式では、より多くのイテレーション回数が設定されている傾向があります。
- ハードウェア性能: 高性能な CPU や GPU を使用すると、単位時間あたりにより多くのパスワードを試行できるため、解析速度は向上します。John the Ripper はマルチコア CPU や OpenMP に対応しており、一部のフォーマットでは GPU (OpenCL や CUDA) を利用した高速化も可能です。
- 攻撃手法: 辞書攻撃が成功するかどうかは辞書の質に依存します。インクリメンタルモードやマスクモードは、パスワードのパターンによっては効率的ですが、候補空間が広すぎると現実的ではありません。
- セキュリティへの影響 🛡️: このツールは、本来、パスワードを忘れた場合の回復支援や、組織内でのパスワード強度監査(弱いパスワードを使用しているユーザーがいないかのチェック)などの正当な目的で利用されます。しかし、悪意のある第三者が保管庫ファイルを入手した場合、同様の手法でマスターパスワードを解析しようとする可能性があります。このことからも、1Password のマスターパスワードには、他のサービスで使い回していない、十分に長く複雑な独自のパスワードを設定することが極めて重要です。また、保管庫ファイル自体の保護(ディスク暗号化、アクセス制御など)も重要となります。
-
ツールの限界:
前述の通り、
1password2john
や John the Ripper が全ての 1Password のバージョンやフォーマット、特に最新のものに常に対応しているとは限りません。また、パスワード自体が非常に強力であれば、解析は成功しません。
これらのツールは強力ですが、その使用には責任が伴います。技術的な側面だけでなく、法的・倫理的な側面も常に念頭に置いて利用してください。
トラブルシューティングとヒント 💡
1password2john
や John the Ripper の使用中に問題が発生した場合の一般的な対処法やヒントをいくつか紹介します。
-
Python のバージョンと依存関係:
1password2john.py
がうまく動作しない場合、Python のバージョンが原因である可能性があります。スクリプトによっては Python 2.7 が必要だったり、逆に Python 3 が必要だったりします。また、特定の Python ライブラリ(例: SQLite 関連ライブラリ)が必要になる場合もあります。エラーメッセージを確認し、必要な環境を整えてください。 -
ファイルパスの問題:
保管庫ファイルへのパスにスペースや特殊文字が含まれている場合、パス全体を引用符(
"
)で囲む必要があります。また、相対パスではなく絶対パスで指定すると問題が解決することもあります。 - 権限の問題: 保管庫ファイルや JtR の実行ファイル、作業ディレクトリに対する読み取り・書き込み権限が適切に設定されているか確認してください。
-
フォーマット非対応:
使用している 1Password のバージョンや保管庫の形式が、インストールされている
1password2john
でサポートされていない可能性があります。John the Ripper の bleeding-jumbo バージョンを試すか、GitHub などで最新のスクリプトを探してみてください。エラーメッセージに “No password hashes loaded” と表示される場合は、ハッシュの抽出に失敗しているか、ハッシュ形式を JtR が認識できていない可能性があります。--format
オプションで明示的にフォーマットを指定してみるのも一つの手です(例:--format=agilekeychain
)。 -
John the Ripper の設定 (john.conf):
john.conf
(またはjohn.ini
) ファイルには、文字セットの定義、ルールの設定、その他の動作オプションが含まれています。高度な使い方をする場合は、このファイルの内容を理解し、必要に応じてカスタマイズすることが役立ちます。 -
パフォーマンスの最適化:
マルチコア CPU を搭載している場合、JtR は自動的に複数のスレッドを使用しますが、
--fork=N
オプションでプロセス数を指定したり、環境変数OMP_NUM_THREADS
で OpenMP のスレッド数を調整したりすることで、パフォーマンスを最適化できる場合があります。GPU を利用する場合は、対応する JtR フォーマットと適切なドライバ、設定が必要です。 -
Pot ファイルの確認:
パスワードが見つかっているはずなのに表示されない場合は、
john.pot
ファイルの中身を確認してみてください。ここにクラック済みのハッシュとパスワードのペアが保存されています。 - コミュニティとドキュメント: John the Ripper には活発なメーリングリスト (john-users) や GitHub リポジトリがあります。問題が解決しない場合は、過去の議論を検索したり、質問したりすると良いでしょう。公式ドキュメントや Wiki も参照してください。
まとめ 🏁
1password2john
は、1Password の保管庫ファイルからマスターパスワードのハッシュを抽出し、John the Ripper による解析を可能にするための重要なツールです。Agile Keychain、OPVault、特定の SQLite フォーマットに対応しており、適切な手順を踏めば、パスワード回復やセキュリティ評価に役立てることができます。
ハッシュ抽出後は、John the Ripper の多様な攻撃モード(辞書攻撃、インクリメンタル攻撃、マスク攻撃など)を利用して、実際のマスターパスワードの特定を試みます。ただし、解析にはパスワードの強度や計算リソースに応じて非常に長い時間がかかる可能性があることを理解しておく必要があります。
最も重要なのは、これらのツールを合法かつ倫理的に使用することです。許可なく他者のデータにアクセスしたり、解析したりする行為は絶対に避けてください。
1Password のマスターパスワードは、あなたの大切な情報を守る最後の砦です。常に強力でユニークなパスワードを設定し、保管庫ファイル自体の安全確保にも注意を払いましょう。 💪🔐
参考情報
- John the Ripper official website: https://www.openwall.com/john/
- John the Ripper Community Wiki (GitHub): https://github.com/openwall/john/wiki
- 1Password Support – OPVault design: https://support.1password.com/opvault-design/
- 1Password Support – Agile Keychain design (older format info): https://support.1password.com/agile-keychain-design/
コメント