サイトアイコン プログラマー(PG)・システムエンジニア(SE)になるための入門講座

【初心者向け】ソルトとは?パスワードを安全に保存する仕組みをやさしく解説

【初心者向け】ソルトとは?パスワードを安全に保存する仕組みをやさしく解説

IT業務でパスワード管理について学ぶと、ソルトという言葉を目にすることがあります。

「ソルトは何のために使うの?」
「ハッシュ化だけではだめなの?」
「ソルトは秘密にする必要があるの?」

このような疑問を持つIT業務初心者の方は少なくありません。

ソルトとは、パスワードをハッシュ化するときに追加するランダムな値です。

同じパスワードを使っている利用者でも、異なるソルトを使うことで、保存されるハッシュ値を別のものにできます。


  1. ソルトとは?
  2. ソルトを身近な例で考えてみよう
  3. なぜソルトが必要なの?
  4. ソルトが防ぐ主な攻撃
  5. レインボーテーブルとは?
  6. ソルトは秘密にする必要がある?
  7. ログイン時はソルトをどう使う?
  8. ソルトの作り方
  9. 固定ソルトが危険な理由
  10. ソルトの長さはどのくらい必要?
  11. ソルトだけでパスワードは安全になる?
  12. パスワード保存用の方式とは?
  13. ソルトとペッパーの違い
  14. ソルトと暗号鍵の違い
  15. ソルトとハッシュの関係
  16. 同じパスワードでもハッシュ値が変わる例
  17. パスワードを変更したときはどうする?
  18. 実際のIT業務ではどこで使われる?
    1. Webサービスのログイン機能
    2. 社内システムの認証
    3. スマートフォンアプリ
    4. クラウドサービス
    5. フレームワークの認証機能
  19. ソルトを自分で実装する必要はある?
  20. 保存される文字列にソルトが含まれる場合もある
  21. ソルトを使うときの注意点
    1. 利用者ごとに異なるソルトを使う
    2. 安全な乱数生成機能を使う
    3. 十分な長さを確保する
    4. SHA-256を1回だけ実行しない
    5. 独自方式を作らない
    6. ハッシュ値やソルトにもアクセス制御を設定する
  22. よくある質問
    1. ソルトは塩という意味ですか?
    2. ソルトはパスワードと一緒に保存してよいですか?
    3. ソルトが漏れたらパスワードを復元されますか?
    4. ソルトは毎回変える必要がありますか?
    5. ユーザー名をソルトとして使えますか?
    6. ソルトがあれば短いパスワードでも安全ですか?
    7. ペッパーだけ使えばソルトは不要ですか?
    8. パスワード以外のデータにもソルトを使いますか?
  23. IT業務初心者が覚えておきたいポイント
  24. 関連して覚えておきたい用語
  25. まとめ

ソルトとは?

ソルトは、パスワードをハッシュ化する前に追加するランダムな文字列やデータです。

パスワード
+
ソルト
  ↓
ハッシュ化
  ↓
保存用のハッシュ値

例えば、利用者が次のパスワードを設定したとします。

password123

このパスワードへランダムなソルトを加えてから、パスワード保存用の方式でハッシュ化します。

password123
+
ランダムなソルト
  ↓
ハッシュ化
  ↓
ハッシュ値

データベースには、一般的にハッシュ値とソルトを保存します。


ソルトを身近な例で考えてみよう

ソルトは、同じ材料で作る料理へ、一人ずつ異なる調味料を加えるイメージです。

元の材料が同じでも、加える調味料が違えば、完成したものは異なります。

パスワードでも同じように、元のパスワードが同じでも、ソルトが異なれば別のハッシュ値になります。


なぜソルトが必要なの?

ソルトを使わずにパスワードをハッシュ化すると、同じパスワードからは同じハッシュ値が作られます。

利用者A
password123
  ↓
ハッシュ値X

利用者B
password123
  ↓
ハッシュ値X

この状態では、データベースを見た人に、利用者Aと利用者Bが同じパスワードを使っていることが分かってしまいます。

ソルトを利用すると、同じパスワードでも異なるハッシュ値になります。

利用者A
password123
+ ソルトA
  ↓
ハッシュ値A

利用者B
password123
+ ソルトB
  ↓
ハッシュ値B

これにより、同じパスワードを使っている利用者をハッシュ値だけで見分けにくくできます。


ソルトが防ぐ主な攻撃

ソルトは、主に次のような攻撃を難しくするために利用されます。


レインボーテーブルとは?

レインボーテーブルとは、よく使われるパスワードと、そのハッシュ値を事前に大量計算してまとめたデータです。

例えば、攻撃者が次のような一覧を持っているとします。

パスワード候補 ハッシュ値
password ハッシュ値A
password123 ハッシュ値B
12345678 ハッシュ値C

流出したデータベース内のハッシュ値と照合すると、元のパスワードを推測される可能性があります。

ソルトを利用すると、利用者ごとに異なるハッシュ値になるため、事前計算した一覧をそのまま使いにくくできます。


ソルトは秘密にする必要がある?

ソルトは、通常、秘密情報として扱う必要はありません。

