2FA開発で知ったArgon2:パスワードハッシュ化の新時代

2FA開発で知ったArgon2:パスワードハッシュ化の新時代

作成日:
読了:約11分
更新日:

当サイトは Amazon.co.jp を宣伝しリンクすることで紹介料を得る手段を提供する、Amazonアソシエイト・プログラムの参加者です。価格・在庫はリンク先の最新情報をご確認ください。

「パスワードのハッシュ化?MD5でいいでしょ」

2FA(二要素認証)の開発を始めたとき、最初はそう思ってました。

MD5、SHA-1、SHA-256...どれも「ハッシュ関数」でしょ?違いなんてあるの?

でも、調べていくうちに、とんでもない勘違いをしていたことに気づきました。

パスワードのハッシュ化には、専用のアルゴリズムが必要なんです。

そして、その最適解がArgon2でした。

従来のハッシュ関数の問題点

MD5やSHA-1は「速すぎる」

MD5やSHA-1は、設計上、高速に動作するように作られています。

これは、データの整合性チェックやデジタル署名には最適です。でも、パスワードのハッシュ化には致命的な欠陥があります。

MD5: 1秒間に数億回のハッシュ計算が可能
SHA-1: 1秒間に数千万回のハッシュ計算が可能

これが何を意味するか?

ブルートフォース攻撃が簡単にできてしまうんです。

レインボーテーブル攻撃

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

MD5やSHA-1のような高速なハッシュ関数だと、数秒で数億パターンのハッシュを計算できます。

攻撃者がデータベースからハッシュ値を盗み出したら、レインボーテーブルと照合するだけで、多くのパスワードが即座に解読されてしまいます。

GPU攻撃の脅威

現代のGPUは、並列処理が得意です。

MD5やSHA-1のような単純なハッシュ関数は、GPUで並列実行すると、CPUの数百倍の速度で計算できます。

CPU: 1秒間に1000万回
GPU: 1秒間に100億回(1000倍!)

これでは、どんなに複雑なパスワードでも、時間をかければ解読されてしまいます。

Argon2とは

Argon2は、2015年のPassword Hashing Competitionで優勝した、パスワードハッシュ化専用のアルゴリズムです。

なぜArgon2が優勝したのか

Argon2が選ばれた理由は、3つの攻撃に対する耐性です:

  1. サイドチャネル攻撃に強い
  2. GPU攻撃に強い
  3. メモリ攻撃に強い

特に、メモリハードな設計が特徴的です。

メモリハードとは

メモリハードとは、計算に大量のメモリを必要とする設計のことです。

Argon2は、ハッシュ化の過程で大量のメモリを読み書きします。これにより:

  • GPU攻撃が困難: GPUはメモリ帯域幅が限られている
  • 専用ハードウェア攻撃が困難: メモリが高価になる
  • 並列化が困難: メモリ競合が発生する

結果として、ブルートフォース攻撃のコストが劇的に上がるんです。

Argon2の3つのバリアント

Argon2には、用途に応じて3つのバリアントがあります。

Argon2i(Independent)

サイドチャネル攻撃に最も強いバリアントです。

メモリアクセスのパターンがデータに依存しないため、タイミング攻撃やキャッシュ攻撃に耐性があります。

用途:

  • パスワードのハッシュ化
  • 暗号鍵の導出
  • 一般的な認証システム

Argon2d(Dependent)

GPU攻撃に最も強いバリアントです。

メモリアクセスのパターンがデータに依存するため、並列化が困難です。

用途:

  • 仮想通貨のマイニング
  • ブロックチェーン
  • GPU攻撃が懸念される環境

Argon2id(Hybrid)

Argon2iとArgon2dのハイブリッドです。

最初の部分はArgon2i、残りはArgon2dで処理します。

バランスが取れた選択肢で、多くの場合、これが推奨されます。

用途:

  • 一般的なアプリケーション(推奨)
  • セキュリティとパフォーマンスのバランスが重要

Argon2のパラメータ

Argon2は、3つのパラメータで調整できます。

1. 時間コスト(Time Cost)

反復回数を指定します。

timeCost = 3  → 3回反復
timeCost = 10 → 10回反復

値が大きいほど、計算時間が長くなり、セキュリティが向上します。

