<p><style_prompt: technical_analysis_and_drafting_style_v1.0="">
本記事は<strong>Geminiの出力をプロンプト工学で整理した業務ドラフト(未検証)</strong>です。</style_prompt:></p>
<h1 class="wp-block-heading">令和5年度 情報処理安全確保支援士試験 午前Ⅱ 問1 パスワードのソルト</h1>
<p>パスワードの安全な保存手法であるソルトの役割を問う問題です。ハッシュ値から平文を逆引きするレインボーテーブル攻撃の無効化が核心です。</p>
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>【問題】
パスワードをハッシュ値として保存するとき,ソルトを用いる目的はどれか。</p>
<p>ア 同じパスワードに対して利用者ごとに異なるハッシュ値を生成し,レインボーテーブルによる解読を困難にする。
イ 固定長であるハッシュ値の長さを,入力されたパスワードと同じ長さに調整できるようにする。
ウ ハッシュ値から元のパスワードを逆算できるようにし,パスワードの再発行を不要にする。
エ ハッシュ値の生成速度を上げ,認証処理のオーバーヘッドを削減する。</p>
</blockquote>
<p>【解説】
ソルト(Salt)とは、パスワードをハッシュ化する際、パスワード文字列に付加するランダムなデータのことです。</p>
<p>通常、同一のパスワードを同じハッシュ関数(SHA-256等)で処理すると、常に同一のハッシュ値が生成されます。攻撃者はこれを利用し、あらかじめ「平文とハッシュ値の対応表」を大量に作成しておき、盗み出したハッシュ値を高速に照合することで元のパスワードを特定します。この対応表が<strong>レインボーテーブル</strong>です。</p>
<p>ソルトを付加することで、たとえ同じパスワード「123456」であっても、ユーザーごとに生成されるハッシュ値を異なるものにできます。</p>
<p>$$HashValue = HashFunction(Password + Salt)$$</p>
<div class="wp-block-merpress-mermaidjs diagram-source-mermaid"><pre class="mermaid">
graph LR
PW["パスワード"] --> Combine["結合"]
Salt["ソルト"] --> Combine
Combine --> HashFunc["ハッシュ関数"]
HashFunc --> Result["ハッシュ値"]
style Salt fill:#f9f,stroke:#333
</pre></div>
<p>【選択肢の吟味】</p>
<figure class="wp-block-table"><table>
<thead>
<tr>
<th style="text-align:left;">選択肢</th>
<th style="text-align:center;">判定</th>
<th style="text-align:left;">解説</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left;">ア</td>
<td style="text-align:center;">正解</td>
<td style="text-align:left;">ソルトの主目的は、同一パスワードによるハッシュ値の重複を防ぎ、事前計算攻撃(レインボーテーブル)を無効化することです。</td>
</tr>
<tr>
<td style="text-align:left;">イ</td>
<td style="text-align:center;">誤り</td>
<td style="text-align:left;">ハッシュ値は関数の仕様により固定長(例:SHA-256なら256ビット)であり、ソルトで長さを可変にするわけではありません。</td>
</tr>
<tr>
<td style="text-align:left;">ウ</td>
<td style="text-align:center;">誤り</td>
<td style="text-align:left;">ハッシュ関数は不可逆性を持ちます。ソルトを用いても元のパスワードを逆算(復号)することは不可能です。</td>
</tr>
<tr>
<td style="text-align:left;">エ</td>
<td style="text-align:center;">誤り</td>
<td style="text-align:left;">ソルトを付加し結合する処理が追加されるため、計算負荷はわずかに増加します。速度向上を目的とするものではありません。</td>
</tr>
</tbody>
</table></figure>
<p>【ポイント】</p>
<ul class="wp-block-list">
<li><p><strong>レインボーテーブル対策</strong>:ソルトの最大の目的は、ハッシュ値の事前計算を無意味にすること。</p></li>
<li><p><strong>一方向性(不可逆性)</strong>:ソルトを用いても、ハッシュ値から平文に戻すことはできない。</p></li>
<li><p><strong>ストレッチングとの違い</strong>:ハッシュ計算を繰り返す「ストレッチング」は、総当たり攻撃の試行回数を遅らせることが目的。</p></li>
</ul>
本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証)です。
令和5年度 情報処理安全確保支援士試験 午前Ⅱ 問1 パスワードのソルト
パスワードの安全な保存手法であるソルトの役割を問う問題です。ハッシュ値から平文を逆引きするレインボーテーブル攻撃の無効化が核心です。
【問題】
パスワードをハッシュ値として保存するとき,ソルトを用いる目的はどれか。
ア 同じパスワードに対して利用者ごとに異なるハッシュ値を生成し,レインボーテーブルによる解読を困難にする。
イ 固定長であるハッシュ値の長さを,入力されたパスワードと同じ長さに調整できるようにする。
ウ ハッシュ値から元のパスワードを逆算できるようにし,パスワードの再発行を不要にする。
エ ハッシュ値の生成速度を上げ,認証処理のオーバーヘッドを削減する。
【解説】
ソルト(Salt)とは、パスワードをハッシュ化する際、パスワード文字列に付加するランダムなデータのことです。
通常、同一のパスワードを同じハッシュ関数(SHA-256等)で処理すると、常に同一のハッシュ値が生成されます。攻撃者はこれを利用し、あらかじめ「平文とハッシュ値の対応表」を大量に作成しておき、盗み出したハッシュ値を高速に照合することで元のパスワードを特定します。この対応表がレインボーテーブルです。
ソルトを付加することで、たとえ同じパスワード「123456」であっても、ユーザーごとに生成されるハッシュ値を異なるものにできます。
$$HashValue = HashFunction(Password + Salt)$$
graph LR
PW["パスワード"] --> Combine["結合"]
Salt["ソルト"] --> Combine
Combine --> HashFunc["ハッシュ関数"]
HashFunc --> Result["ハッシュ値"]
style Salt fill:#f9f,stroke:#333
【選択肢の吟味】
| 選択肢 |
判定 |
解説 |
| ア |
正解 |
ソルトの主目的は、同一パスワードによるハッシュ値の重複を防ぎ、事前計算攻撃(レインボーテーブル)を無効化することです。 |
| イ |
誤り |
ハッシュ値は関数の仕様により固定長(例:SHA-256なら256ビット)であり、ソルトで長さを可変にするわけではありません。 |
| ウ |
誤り |
ハッシュ関数は不可逆性を持ちます。ソルトを用いても元のパスワードを逆算(復号)することは不可能です。 |
| エ |
誤り |
ソルトを付加し結合する処理が追加されるため、計算負荷はわずかに増加します。速度向上を目的とするものではありません。 |
【ポイント】
レインボーテーブル対策:ソルトの最大の目的は、ハッシュ値の事前計算を無意味にすること。
一方向性(不可逆性):ソルトを用いても、ハッシュ値から平文に戻すことはできない。
ストレッチングとの違い:ハッシュ計算を繰り返す「ストレッチング」は、総当たり攻撃の試行回数を遅らせることが目的。
ライセンス:本記事のテキスト/コードは特記なき限り
CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。
コメント