一般的には、パスワードのハッシュ値と一緒にデータベースへ保存します。

ユーザーID
ソルト
パスワードのハッシュ値

ソルトの目的は、秘密にすることではなく、利用者ごとにハッシュ計算を異なるものにすることです。

ただし、ソルトが公開されても安全であるためには、適切なパスワード保存方式と十分な長さのランダムなソルトを使用する必要があります。


ログイン時はソルトをどう使う?

ログイン時には、保存済みのソルトを取り出し、利用者が入力したパスワードと組み合わせて再計算します。

  1. 利用者がパスワードを入力する
  2. データベースからその利用者のソルトを取得する
  3. 入力されたパスワードとソルトを組み合わせる
  4. パスワード保存用の方式で計算する
  5. 保存済みのハッシュ値と比較する
  6. 一致すればログインを許可する
入力パスワード
+
保存済みソルト
  ↓
ハッシュ化
  ↓
保存済みハッシュ値と比較

元のパスワードをデータベースから取り出して確認するわけではありません。


ソルトの作り方

ソルトは、予測しにくいランダムな値として作成します。

利用者ごと、またはパスワードごとに異なるソルトを生成することが重要です。

一般的には、暗号学的に安全な乱数生成機能を利用します。

例えば、次のような値です。

8f2d91a0c7b34e6f...

人が考えた文字列や、ユーザー名、メールアドレス、登録日時などをそのままソルトとして使うのは適切ではありません。


固定ソルトが危険な理由

すべての利用者へ同じソルトを使う方法を、固定ソルトと呼ぶことがあります。

全利用者共通ソルト
company-system-2026

固定ソルトを使うと、同じパスワードから同じハッシュ値が作られます。

また、ソルトが判明すれば、攻撃者がその値を使って事前計算できるため、利用者ごとに異なるソルトを使う効果が失われます。

ソルトは、利用者ごとにランダムな値を生成するのが基本です。


ソルトの長さはどのくらい必要?

ソルトは、十分な長さのランダムな値を使用します。

短すぎるソルトでは、同じ値が偶然使われたり、すべての候補を試されたりする可能性が高くなります。

具体的な長さは、使用するパスワード保存ライブラリや方式の推奨値に従います。

独自に長さや生成方法を決めるよりも、Argon2やbcryptなどの標準的なライブラリへソルト生成を任せる方法が安全です。


ソルトだけでパスワードは安全になる?

いいえ。ソルトを追加するだけでは、十分なパスワード保護にはなりません。

例えば、次の方法は適切ではありません。

パスワード
+
ソルト
  ↓
SHA-256を1回だけ実行

SHA-256は高速に計算できるため、攻撃者が大量のパスワード候補を短時間で試せる可能性があります。

パスワード保存では、ソルトと組み合わせて、次のような専用方式を利用します。


パスワード保存用の方式とは?

パスワード保存用の方式は、意図的に計算へ時間やメモリを使うように設計されています。

これにより、攻撃者が大量のパスワード候補を試す速度を下げられます。

方式 特徴
Argon2 メモリ使用量も調整できるパスワード保存向け方式
bcrypt 広く使われているパスワード保存向け方式
scrypt 計算時間とメモリを多く使うよう設計されている
PBKDF2 ハッシュ計算を多数回繰り返す方式

利用する言語やフレームワークが提供する標準ライブラリを使い、推奨設定に従うことが大切です。


ソルトとペッパーの違い

ソルトと似た仕組みに、ペッパーがあります。

項目 ソルト ペッパー
利用者ごとに異なるランダム値 システム全体で使う秘密値など
秘密にするか 通常は秘密にしない 秘密にする
保存場所 ハッシュ値と一緒に保存できる データベースとは別に管理する
目的 事前計算攻撃を難しくする データベース単体流出時の攻撃を難しくする

ペッパーは、環境変数や秘密情報管理サービスなどで安全に管理します。

ソルトとペッパーは役割が異なり、ペッパーはソルトの代わりにはなりません。


ソルトと暗号鍵の違い

ソルトは暗号鍵ではありません。

項目 ソルト 暗号鍵
主な用途 パスワードのハッシュ化 データの暗号化・復号
秘密性 通常は公開されてもよい 秘密に管理する必要がある
元に戻す処理 復号には使わない 暗号化データの復号に使う

ソルトが分かっても、ハッシュ値から元のパスワードを復号できるわけではありません。


ソルトとハッシュの関係

ソルトは、ハッシュ関数そのものではありません。

ハッシュ計算へ追加する補助的な値です。

パスワード
+
ソルト
  ↓
パスワード保存用ハッシュ関数
  ↓
保存用ハッシュ値

ソルトだけではハッシュ値は作れず、ハッシュ関数だけでは利用者ごとに異なる値を作れない場合があります。

両方を組み合わせて使用します。


同じパスワードでもハッシュ値が変わる例

利用者 パスワード ソルト 保存されるハッシュ値
利用者A password123 salt-A hash-A
利用者B password123 salt-B hash-B

パスワードは同じですが、ソルトが違うため、保存されるハッシュ値も異なります。


パスワードを変更したときはどうする?