2. メモリコスト(Memory Cost)

使用するメモリ量を指定します(キロバイト単位)。

memoryCost = 65536  → 64MB
memoryCost = 131072 → 128MB

値が大きいほど、メモリ使用量が増え、GPU攻撃が困難になります。

3. 並列度(Parallelism)

並列スレッド数を指定します。

parallelism = 1  → シングルスレッド
parallelism = 4  → 4スレッド

一般的には、CPUのコア数に合わせます。

推奨設定

OWASP(Open Web Application Security Project)の Password Storage Cheat Sheet は、Argon2id の最低限の設定として、同等の防御力を持つ次の組み合わせを挙げています(m はKiB単位のメモリ、t は反復回数、p は並列度)。

Argon2id(OWASP の最低限の設定例)
- m=47104 (46 MiB), t=1, p=1
- m=19456 (19 MiB), t=2, p=1
- m=12288 (12 MiB), t=3, p=1
- m=9216  (9 MiB),  t=4, p=1
- m=7168  (7 MiB),  t=5, p=1

また RFC 9106 は、メモリに制約がある環境向けの推奨として「Argon2id、t=3、p=4、m=64 MiB」を挙げています。本記事のサンプルコードでは、OWASP の最低限より多いメモリを割り当てた次の設定を使います。

Argon2id(本記事のサンプルで使う設定)
- timeCost: 2
- memoryCost: 65536 (64MB)
- parallelism: 1

この設定での計算時間は約0.5秒が目安です(マシン性能によって変わります)。

補足(2026-10-07 修正): 公開時は上記の 64MB / t=2 / p=1 を「OWASP の推奨設定」と記載していましたが、OWASP が示しているのは上の最低限の設定例であるため訂正しました。

実装例

Python(argon2-cffi)

Python
from argon2 import PasswordHasher
 
# ハッシュ化
ph = PasswordHasher(
    time_cost=2,
    memory_cost=65536,
    parallelism=1,
    hash_len=32,
    salt_len=16
)
 
password = "my_secure_password"
hash = ph.hash(password)
# 結果: $argon2id$v=19$m=65536,t=2,p=1$...
 
# 検証
try:
    ph.verify(hash, password)
    print("パスワードが一致しました")
except:
    print("パスワードが一致しません")

Node.js(argon2)

JavaScript
const argon2 = require('argon2');
 
// ハッシュ化
async function hashPassword(password) {
  const hash = await argon2.hash(password, {
    type: argon2.argon2id,
    memoryCost: 65536, // 64MB
    timeCost: 2,
    parallelism: 1,
  });
  return hash;
}
 
// 検証
async function verifyPassword(hash, password) {
  try {
    await argon2.verify(hash, password);
    return true;
  } catch (err) {
    return false;
  }
}

PHP(password_hash)

PHP 7.2以降では、標準関数でArgon2が使えます。

PHP
// ハッシュ化
$options = [
    'memory_cost' => 65536, // 64MB
    'time_cost' => 2,
    'threads' => 1,
];
 
$hash = password_hash('my_secure_password', PASSWORD_ARGON2ID, $options);
 
// 検証
if (password_verify('my_secure_password', $hash)) {
    echo "パスワードが一致しました";
}

Argon2のメリット

1. セキュリティが高い

  • GPU攻撃に強い: メモリハードな設計
  • レインボーテーブル攻撃に強い: ソルトとメモリコスト
  • サイドチャネル攻撃に強い: Argon2i/Argon2id

2. 将来性がある

  • 標準化されている: RFC 9106として標準化
  • 広く採用されている: 多くのライブラリでサポート
  • 継続的に改善: コミュニティによる監査

3. 調整可能

  • 環境に応じて最適化: サーバーの性能に合わせて調整
  • セキュリティとパフォーマンスのバランス: 用途に応じて設定

Argon2のデメリット

1. 計算コストが高い

MD5やSHA-1と比べて、計算時間が長いです。

MD5: 0.001秒
SHA-256: 0.001秒
Argon2: 0.5秒(本記事の設定)

でも、これはセキュリティのための投資です。

2. メモリ使用量が多い

本記事の設定では64MBのメモリを使用します。

大量のユーザーが同時にログインすると、メモリ使用量が増えます。

