カテゴリ: Flask 更新日: 2026/03/27

Flaskでパスワードを安全に扱う方法!ハッシュ化の仕組みと実装

Flaskでパスワードを安全に扱う方法!ハッシュ化の仕組みと実装
Flaskでパスワードを安全に扱う方法!ハッシュ化の仕組みと実装

先生と生徒の会話形式で理解しよう

生徒

「先生、Flaskでログイン機能を作ってるんですが、パスワードってどうやって安全に保存すればいいんですか?」

先生

「とても大事なポイントですね。パスワードは“ハッシュ化”して保存するのが基本です。もし生のパスワードをそのまま保存すると、セキュリティ上の大問題になってしまいます。」

生徒

「ハッシュ化って何ですか?暗号化とは違うんですか?」

先生

「良いところに気がつきました。暗号化は元に戻せますが、ハッシュ化は“元に戻せない”という点が大きな違いなんです。では、詳しく見ていきましょう!」

1. Flaskでパスワードをハッシュ化する理由

1. Flaskでパスワードをハッシュ化する理由
1. Flaskでパスワードをハッシュ化する理由

パスワードをそのまま(平文といいます)で保存すると、データベースが流出したときに全ユーザーのパスワードが漏れてしまいます。たとえば、次のように保存していると危険です。


users = {
    "alice": "password123",
    "bob": "123456"
}

これでは、誰かがデータベースをのぞけば一目でパスワードがわかってしまいます。ハッシュ化(Hashing)を使うと、パスワードを一方向の関数で変換し、元の文字列に戻せないようにすることができます。

つまり、たとえデータが漏れても、パスワードそのものは分からないようになります。

2. ハッシュ化とは?暗号化との違いを理解しよう

2. ハッシュ化とは?暗号化との違いを理解しよう
2. ハッシュ化とは?暗号化との違いを理解しよう

暗号化は、特殊な「鍵(キー)」を使ってデータを復元できます。しかし、ハッシュ化は「戻せない」仕組みです。例えば、「apple」という文字列をハッシュ化するとこんな感じになります。


    apple → 1f3870be274f6c49b3e31a0c6728957f

この結果から元の「apple」を取り出すことはできません。FlaskやPythonでは、werkzeug.securityというライブラリを使って簡単にハッシュ化が行えます。

3. Flaskでパスワードをハッシュ化する実装例

3. Flaskでパスワードをハッシュ化する実装例
3. Flaskでパスワードをハッシュ化する実装例

では、Flaskで実際にハッシュ化を行うコードを書いてみましょう。


from flask import Flask, request
from werkzeug.security import generate_password_hash, check_password_hash

app = Flask(__name__)

@app.route('/register', methods=['POST'])
def register():
    password = request.form['password']
    hashed_pw = generate_password_hash(password)
    return f"ハッシュ化されたパスワード: {hashed_pw}"

@app.route('/login', methods=['POST'])
def login():
    password = request.form['password']
    stored_hash = 'pbkdf2:sha256:260000$abc123$abcdef...'  # 仮のハッシュ
    if check_password_hash(stored_hash, password):
        return "ログイン成功!"
    else:
        return "パスワードが間違っています。"

generate_password_hash()はパスワードを安全にハッシュ化します。check_password_hash()は、入力されたパスワードと保存されたハッシュを比較して、一致しているか確認します。

4. ハッシュ化の仕組みをもう少し詳しく知ろう

4. ハッシュ化の仕組みをもう少し詳しく知ろう
4. ハッシュ化の仕組みをもう少し詳しく知ろう

ハッシュ化は、「同じ入力には必ず同じ結果が出る」という特徴があります。しかし、それだけではセキュリティが弱くなります。なぜなら、悪意のある人が「辞書攻撃」という方法で、よく使われるパスワードのハッシュ値を事前に調べてしまうことがあるからです。

そこで登場するのがソルト(Salt)という考え方です。ソルトとは、「ランダムな文字列をパスワードに混ぜてハッシュ化する」仕組みです。これにより、同じパスワードでもハッシュ値が変わり、解析が難しくなります。

例えば:


    password123 → ハッシュ化(A1B2C3...)
    password123 + ソルト値X9Y7 → ハッシュ化(Z8K4M5...)

Flaskのgenerate_password_hash()関数は、自動でソルトを追加してくれるため、開発者が手動で管理する必要はありません。

5. パスワードを安全に管理するためのベストプラクティス

5. パスワードを安全に管理するためのベストプラクティス
5. パスワードを安全に管理するためのベストプラクティス

Flaskアプリを開発する際は、次のルールを守ることでセキュリティを高められます。

  • パスワードは必ずハッシュ化して保存する(生の文字列は禁止)
  • ソルト付きハッシュを使う(Flaskの関数なら自動で対応)
  • HTTPS通信を使って、送信時にパスワードが盗まれないようにする
  • ユーザーがパスワードを忘れた場合は、再設定メールを送る(決して元のパスワードを表示しない)

また、セキュリティの専門家は「bcrypt」や「Argon2」といった強力なアルゴリズムを使うことを推奨しています。Flaskのgenerate_password_hash()はこれらにも対応しています。

6. 実際にFlaskで登録とログインを組み合わせる

6. 実際にFlaskで登録とログインを組み合わせる
6. 実際にFlaskで登録とログインを組み合わせる

次のサンプルでは、登録時にパスワードをハッシュ化し、ログイン時にそのハッシュと入力を照合する仕組みを実装しています。


from flask import Flask, request, session, redirect, url_for
from werkzeug.security import generate_password_hash, check_password_hash

app = Flask(__name__)
app.secret_key = "super_secret"

users = {}

@app.route('/register', methods=['POST'])
def register():
    username = request.form['username']
    password = request.form['password']
    users[username] = generate_password_hash(password)
    return "登録完了!"

