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 | Argon2 |
|---|---|---|
| メモリハード | ○ | ○ |
| サイドチャネル攻撃耐性 | △ | ○(Argon2id) |
| パラメータ調整 | 3パラメータ | 4パラメータ |
| 標準化状況 | RFC 7914 | RFC 9106(PHC優勝) |
トラブル事例と対策
⚠️ メモリ不足エラー
問題:Nパラメータが大きすぎてOOM(Out of Memory)が発生
対策:サーバーのメモリ容量に応じてNを調整。コンテナ環境ではメモリ制限に注意
⚠️ 処理時間の長大化
問題:パラメータ設定によりログイン処理に数秒かかる
対策:ユーザー体験とセキュリティのバランスを考慮。100ms〜500ms程度を目安に
権威あるリソース
- RFC 7914 - The scrypt Password-Based Key Derivation Function
- scrypt公式ページ(Tarsnap)
- scrypt GitHub Repository