利用者がパスワードを変更した場合は、新しいソルトを生成し、新しいパスワードからハッシュ値を作り直します。

  1. 新しいパスワードを受け取る
  2. 新しいランダムなソルトを生成する
  3. 新しいパスワードとソルトを使って計算する
  4. 新しいソルトとハッシュ値を保存する

以前のソルトやハッシュ値をそのまま使い回す必要はありません。


実際のIT業務ではどこで使われる?

Webサービスのログイン機能

利用者が登録したパスワードを安全に保存するために使います。

社内システムの認証

社員用アカウントのパスワード保存に利用されます。

スマートフォンアプリ

アプリの利用者認証を行うバックエンドシステムで使われます。

クラウドサービス

クラウド上の認証システムやID管理サービスでも、内部的に安全なパスワード保存方式が利用されます。

フレームワークの認証機能

Webフレームワークが提供する標準のパスワード保存機能では、ソルトを自動生成してくれる場合があります。


ソルトを自分で実装する必要はある?

通常は、ソルトの生成や保存処理を自分で一から実装しないほうが安全です。

利用しているプログラミング言語やフレームワークが提供する、実績のあるパスワード保存ライブラリを使います。

多くのライブラリでは、次の処理を自動的に行います。

開発者は、ライブラリが提供する「パスワードをハッシュ化する関数」と「パスワードを検証する関数」を利用します。


保存される文字列にソルトが含まれる場合もある

bcryptやArgon2などのライブラリでは、ハッシュ値、ソルト、計算設定などが一つの文字列にまとめて保存される場合があります。

方式
+
設定値
+
ソルト
+
ハッシュ値

そのため、データベース上でソルト用の列が見当たらなくても、保存された文字列の中に含まれている場合があります。

利用しているライブラリの保存形式を確認しましょう。


ソルトを使うときの注意点

利用者ごとに異なるソルトを使う

すべての利用者へ同じソルトを使わないようにします。

安全な乱数生成機能を使う

単純な時刻や連番ではなく、暗号学的に安全な乱数生成機能を利用します。

十分な長さを確保する

利用するライブラリや方式が推奨する長さに従います。

SHA-256を1回だけ実行しない

ソルトを付けても、高速なハッシュ関数を1回だけ実行する方法では十分ではありません。

独自方式を作らない

文字列の並べ方や計算回数を独自に決めず、標準的な方式とライブラリを利用します。

ハッシュ値やソルトにもアクセス制御を設定する

ソルトは秘密ではありませんが、データベースを誰でも閲覧できる状態にしてよいわけではありません。

ハッシュ値やソルトが流出すると、パスワード推測攻撃に利用される可能性があります。


よくある質問

ソルトは塩という意味ですか?

英語のsaltには塩という意味があります。

パスワードへ追加情報を「振りかける」イメージから、この名前が使われています。

ソルトはパスワードと一緒に保存してよいですか?

はい。一般的には、ハッシュ値と一緒に保存します。

ソルトは秘密にすることではなく、利用者ごとに計算結果を変えることが目的です。

ソルトが漏れたらパスワードを復元されますか?

ソルトが分かっても、ハッシュ値からパスワードを直接復元できるわけではありません。

ただし、攻撃者がパスワード候補を試すことはできるため、強いパスワード保存方式が必要です。

ソルトは毎回変える必要がありますか?

パスワードを新しく登録・変更するときに、新しいランダムなソルトを生成します。

ログイン確認のたびに変更すると保存済みのハッシュ値と比較できなくなるため、ログイン時は保存済みのソルトを使用します。

ユーザー名をソルトとして使えますか?

推奨されません。

ユーザー名は予測しやすく、変更されない場合も多いため、暗号学的に安全なランダム値を使用します。

ソルトがあれば短いパスワードでも安全ですか?

いいえ。ソルトを使っていても、短く単純なパスワードは総当たり攻撃などで推測される可能性があります。

長く推測されにくいパスワードと、多要素認証などを組み合わせることが重要です。

ペッパーだけ使えばソルトは不要ですか?

不要にはなりません。

ソルトは利用者ごとに計算結果を変え、ペッパーはデータベースとは別に管理する秘密値として防御を追加します。

パスワード以外のデータにもソルトを使いますか?

候補を推測されやすいデータをハッシュ化するときに、同様の考え方を使う場合があります。

ただし、個人情報をソルト付きでハッシュ化しただけで、必ず匿名情報になるわけではありません。


IT業務初心者が覚えておきたいポイント


関連して覚えておきたい用語


まとめ

ソルトとは、パスワードをハッシュ化するときに追加するランダムな値です。

利用者ごとに異なるソルトを使うことで、同じパスワードでも異なるハッシュ値を作れます。

これにより、レインボーテーブルなどの事前計算攻撃を難しくし、複数の利用者が同じパスワードを使っていることも分かりにくくできます。

ただし、ソルトを追加するだけでは十分ではありません。Argon2やbcryptなど、パスワード保存向けの方式と組み合わせる必要があります。

まずは、「ソルトは、同じパスワードでも保存されるハッシュ値を変えるためのランダムな追加情報」と理解しておきましょう。

モバイルバージョンを終了