ソルトは日本語に訳すと「塩」ですが、本記事ではITのセキュリティ関連で使われるソルトについて説明します。 ソルトはハッシュ化をする際に利用される不規則な文字列です。ハッシュ化は、元のデータから不規則な固定長文字列を生成する仕組みですが、同じデータを入れると必ず同じハッシュ値になるという特徴がありました。 パスワード情報などをハッシュ値で持つことで、安全にパスワード情報を保存することができることをハッシュ化の記事で説明しましたが、今回のソルトを利用することでさらに安全にパスワード情報を保存することができます。

ソルトとは

1年以内に更新されました。
更新日 : 2019年08月07日

ソルトは日本語に訳すと「塩」ですが、本記事ではITのセキュリティ関連で使われるソルトについて説明します。

ソルトはハッシュ化をする際に利用される不規則な文字列です。ハッシュ化は、元のデータから不規則な固定長文字列を生成する仕組みですが、同じデータを入れると必ず同じハッシュ値になるという特徴がありました。

パスワード情報などをハッシュ値で持つことで、安全にパスワード情報を保存することができることをハッシュ化の記事で説明しましたが、今回のソルトを利用することでさらに安全にパスワード情報を保存することができます。

ソルトとは

ソルトはハッシュ化をする際に利用される不規則な文字列と説明しましたが、これだけではイメージがわかないので、具体例を使って説明していきます。

パスワード情報を保存する場合を例として考えてみる

ユーザー情報のパスワードをハッシュ化して保存すれば、ハッシュ値からパスワードを算出することはできないため、比較的安全にパスワード情報を保存することができます。

しかし、同じデータを入れた場合は必ず同じハッシュ値になるため、簡単なパスワードやよく使われるパスワードだと、生のパスワードとそのハッシュ値をリストとして持っておけば簡単に見破られてしまいます。(これをハッシュテーブルと言ったりします)

ソルトがない場合のハッシュ値

例えば、あるユーザーのパスワードが「password」だったとしましょう。これは現在でも多様される残念なパスワードです。。

この「password」をSHA256というハッシュ化の仕組みでハッシュ化すると、「5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8」となります。

これをパスワード情報として保存しておきますが、悪い人は、この「password」のハッシュ値は「5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8」となるという情報をリスト化しています。(ハッシュテーブル)他にも簡単に予測できるパスワードはたくさんあるでしょう。

このようなリストを持っている人からすると、データベースなどに保存されているパスワードのハッシュ値が流出してしまった場合には、簡単に元のパスワードが予測できてしまいます。

このようなことがないようにするのがソルトです。

ソルトがある場合のハッシュ値

ここではソルトを「abc」とでもしておきましょう。

ソルトはハッシュ化する際に元の文字列の前後にくっつけておくための文字列です。

ソルトがある状態でパスワード情報をハッシュ化します。先程のユーザーのパスワード「password」はハッシュ化する際に「passwordabc」というように、ソルトを付与してからハッシュ化します。

すると「passwordabc」のハッシュ値は「6733b7ffeace4887c3b31258079c780d8db3018db9cbc05c500df3521f968df8」このようになります。

ハッシュ化の特徴通りに、少し元のデータが異なるだけで全く違うハッシュ値になります。

このハッシュ値をデータベースなどに保存しておきます。万が一データベースの情報流出が起きたとしても、「password」のハッシュ値は知っていても「passwordabc」のハッシュ値はわからない可能性が高いです。

ユーザーの認証を行う際にも、ユーザーは「password」と入力すると、認証を行うアプリケーションで先ほどと同様に「passwordabc」としてからハッシュ化すればデータベースに保存されているハッシュ値と比較することができます。

このようにハッシュ化する前にソルト情報を付与してまとめてハッシュ化することで、ハッシュ値のリストがあったとしても全く違うハッシュ値を保存しているためさらに安全性が増します。

もちろんソルト値が外部に流出するとソルトを付与したハッシュ値リストができてしまうため、ソルトはシステムやシステム管理者だけが知っておく必要があります。

ソルト自体も本来はもっと不規則な文字列でなければいけません。