インターネット上のサービスを利用するうえで欠かせないのが「パスワードの安全な管理」です。しかし、単純にハッシュ化しただけのパスワードでは、攻撃者の手によって容易に突破される危険性があります。そこで登場するのが「ストレッチング」という技術です。
この記事では『ストレッチング』について、以下の内容を図を用いてわかりやすく解説します。
- ストレッチングとは?
- ストレッチングの必要性
- ストレッチングとソルトとペッパーの違い
ストレッチングとは?

ストレッチング(Stretching)は、パスワードをハッシュ化する際に「同じハッシュ計算を意図的に何千回〜何万回と繰り返す」ことで、攻撃者による総当たり(ブルートフォース)や辞書攻撃・レインボーテーブル攻撃でパスワードが復元されにくくする技術です。
普通にハッシュ化を1回だけ行うだけだと、攻撃者は非常に高速に大量の候補パスワードを試せます。ストレッチングにより1回あたりの計算コストを増やすことで、パスワードを破るためにかかる時間が飛躍的に長くなり、現実的には解読がほぼ不可能な状態に近づけることができます。
わせて読みたい
ハッシュ化を実行する関数のことをハッシュ関数と呼びます。『ハッシュ関数』については下記の記事で詳しく説明しています。興味のある方は下記のリンクからぜひチェックをしてみてください。 続きを見るハッシュ関数とは?「特徴」や「用途」などを解説!
ストレッチングの必要性
パソコンやスマートフォンの性能は年々向上しており、コンピュータの処理速度も飛躍的に速くなっています。これにより、攻撃者は膨大な回数のパスワード候補を短時間で試すことが可能になりました。特に短いパスワードや単純なパスワードは、総当たり攻撃(ブルートフォース攻撃)や辞書攻撃を使えば、比較的容易に解読が可能です。
この解読に必要な時間を実用上非現実的なレベルに押し上げるためにストレッチングを実施します。
ストレッチングの回数を増やせば増やすほど、解読が困難になり安全性は高まりますが、その一方でサーバー側の負荷も増えるという問題があります。ユーザーがログインするたびに膨大な回数の計算を行う必要があるため、処理が遅くなったり、サーバーに過剰な負担がかかる恐れがあります。そのため実際のシステムでは、「セキュリティの強化」と「処理性能」のバランスを考えて、適切な回数を設定することが重要です。
ストレッチングとソルトとペッパーの違い
ソルト(Salt)は、パスワードに付け加える「ランダムな文字列」です。
同じ「123456」というパスワードでも、ユーザーごとに異なるソルトを付けてハッシュ化すれば、まったく違うハッシュ値になります。これによって「レインボーテーブル攻撃(あらかじめ作られたハッシュ値の逆引き表を使う攻撃)」が無効化されます。なお、ソルトはパスワードのハッシュ値と一緒にデータベースに保存されることが多いです。


ペッパー(Pepper)は秘密に管理するソルトのようなものです。ソルトと違うのは、データベースには保存せず、アプリの環境変数や専用の秘密管理システム(KMSなど)に置くという点です。万が一データベースごとハッシュ値とソルトが盗まれても、攻撃者はペッパーを知らないため、パスワードを解読するのがさらに難しくなります。


すなわち、ストレッチングはパスワードを解読するのに、必要な時間を実用上非現実的なレベルに押し上げる手段であり、ソルトやペッパーはレインボーテーブル攻撃を無効化するための手段です。
あわせて読みたい
『ソルトやペッパーの概要』・『ソルトやペッパーでレインボーテーブル攻撃を防ぐことができる理由』については下記の記事で詳しく説明しています。興味のある方は下記のリンクからぜひチェックをしてみてください。 続きを見るハッシュ化で用いる「ソルト(Salt)」や「ペッパー(Pepper)」とは?わかりやすく解説!