🔐 Flaskパスワード暗号化とセキュリティ対策
📝 はじめに
ユーザー登録やログイン機能を作るとき、パスワードを安全に保存することはとても重要です。パスワードをそのまま保存してしまうと、情報漏えいのリスクが高くなります。また、アプリケーションの信頼性も大きく下がってしまいます。
このページでは、Flaskで使えるパスワード暗号化の方法と、合わせて行いたいセキュリティ対策の基本を詳しく紹介します。
🔐 パスワードをハッシュ化する理由
「暗号化」ではなく、実際には「ハッシュ化(hash)」という方法を使います。
- ハッシュ化とは、一方向の不可逆変換。元のデータに戻すことはできません
- パスワードをハッシュ化して保存すれば、データベースが盗まれても元のパスワードがわかりません
ログインのたびに入力されたパスワードをハッシュ化し、保存済みの値と比較するだけで確認できます
なぜ暗号化ではなくハッシュ化なの?
暗号化は復号(元に戻す)を前提とした処理ですが、ハッシュ化は「戻せない」前提の変換です。パスワードのように「元の値が不要で、正しいかどうかを確認するだけ」の場合にはハッシュ化が安全で適切です。
🛠 Werkzeugを使ったハッシュ化
Flaskでは、werkzeug.security モジュールを使うと簡単にパスワードをハッシュ化できます。これはFlaskに含まれるライブラリの一部なので、別途インストールは不要です。
🔹 インストール(FlaskをインストールすればOK)
pip install flask
🔹 基本的な使い方
from werkzeug.security import generate_password_hash, check_password_hash
# パスワードのハッシュ化(登録時)
hashed_pw = generate_password_hash("mypassword")
print(hashed_pw) # ハッシュ化された文字列が出力される
# パスワードのチェック(ログイン時)
print(check_password_hash(hashed_pw, "mypassword")) # → True
print(check_password_hash(hashed_pw, "wrong")) # → False
generate_password_hash() は内部で pbkdf2:sha256 という安全なアルゴリズムを使っており、繰り返し回数(イテレーション)も適切に設定されています。セキュリティ的に安心です。
🧑💻 登録・ログインでの使い方例
以下は、ユーザー登録とログイン時にどうやってハッシュ化を活用するかの流れです。
🔹 登録時
from werkzeug.security import generate_password_hash
password = request.form["password"]
hashed_password = generate_password_hash(password)
# これをデータベースに保存する(平文のパスワードは保存しない)
db.save_user(username, hashed_password)
🔹 ログイン時
from werkzeug.security import check_password_hash
password_input = request.form["password"]
stored_hashed = db.get_password_hash(username) # データベースから取得
if check_password_hash(stored_hashed, password_input):
# ログイン成功(セッション処理など)
session["username"] = username
else:
# ログイン失敗(エラーメッセージを表示)
flash("パスワードが正しくありません")
🧱 よくある間違いと注意点
- check_password_hash() は必ず 正しいハッシュ値との比較に使う
- ハッシュ値を比較する際、Pythonの == ではなく専用関数を使う(タイミング攻撃を防ぐため)
- 入力フォームはHTMLレベルでも required を設定し、サーバー側でもチェックを行う
- 開発時に print() などでパスワードを出力しない
🔐 その他のセキュリティ対策
パスワードのハッシュ化以外にも、Flaskで安全なWebアプリを作るための基本的なセキュリティ対策を紹介します。
セッション管理
- app.secret_key を必ず設定(乱数で作成)
- セッション情報には重要なデータを保存しすぎないようにする
CSRF対策
- Flask-WTF を使って form.hidden_tag() をテンプレートに入れる
- POSTリクエストに対する保護を必ず行う
入力バリデーション
- ユーザー入力は常に疑い、wtforms や re モジュールで検証する
- 不正な形式、長すぎる文字列などは弾く
パスワードの強度
- パスワードは最低8文字以上、英大文字・小文字・数字・記号を含めるよう推奨
- 登録フォームにパスワード強度のヒントを表示する
アクセス制御
- 管理画面や機密ページには @login_required デコレーターなどを使って制限
- ロール(役割)に応じたアクセス管理を考える(例:管理者、一般ユーザー)
✅ まとめ
- パスワードは絶対にプレーン(平文)で保存せず、ハッシュ化して保存すること!
- Flaskでは generate_password_hash() と check_password_hash() で簡単に実装可能
- ハッシュ値の比較には専用関数を使い、セキュリティを強化する
- SECRET_KEY や CSRF対策、バリデーション なども重要な防御手段
この知識は、Flaskに限らずあらゆるWebアプリ開発で基本となる考え方です。この記事では、Flaskで安全にパスワードを取り扱うためのハッシュ化の方法と、アプリ全体のセキュリティを高めるための対策について解説しました。
株式会社ONE WEDGE
【Serverlessで世の中をもっと楽しく】 ONE WEDGEはServerlessシステム開発を中核技術としてWeb系システム開発、AWS/GCPを利用した業務システム・サービス開発、PWAを用いたモバイル開発、Alexaスキル開発など、元気と技術力を武器にお客様に真摯に向き合う価値創造企業です。
Discussion