今回はLinuxの「/etc/shadow」ファイル及びハッシュ関数について説明しようと思います。
まず「/etc/shadow」ファイルとは各ユーザーのパスワードが暗号化されて記載されているファイルになります。
その他にもパスワードの有効期限や変更日時が記載してあります。
「/etc/shadow」ファイルはrootユーザーにしか内容を読み取ることができません。試しに「/etc/shadow」ファイル内容を見てみます。
上記画像では記載情報が多く、見づらいですので「grep」コマンドを使用して「test」ユーザーの情報を取り出してみます。
これで「test」ユーザーの情報を取り出すことができました。各番号が何のパラメータなのかを下記に示します。
①ユーザー名
②暗号化されたパスワード
③パスワード最終変更日
④パスワード変更可能最短期間
⑤パスワード未変更可能最長期間
⑥⑤等に対する警告日(何日前に警告するのか)
⑦ログインしないとアカウント無効になる日数
⑧アカウント失効までの日数
⑨フラグ(未使用)
②の羅列されている文字列は暗号化されているログインパスワードになります。
この暗号化に使用されているのが「ハッシュ関数」と呼ばれるものになります。
ハッシュ関数とは入力された引数に対して一定のルールで計算を行い、ハッシュ値と呼ばれる規定された桁数の文字列を出力する関数になります。
出力結果は複雑で規則性の見えない文字列になっていますが、入力される引数が同じ場合、同じ出力結果になるという特徴が有ります。
Linuxコマンドの中にはハッシュ関数の計算を行うために使用されるコマンドが有ります。
下記にそのコマンド例を示します。
◎md5sum・・・md5形式にてハッシュ値を出力するコマンド
◎sha256sum・・・sha256形式にてハッシュ値を出力するコマンド
◎sha512sum・・・sha512形式にてハッシュ値を出力するコマンド
上記コマンドのmd5形式、sha256形式、sha512形式というのはそれぞれハッシュ値を出力する際の計算方法や出力桁数等が異なっています。なので、引数が同じでも形式が異なれば出力されるハッシュ値が異なるので、使用する際は形式を合わせる必要が有ります。
上記コマンド内の「md5sum」コマンドを仮想環境にて試しに使用してみようと思います。
引数を「Hello」と指定し、「md5sum」コマンドを実行してみます。下記画像が実行結果です。
ここで「Hello1」と引数を少し変えて、「md5sum」コマンドを実行してみると、全く異なる出力結果が得られます。
このようにハッシュ関数は少しでも引数の内容が異なっていると、出力結果が全く異なる文字列になります。つまり、出力結果から入力引数の予測を立てることが困難になるということなので、暗号化として使用されています。
ハッシュ関数はファイルのハッシュ値も計算することができ、暗号化以外にも使い方があります。ちなみにファイルのハッシュ値はファイル内容によって異なります。
例えばAさんがBさんへ「txt」というファイルを共有したい時、Aさんは「txt」ファイルを共有のストレージへアップロードし、Bさんには「txt」ファイルのハッシュ値を伝えます。
Bさんは共有のストレージから「txt」ファイルをダウンロードし、Aさんと同様に「txt」ファイルのハッシュ値を計算します。
そして、Aさんから教えられたハッシュ値と自分で計算したハッシュ値が同じかどうかを確認することでAさんがアップロードしたファイルであると証明できます。
ハッシュ値が異なった場合はファイル内容が異なるので、ファイルを開かないよう注意が必要です。(内容不明であり、ウイルスの可能性もあります)
このようにハッシュ関数はファイルの整合性チェックのためにも使用されています。
今回はLinuxのパスワード関連で重要となる「etc/shadow」ファイル及びハッシュ関数について説明させていただきました。
参考資料
・[Ubuntu] /etc/shadow 調べてみた - Qiita
・ひつまぶし食べたい: /etc/shadowについて勉強してみた (hitsumabushi-pc.blogspot.com)