scrypt - 暗号化全般

暗号化全般 | IT用語集

scryptとは

scryptは、Colin Percival氏が2009年に開発したメモリハードな鍵導出関数(KDF)です。従来のPBKDF2と異なり、大量のメモリを必要とすることで、GPUやASIC(特定用途向け集積回路)を使用した並列攻撃に対する耐性を高めています。

scryptの主なパラメータ:

  • N(CPUコスト):2のべき乗で指定。大きいほど計算コストが増加
  • r(ブロックサイズ):使用メモリ量に影響
  • p(並列度):並列実行可能な数
  • dkLen:出力する鍵の長さ

必要メモリ量は概算で 128 * N * r バイト となります。

scryptの仕組み

scryptは内部でSalsa20/8コアとPBKDF2-HMAC-SHA256を組み合わせています。大量のメモリを確保し、ランダムなパターンでアクセスすることで、メモリ帯域がボトルネックになるよう設計されています。

from cryptography.hazmat.primitives.kdf.scrypt import Scrypt
import os

def derive_key_with_scrypt(password: str) -> tuple[bytes, bytes]:
    salt = os.urandom(16)
    
    kdf = Scrypt(
        salt=salt,
        length=32,      # 256ビット鍵
        n=2**14,        # CPUコスト(16384)
        r=8,            # ブロックサイズ
        p=1             # 並列度
    )
    
    key = kdf.derive(password.encode())
    return key, salt

def verify_password(password: str, salt: bytes, stored_key: bytes) -> bool:
    kdf = Scrypt(
        salt=salt,
        length=32,
        n=2**14,
        r=8,
        p=1
    )
    try:
        kdf.verify(password.encode(), stored_key)
        return True
    except Exception:
        return False

AIエンジニアとしての実体験

暗号通貨関連のプロジェクトで、scryptを使用したマイニングアルゴリズムの解析を行いました。Litecoinなどの暗号通貨は、ASICマイニングへの耐性を目的としてscryptを採用しています(ただし、現在はscrypt用ASICも存在します)。

また、オフラインで使用するAIアプリケーションのライセンス認証システムで、scryptを使用してライセンスキーから復号化鍵を導出する実装を行いました。メモリ要件が高いため、簡易的なクラッキングツールでの解析が困難になります。

自社サーバー運用への応用

Tarsnap(オンラインバックアップ)

scryptの開発者であるColin Percival氏が運営するTarsnapバックアップサービスは、クライアント側暗号化にscryptを使用しています。

LUKS2でのscrypt使用

# LUKS2でscryptを使用(デフォルトはArgon2id)
cryptsetup luksFormat --type luks2 --pbkdf scrypt /dev/sdb1

# 既存のLUKSボリュームでPBKDFを確認
cryptsetup luksDump /dev/sdb1

関連ブログ記事

最新動向(2026年)

Argon2との比較

現在、新規開発ではArgon2idが推奨されることが多くなっています。Argon2はscryptの設計思想を継承しつつ、より細かいパラメータ調整が可能です。

scrypt・bcrypt・Argon2の違い

パスワードハッシュ・鍵導出に使われる代表的な3方式を比較します。新規実装ではArgon2idが第一候補ですが、既存システムとの互換性やライブラリ対応状況に応じてscrypt・bcryptも選択肢になります。

特性 scrypt bcrypt Argon2(id)
発表年 2009年 1999年 2015年(PHC優勝)
メモリハード ×(メモリ消費は固定的で小さい)
GPU/ASIC攻撃耐性 高い 中程度 高い
サイドチャネル攻撃耐性 ○(Argon2id)
パラメータ N・r・p の3種 コストファクターのみ メモリ・反復・並列度の3種
標準化 RFC 7914 公式RFCなし(デファクトスタンダード) RFC 9106
OWASP推奨順位 第2候補 Argon2/scryptが使えない場合の代替 第1候補(Argon2id)

メリット・デメリット

メリット

  • 大量のメモリを必要とする設計により、GPUやASICを用いた並列総当たり攻撃のコストを大幅に引き上げられる
  • RFC 7914として標準化されており、多くの言語・ライブラリ(OpenSSL、cryptographyパッケージ等)で実装が提供されている
  • LUKS2のディスク暗号化やTarsnapなど、実運用で長年の実績がある

デメリット

  • N・r・pの3パラメータの関係が複雑で、メモリ使用量と計算時間の調整に専門知識を要する
  • Argon2ほどサイドチャネル攻撃対策が徹底されていない(Argon2idのようなハイブリッド設計を持たない)
  • サーバーのメモリリソースを大量に消費するため、コンテナ環境やスケールアウト構成ではメモリ制限に注意が必要

実務での活用シーン・注意点

主な活用シーン

  • パスワード保存時のハッシュ化(bcryptやArgon2が使えない既存システムの移行先として)
  • ディスク暗号化(LUKS2のPBKDFオプション)
  • 暗号通貨のプルーフ・オブ・ワーク(Litecoin等)
  • ライセンスキーやマスターパスワードからの暗号鍵導出

注意点

  • 新規に設計するシステムでは、まずArgon2idの採用を検討し、ライブラリやプラットフォームの制約でArgon2が使えない場合にscryptを選択するのがOWASPの推奨する順序
  • Nの値はサーバーの実メモリ量とリクエスト同時実行数を踏まえて決定し、OOM(メモリ不足)を起こさないよう負荷試験を行う
  • ログイン等のユーザー体験に影響するため、処理時間は100ms〜500ms程度を目安にパラメータを調整する

トラブル事例と対策

⚠️ メモリ不足エラー

問題:Nパラメータが大きすぎてOOM(Out of Memory)が発生

対策:サーバーのメモリ容量に応じてNを調整。コンテナ環境ではメモリ制限に注意

⚠️ 処理時間の長大化

問題:パラメータ設定によりログイン処理に数秒かかる

対策:ユーザー体験とセキュリティのバランスを考慮。100ms〜500ms程度を目安に

権威あるリソース

関連用語

よくある質問(FAQ)

Q. scryptとは何ですか?

scryptはColin Percivalが2009年に開発したパスワードハッシュ・鍵導出関数です。メモリハード設計により、大量のRAMを消費することでGPU・ASIC・FPGAを使った並列ブルートフォース攻撃を困難にします。Litecoinのマイニングアルゴリズムにも採用されており、パスワード保存に加えて暗号通貨でも使用されています。

Q. scryptのパラメータN・r・pは何ですか?

Nはメモリ・CPU使用量(2の累乗、例:2^14=16384)、rはブロックサイズ(例:8)、pは並列度(例:1)です。OWASPの推奨(2024年)はN=32768、r=8、p=1または最小限のオプション(N=2^17、r=8、p=1)です。メモリ使用量は128*N*r バイト(N=32768, r=8の場合32MB)となります。

Q. scryptとArgon2はどちらを使うべきですか?

新規システムではArgon2id(OWASPの第一推奨)を使うべきです。scryptはメモリハードですが、パラメータ設定が複雑で、並列度とメモリの独立調整が難しいことがArgon2に比べた弱点です。両者ともbcryptより優れており、適切なパラメータで設定すれば十分な安全性を提供します。

この用語についてもっと詳しく

scryptに関するご質問やセキュリティ設計のご相談など、お気軽にお問い合わせください。