はじめに

今回私は解析用のPCをつくり、暗号化されたファイルがどの程度安全であるのかを検証した。

注意

この記事はパスワードの安全性と長さの関連を調査しています。
不正にパスワードを入手することは不正アクセス禁止法により禁止されています。

ハッシュ値とは

「ハッシュ関数」と呼ばれるものにデータをわたすとそのデータに応じた値を返します。その値がハッシュ値です。
データからハッシュ値を求めることは容易ですが、
ハッシュ値からデータを求めることは非常に困難です。 (不可逆的)
このハッシュ値を利用することによってパスワードを安全に保管できます。

hashcatでハッシュ値解析をする

今回ハッシュ値解析にはhashcatを用いた。 hashcatはハッシュ値の解析にGPUを使用することができるため、高速にハッシュ値を解析できる。
検証に用いたPCの性能は以下である。

CPU GPU OS
intel Core i5-12400F Processor 18M Cache, up to 4.40GHz GeForce GTX 1650 Ubuntu 20.04

また以下のハッシュ値解析を検証した。

ファイルの種類 パスワードの長さ maskの有無
PDF(wordファイルをpdfにエクスポート) 6桁 数字4桁+小文字2文字
PDF(Texのオプションにパスワードを付けた) 6桁 無し
PDF(Texのオプションにパスワードを付けた) 7桁 無し
Word 6桁 無し

解析してみる

環境構築

まずhashcatを入れる。

sudo apt install hashcat

次にhashcatを動かすために対応するGPUのドライバを入れる。
https://www.nvidia.co.jp/Download/index.aspx?lang=jp

入れ終わったらちゃんと動くか確認...

hashcat -I

ちゃんとGPUが読み込まれていることが確認できた!

パスワード付きのファイルを用意

texで作ったファイルにパスワードを付ける

ターミナルで

$ dvipdfmx -S 暗号化するファイル.dvi

今回は読み込みパスワードだけをつけたいのでowner passwordは無しにした。

wordファイルにパスワードを付ける

「名前を付けて保存する」から「ツール」を選択し「全般オプション」にてパスワードを設定し、保存する。

パスワード付きのwordファイルをpdfに変換

ファイルからエクスポートを選択し「PDF/XPSドキュメントの作成」を選ぶ。

ハッシュ値を抽出する

今回はJohn the ripper を使った。
https://github.com/openwell/john
基本的にはdocの中にあるINSTALL-UBUNTUの指示通りにインストールしていく。
一応aptコマンドでインストール出来るがハッシュ値を抽出したい場合はgithubからのインストールを推奨。

pdfからハッシュ値を抽出

john/run/pdf2john.pl を実行する。

$ john/run/pdf2john.pl ハッシュ値を抽出したいpdfファイル > hash.txt

officeからハッシュ値を抽出

john/run/office2john.py を実行する。

$ john/run/office2john.py ハッシュ値を抽出したいofficeファイル > hash.txt

hashcatで解析する

詳しい使い方は

$ hashcat --help

を参照。

hash-typeを調べる

hashcatでハッシュ値解析をする場合事前にhash-typeを指定する必要がある。hash-typeがどれか分からないときは以下を実行するとhash-typeがわかる

$ hashcat hash.txt

今回はtexのハッシュタイプを調べた。

10400または10410であることが分かった。

解析開始

基本的にはブルートフォースアタックで解析していく。

$ hashcat -m 10400 -a 3 hash.txt ?d?d?d?d?l?l

今回はパスワードが数字4桁+小文字2文字であることが分かっていると想定してmask指定をして解析した。

2秒で終わっちゃった笑

パスワードが9732gfであることが分かった。

今度は同じパスワードをmask無しで解析してみた。

記録は...7秒!

John the ripper でハッシュ値解析

先ほどはGPUを並列処理にまわしたためすぐに解析出来ました。では今度はVirtual Boxを用いて意図的にスペックの低い環境でハッシュ値解析をしてみましょう。
性能はこんな感じ

メモリは4GB,プロセッサーは2つ
環境構築は省略
さっそく解析してみた。

マスクありだと解析時間が短すぎて比較にならなかったのでマスクなしで解析した。 記録は...5分29秒!
まぁ現実的な数値ですね。
いかにこのパスワードが脆弱であるかが分かりましたね。

性能比較

1秒にチェックできるハッシュ値の数を比較してみましょう。

仮想環境では

メイン環境では

大雑把に見積もっても約100倍のスピードでハッシュ値解析をしていることが分かった。
hashcat...恐るべし

まとめ

以下に各ファイル形式におけるパスワードの解析時間をまとめる。
なお以下で想定するパスワードは印字可能なアスキーコードであるとする。

ファイル形式 hash-type 桁数 解析にかかる時間
PDF(tex) 10400 5桁 30秒
PDF(tex) 10400 6桁 2852秒
PDF(tex) 10400 7桁 75時間
PDF(tex) 10400 8桁 297日
PDF(office) 10500 5桁 1112秒
PDF(office) 10500 6桁 29時間
PDF(office) 10500 7桁 116日
PDF(office) 10500 8桁 30年
word 9600 5桁 18日
word 9600 6桁 4.8年

皆さんもこれを参考に安全なパスワードを設定しましょう。