でも、現代のサーバーなら、問題ないレベルです。

3. 古いハッシュとの互換性がない

既存のシステムでMD5やSHA-1を使っている場合、移行が必要です。

既存ユーザーのパスワードを、次回ログイン時にArgon2で再ハッシュ化する必要があります。

2FA開発での活用

2FA開発では、セキュリティトークンのハッシュ化にArgon2を使いました。

従来の実装(SHA-256)

Python
import hashlib
 
def hash_token(token):
    return hashlib.sha256(token.encode()).hexdigest()

問題点:

  • 高速すぎる: ブルートフォース攻撃が容易
  • GPU攻撃に弱い: 並列化が簡単

Argon2での実装

Python
from argon2 import PasswordHasher
 
ph = PasswordHasher(
    time_cost=2,
    memory_cost=65536,
    parallelism=1
)
 
def hash_token(token):
    return ph.hash(token)
 
def verify_token(hash, token):
    try:
        ph.verify(hash, token)
        return True
    except:
        return False

改善点:

  • セキュリティが向上: GPU攻撃に強い
  • 将来性がある: 標準化されたアルゴリズム
  • 調整可能: 環境に応じて最適化

まとめ

「MD5でいいでしょ」という考えは、完全に間違っていました。

パスワードのハッシュ化には、専用のアルゴリズムが必要です。

Argon2は、その最適解です。

重要なポイント

  1. MD5やSHA-1は使わない: パスワードハッシュ化には不適切
  2. Argon2idを推奨: バランスが取れた選択肢
  3. パラメータを調整: 環境に応じて最適化
  4. 継続的に監視: セキュリティは継続的な改善が必要

今後の展望

2FA開発では、Argon2を標準として採用しました。

今後は:

  • 既存システムの移行: MD5/SHA-1からArgon2へ
  • パラメータの最適化: サーバー環境に応じて調整
  • セキュリティ監査: 定期的な見直し

セキュリティは、「これで大丈夫」という終わりがない分野です。

でも、Argon2を使うことで、正しい方向に進んでいることは確信できます。

参考資料

マークルツリー入門 - Git・証明書の透明性・データ同期を支えるハッシュの木

マークルツリー入門 - Git・証明書の透明性・データ同期を支えるハッシュの木

約12分

データの塊をハッシュの木にまとめるマークルツリーの仕組みを、ブラウザで動くデモ付きで説明します。根のハッシュ1つで全体を表せる理由、log2(n)個のハッシュで済む包含証明、RFC 9162の0x00/0x01によるドメイン分離、Bitcoinの奇数個の扱いが招いたCVE-2012-2459、Git・Certificate Transparency・Cassandraでの使われ方までまとめます。

WordPress セキュリティ対策の基本と実践 - 公式ハンドブックと脆弱性統計から優先順位を決める

WordPress セキュリティ対策の基本と実践 - 公式ハンドブックと脆弱性統計から優先順位を決める

約33分

WordPress サイトを守るための対策を、公式の Advanced Administration Handbook と Patchstack・Wordfence の脆弱性統計をもとに優先順位をつけて整理します。2025年に見つかった脆弱性の91%はプラグイン、悪用までの中央値は5時間という現実から、更新と自動更新の設定、プラグインの選び方と減らし方、2要素認証とレート制限によるログイン保護、wp-config.php の定数とファイル権限、WP-CLI のチェックサム検証による改ざん検知、バックアップと改ざんされたときの手順、そして効果が限定的な対策まで、設定例とチェックリスト付きでまとめます。

Gemini 4 Argon 最新事情 - サイバー防御者から段階公開される Google の新フロンティアモデル

Gemini 4 Argon 最新事情 - サイバー防御者から段階公開される Google の新フロンティアモデル

約12分

Google が2026年9月30日(米国時間)に発表した Gemini 4 Argon を公式ブログで整理します。出力上限は64Kから1Mトークンへ、DeepSWE v1.1 で77.9%、導入価格は入力$2・出力$10。一般公開は未定で、まず Fairwind Program のサイバー防御者へ配られる理由、安全対策、社内でのRust移行事例、開発者が今できることまでまとめます。

楽天市場のおすすめPR / 楽天アフィリエイト