@app.route('/login', methods=['POST'])
def login():
    username = request.form['username']
    password = request.form['password']
    user_hash = users.get(username)

    if user_hash and check_password_hash(user_hash, password):
        session['user'] = username
        return "ログイン成功!"
    return "ユーザー名またはパスワードが違います。"

このようにすれば、ハッシュ化されたパスワードしか保存されず、安全なログイン機能を構築できます。

7. ハッシュ化を理解して安全なFlaskアプリを作ろう

7. ハッシュ化を理解して安全なFlaskアプリを作ろう
7. ハッシュ化を理解して安全なFlaskアプリを作ろう

Flaskでパスワードを扱うときは、「ハッシュ化」「ソルト」「比較」の3つのポイントを意識すれば、初心者でも安全なWebアプリを作ることができます。

ハッシュ化は単なる技術ではなく、ユーザーの個人情報を守るための大切な仕組みです。どんなに小さなアプリでも、パスワードの安全管理は絶対に軽視してはいけません。

まとめ

まとめ
まとめ

この記事では、Flaskでパスワードを安全に管理するための基本的な考え方と実装方法について詳しく解説しました。まず、パスワードを平文で保存する危険性を理解し、ハッシュ化の仕組みを知ることが重要です。ハッシュ化とは、一方向に変換され、元に戻せない処理であり、暗号化とは異なります。FlaskやPythonのwerkzeug.securityライブラリを使うことで、generate_password_hash()でハッシュ化し、check_password_hash()で認証時に比較できます。

また、ハッシュ化だけではセキュリティが不十分な場合もあります。同じパスワードが同じハッシュになることを避けるために、ソルト(Salt)を用いることで解析を難しくします。Flaskの関数は自動でソルトを生成してくれるため、開発者が手動で管理する必要はありません。さらに、HTTPS通信やパスワード再設定の仕組みを組み合わせることで、より安全なユーザー認証システムを構築できます。

実際のコード例としては、登録時にパスワードをハッシュ化して保存し、ログイン時に入力パスワードとハッシュを照合する方法を紹介しました。この実装により、ユーザーのパスワードは常に安全に保管され、不正アクセスや情報漏洩のリスクを大幅に減らすことができます。

さらに、Flaskのgenerate_password_hash()は強力なアルゴリズム(bcrypt、PBKDF2、Argon2)に対応しており、将来的に高度なセキュリティを実装したい場合も安心です。初心者でも「ハッシュ化」「ソルト」「比較」の3つを意識するだけで、安全なWebアプリを開発できます。

ここで、改めてFlaskでパスワードを安全に扱うサンプルコードを振り返ります。


from flask import Flask, request, session
from werkzeug.security import generate_password_hash, check_password_hash

app = Flask(__name__)
app.secret_key = "super_secret_key"

users = {}

@app.route('/register', methods=['POST'])
def register():
    username = request.form['username']
    password = request.form['password']
    hashed_pw = generate_password_hash(password)
    users[username] = hashed_pw
    return "登録完了!"

@app.route('/login', methods=['POST'])
def login():
    username = request.form['username']
    password = request.form['password']
    user_hash = users.get(username)
    if user_hash and check_password_hash(user_hash, password):
        session['user'] = username
        return "ログイン成功!"
    return "ユーザー名またはパスワードが違います。"
先生と生徒の振り返り会話

生徒

「先生、Flaskでのパスワード管理についてだいぶ理解できました。ハッシュ化は元に戻せないこと、ソルトで同じパスワードでもハッシュが変わることが分かりました。」

先生

「その通りです。セキュリティの基本は、ユーザー情報を安全に保つことです。Flaskのgenerate_password_hash()check_password_hash()を使えば、簡単に安全なログイン機能を実装できます。」

生徒

「HTTPSを使うことや、パスワード再設定の仕組みも組み合わせると、さらに安全になるんですね。」

先生

「その通りです。初心者でもポイントを押さえれば、安全で信頼できるWebアプリを作ることができます。今回学んだ“ハッシュ化”“ソルト”“比較”の3つの概念を意識して実装してください。」

生徒

「わかりました。実際に手を動かしてコードを書きながら理解を深めます!」

カテゴリの一覧へ
新着記事
New1
Django
Djangoバリデーション入門|フォームとモデルの入力チェック基本をやさしく理解しよう
New2
Django
Djangoテンプレートの変数展開まとめ|初心者向けにわかりやすく解説
New3
Django
Django ModelFormの使い方完全ガイド!初心者でもわかる新規登録フォーム作成
New4
Django
Djangoテンプレートの使い方を完全解説!初心者でもわかるタグ・フィルタ入門
人気記事
No.1
Java&Spring記事人気No1
Python
PythonでNoSQL操作!エラーハンドリングを初心者向けに徹底解説
No.2
Java&Spring記事人気No2
Python
Pythonの文字列を1文字ずつ処理する方法!for文やlist化の活用例
No.3
Java&Spring記事人気No3
Flask
Flaskで多言語対応のログメッセージを出力する方法!Python初心者向けガイド
No.4
Java&Spring記事人気No4
Python
PythonのSQLAlchemy使い方入門!初心者でもわかるインストールと初期設定
No.5
Java&Spring記事人気No5
Python
PythonのSQLAlchemyでデータベース操作!モデルクラスでテーブル定義する方法を徹底解説
No.6
Java&Spring記事人気No6
Flask
FlaskでJSONレスポンスを多言語化!API設計の基本を初心者向けに解説
No.7
Java&Spring記事人気No7
Python
PythonでCassandraに接続する方法を完全ガイド!cassandra-driverの使い方
No.8
Java&Spring記事人気No8
Python
PythonでREST APIを作る方法!初心者向けFastAPI入門