ソルト (ソルト) とは | 意味や読み方など丁寧でわかりやすい用語解説

作成日: 更新日:

ソルト (ソルト) の読み方

日本語表記

ソルト (ソルト)

英語表記

salt (ソルト)

ソルト (ソルト) の意味や用語解説

ソルトとは、パスワードをはじめとする重要なデータをデータベースに保存する際に、そのセキュリティを強化するために付与されるランダムなデータのことである。具体的には、元のデータをハッシュ化という処理にかける前に、このランダムなデータを付け加える。この一手間により、たとえ元のデータが同じであっても、ハッシュ化された後の結果が全く異なるものになる。この仕組みは、特にパスワードの漏洩リスクを低減させる上で極めて重要な役割を果たしており、現代のシステム開発におけるセキュリティの基本要素として広く採用されている。ソルトの主な目的は、レインボーテーブル攻撃や辞書攻撃といった、パスワードを推測しようとする攻撃手法に対する耐性を高めることにある。 ソルトの役割を深く理解するためには、まず前提となるハッシュ化について知る必要がある。ハッシュ化とは、任意の長さのデータ(例えば、ユーザーが入力したパスワード)を、ハッシュ関数というアルゴリズムを用いて、固定長の不規則な文字列(ハッシュ値またはダイジェスト)に変換する処理を指す。この処理には二つの重要な特性がある。一つは、一度ハッシュ化されたハッシュ値から元のデータを復元することが極めて困難であるという不可逆性である。もう一つは、同じデータを入力すれば、常に全く同じハッシュ値が出力されるという一貫性である。この一貫性のおかげで、システムはユーザーがログイン時に入力したパスワードをハッシュ化し、データベースに保存されているハッシュ値と一致するかを比較することで、正しいパスワードか否かを安全に検証できる。しかし、この一貫性は、同時にセキュリティ上の弱点にもなり得る。 もしソルトを使わずにパスワードをそのままハッシュ化して保存した場合、二つの大きな問題が生じる。第一に、複数のユーザーが同じパスワード(例えば「password123」)を使用していると、データベースに保存されるハッシュ値も全く同じものになってしまう。これにより、万が一データベースが漏洩した場合、攻撃者は一つのハッシュ値から元のパスワードを解読できれば、同じハッシュ値を持つ他のすべてのユーザーのパスワードも同時に特定できてしまう。第二に、事前計算による攻撃に対して脆弱になる。代表的な攻撃手法としてレインボーテーブル攻撃がある。これは、よく使われるパスワードとそのハッシュ値の対応表を事前に大量に作成しておき、漏洩したハッシュ値とその表を照合することで、元のパスワードを高速に割り出す攻撃である。ソルトがない場合、同じパスワードは常に同じハッシュ値になるため、この攻撃が非常に有効となってしまう。 ここで登場するのがソルトである。ソルトは、ユーザーごと、あるいはパスワードを保存するたびに、暗号学的に安全な乱数生成器によって生成される、一意でランダムな文字列である。パスワードをハッシュ化する際には、まず元のパスワードにこのソルトを連結する。例えば、パスワードが「password123」、ソルトが「abcdefg」だった場合、「password123abcdefg」という新しい文字列を作成し、この文字列全体をハッシュ化する。これにより、たとえ他のユーザーが同じ「password123」というパスワードを使用していても、そのユーザーには異なるソルト(例えば「hijklmn」)が割り当てられるため、ハッシュ化後の結果は全く異なるものになる。この仕組みにより、前述のレインボーテーブル攻撃は事実上無力化される。攻撃者は、考えられる全てのパスワードと全てのソルトの組み合わせに対してレインボーテーブルを作成する必要があり、その計算量とデータ量は天文学的な数値となり、現実的ではなくなるからである。また、辞書攻撃や総当たり攻撃に対しても、パスワード一つを試すたびに、そのユーザー固有のソルトを取得してハッシュ値を計算し直す必要が生じるため、攻撃の効率を大幅に低下させることができる。 生成したソルトは、それを用いて生成したハッシュ値とともにデータベースに保存されるのが一般的である。ユーザーがログインする際には、まずユーザーIDを基にデータベースからソルトとハッシュ値を取得する。次に、入力されたパスワードにそのソルトを連結してハッシュ化し、その結果がデータベースに保存されているハッシュ値と一致するかどうかを比較して認証を行う。ソルト自体は秘密情報として扱う必要はなく、ハッシュ値と一緒に保存されていても問題はない。なぜなら、ソルトの目的はハッシュ値の一意性を保証し、事前計算攻撃を防ぐことであり、ソルトが攻撃者に知られても、攻撃の計算コストを劇的に下げることには繋がらないからである。ただし、ソルトを実装する際にはいくつかの要件がある。ソルトは十分にランダムで、予測不可能でなければならない。また、全てのユーザーで同じソルトを使い回すのではなく、ユーザーごと、あるいはパスワードごとに必ず一意のソルトを生成する必要がある。ソルトの長さも重要であり、一般的に16バイト(128ビット)以上の長さが推奨されている。 さらにセキュリティを強固にするために、ソルトはストレッチング(キー引き伸ばし)という技術と組み合わせて利用されることが多い。ストレッチングとは、ハッシュ計算を意図的に数千回から数百万回といった多数の回数繰り返すことで、一つのハッシュ値を生成するために必要な計算時間を人為的に長くする手法である。通常のログイン認証では、この追加の計算時間はユーザー体験にほとんど影響を与えないミリ秒単位の遅延で済む。しかし、攻撃者が総当たり攻撃を試みる場合、一つ一つのパスワード候補を検証するためにこの長い計算時間が必要となるため、攻撃全体の所要時間が飛躍的に増大し、攻撃を非常に困難にする。Argon2、scrypt、bcrypt、PBKDF2といった現代的なパスワードハッシュ関数は、このソルトとストレッチングの仕組みを内部に組み込んでおり、これらの標準的なアルゴリズムを利用することが、安全なパスワード管理を実装する上でのベストプラクティスとされている。 結論として、ソルトはパスワードのハッシュ化プロセスにランダム性を加えることで、同じパスワードから生成されるハッシュ値がユーザーごとに異なるようにするための重要な技術である。これにより、レインボーテーブル攻撃のような事前計算に基づく攻撃を効果的に防ぎ、データベースが漏洩した際のリスクを大幅に軽減する。システムエンジニアを目指す者にとって、ソルトの概念と、それをストレッチングなどの技術と組み合わせて適切に実装することの重要性を理解することは、安全なシステムを構築するための基礎知識として不可欠である。

ソルト (ソルト) とは | 意味や読み方など丁寧でわかりやすい用語解説