Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Password Hashing djangocongress 20180519
Search
bungoume
May 19, 2018
Technology
4.2k
5
Share
Password Hashing djangocongress 20180519
bungoume
May 19, 2018
More Decks by bungoume
See All by bungoume
djangocongressjp2023_password_hash
bungoume
2
1.6k
日経電子版でのDjango活用事例紹介 / djangocongressjp2022-nikkei
bungoume
4
7k
CircleCIの活用事例とCI高速化/circleci-community-meetup3-speedup
bungoume
3
1.6k
OSSで始めるセキュリティログ収集/oss-securitylog-builderscon2017
bungoume
29
11k
日経電子版のアプリ開発を支えるログ活用術/nikkei-log-201609
bungoume
1
1.4k
Kibanaで秒間1万件のアクセスを可視化した話/nikkei-kibana-loganalyst2015
bungoume
20
17k
uwsgi-docker-pycon2015
bungoume
10
60k
Ansibleを結構使ってみた/ansible-nikkei-2015
bungoume
32
15k
Dynamic Inventoryと参照変数
bungoume
2
5k
Other Decks in Technology
See All in Technology
Platform Engineering as a Product: Criteria for Improvement and Multi-Tenant Design
kumorn5s
0
470
新規ゲーム開発におけるAI駆動開発のリアル
202409e2
0
1.6k
BigQuery の Cross-cloud Lakehouse への歩み
phaya72
2
330
Spring Boot における AOT Cache 活用テクニックと 起動時間改善事例
ntt_dsol_java
0
200
Platform engineering for developers, architects & the rest of us (AI agents)
danielbryantuk
0
170
探して_入れて_作って_使う_Agent_Skills___LT.pdf
peintangos
2
150
個人最適 から 全体最適 へ AI情報共有会・AIギルド・AI-DLC で進める カンリーの組織展開
rfdnxbro
0
560
製造業のクラウド活用最適解〜AI,DXを加速するデータ基盤の作り方〜
hamadakoji
0
290
サイバーセキュリティ概論 / Introduction to Cybersecurity
ks91
PRO
0
120
美味しいスイスチーズを作ろう🧀🐭
taigamikami
1
220
Oracle AI Database@Azure:サービス概要のご紹介
oracle4engineer
PRO
6
1.8k
JEP 522 Deep Dive - G1 GC同期コスト削減によるスループット向上を徹底検証&解説
tabatad
1
620
Featured
See All Featured
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.3k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
65
55k
Designing for Performance
lara
611
70k
GraphQLとの向き合い方2022年版
quramy
50
15k
The Pragmatic Product Professional
lauravandoore
37
7.3k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Building an army of robots
kneath
306
46k
Building Applications with DynamoDB
mza
96
7.1k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
380
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
23k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
320
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
280
Transcript
DjangoCongress JP 2018 梅崎 裕利 (@bungoume) Password Hashing
2 自己紹介 ❏ 梅崎 裕利 (@bungoume) 最近 bungou.me ドメイン取りました ❏
検索API (Elasticsearch, Django) ❏ OAuth認可 API基盤 (DRF, oauthlib) ❏ アクセスログ分析
3 ニュースから
米Yahooから30億人分のデータ流出 4 米Yahooで2013年8月に起きた アカウント情報窃取 • 氏名 • メールアドレス, 電話番号 •
生年月日 • ハッシュ化されたパスワード • セキュリティー用の質問と答え などが漏えい 2016年9月の発表当初は 5億人以上 でしたが... https://www.nikkei.com/article/DGXMZO21867310U7A001C1EAF000/
Adobe社のサイトの不正アクセス 5 2013年10月 少なくとも3800万人のIDと 暗号化されたパスワードが漏えい →暗号化が適切ではなく、すぐに解 読されてリストが流出 https://haveibeenpwned.com/ https://blog.tokumaru.org/2013/11/adobe.html
最近でも 6 2016年には一年で約30億件の ユーザー情報とパスワードが流出 http://www.cxotoday.com/story/over-300-bn-passwords-will-be -prone-to-cyber-attacks-by-2020-report/
7 • DBからパスワードが漏れた時点で個人情報も多分漏れてる • パスワードが一番重要なケース ◦ IDとパスワードしか取得していない ◦ 名前、生年月日は公開情報なSNS •
パスワードを他サービスと使いまわしている人は多い ◦ 二次被害に繋がる • 対策しているのが当然と思われている パスワードってそんなに大事?
8 • パスワードだけが守るべき対象ではないが... ◦ ユーザーの権限を利用されてしまう ◦ パスワードを漏らすと他のサービスにも迷惑を与える YahooやAdobeのような大手IT企業でも起きており、 他人事ではない 過去の事例を教訓を活かすことが重要
過去の事件を教訓に
パスワードの保存方法
10 • パスワードハッシュとは • パスワード長と解析速度 • 各パスワードハッシュの紹介 ◦ Djangoでのデータ内容 ◦
Djangoにおける歴史 • 計算時間の比較 • ハッシュ解析 アジェンダ
11 パスワードハッシュ関数(鍵導出関数) 例: PBKDF2_sha256 • pass: P@ssw0rd • salt: FkxESIA1MrrH
• iterations: 36000 • hash: pxQUTiLxiWlkkY+0r5p43LfAHlQIw1ongOFv6FjVc/g= data: pbkdf2_sha256$36000$FkxESIA1MrrH$pxQUTiLxiWlkkY+0r5p43LfAHlQIw1ongOFv6FjVc/g= パスワードハッシュ関数
12 • 鍵の管理が不要で運用しやすい • 管理者も知るべきではない • 秘密鍵だけ守るのはとても難しい 暗号化じゃなくてハッシュの理由
13 • 長いパスワードは利用者にとって手間 • 種類が少なければ、ハッシュといえど総当りで復元可能 ◦ →あえて計算に時間がかかるようにする必要がある 人間の思いつくパスワードは限定的
14 IPAのコンピュータウイルス・不正アクセスの届出状況 (2008年10月) https://www.ipa.go.jp/security/txt/2008/10outline.html によると、 > 解読には最大で約50年 > 3種類(62文字数)で8桁のパスワードを作成すればパスワードの強度は十分 ・・・では今は?
よくあるパスワード長の根拠
15 数十万円の機材で、8文字パスワードのSHA2-hashは 1分で全部解析可能になっている(かも?) (※あくまで可能性の話) 2018年、解析にかかる時間
16 1000万倍になると、「解析に1000年かかる」と言われていたもの が1時間未満に →パスワードの文脈だと困る 早くなりすぎでは!? 10年で1000万倍
17 SHA-256の計算はbitcoin採掘に 必要なため、超高速なハードウェア (ASIC)が開発が急速に進んだ ≒お金が流れ込んできた (bitcoin採掘ASICは直接パスワード解析には使えないので、あく まで理論値)ですが、パスワード分析できれば儲かるという話が 出ると同様になる可能性がある なぜか
18 2008年ごろ CPUでhash計算するのが主流。2M hash/sぐらい? 2010年ごろ GPUを利用したhash計算。 SHA1で1.3G hash/sぐらい? (約1000倍) 2014年ごろ
bitcoinによりASIC開発が進む SHA256で14T hash/s (CPU比1000万倍) 時系列イメージ(主観)
19 • 計算に時間の掛かるパスワードハッシュ関数を利用 • ハードウェア化を行いにくくする • (パスワード解析で得られる利益を減らす) どうすればよいの
20 各ハッシュアルゴリズムの概要
Django標準で使えるハッシュ関数 21 PASSWORD_HASHERS
22 • auth_userのpassword field(char 128)に格納 • $区切り • 先頭はハッシュ方式 •
その後、パラメータとハッシュ(詳細は各関数に異なる) 例: pbkdf2_sha256$360000$dNhx87pKlB9E$xKRyAEunJkChipe BHaIbSNipBUOSTvUcqMUFrvz9UEI= Djangoにおけるパスワードデータ
歴史 23 Django1.4 から設定でハッシュ関数が変えられるように v0.91の段階でpasswordデータは先頭がハッシュ方式 [algo]$[salt]$[hexdigest] なので、アルゴリズム変更が可能 https://www.djangoproject.com/weblog/2005/nov/20/passwordchange/
24 • SHA1+salt • PBKDF2-SHA256 • bcrypt • (scrypt) •
Argon2 紹介するパスワードハッシュ関数
SHA1+salt 25 • Django初期(〜1.3)の形式 • ユーザ毎に異なる文字列(salt)をつけることで 同じパスワードでもhashが変わる • 非推奨 ◦
まだデータが残っていれば移行方法を検討 sha1 $ salt $ hash
PBKDF2 26 • Djangoのデフォルト方式で、よく利用される • ライブラリ不要 • iterationsを増やすのが容易 pbkdf2_sha256$360000$dNhx87pKlB9E$xKRyAEunJkChipeBHaIbSNipBUOSTvUcqMUFrvz9UEI= pbkdf2_sha256
$ iterations $ salt $ hash
27 イテレーション回数はバージョン更新ごとに増加 v1.4-1.6: 10000 ->v1.7: 12000 -> v1.8: 20000 ->
v1.9: 24000 -> v1.10: 30000 -> v1.11: 36000 -> v2.0: 100000 -> v2.1: 120000 https://docs.djangoproject.com/en/dev/internals/howto-release-django/#new-stable-branch-tasks > New stable branch tasks Increase the default PBKDF2 iterations in > django.contrib.auth.hashers.PBKDF2PasswordHasher by about 20% PBKDF2のイテレーション数
sha2+bcrypt 28 • Blowfishという古い暗号化方式を利用 • ハードウェア化が難しいとされる • iterationsで計算量を増やすことが可能 ◦ 必要メモリ量の調整はできない
• BCryptPasswordHasherはパスワードを72文字で切り捨て • PHPの標準方式 (Railsも?) • Dropboxなど利用事例も多い bcrypt_sha256$$2b$12$EJOn/KeVwTB47B0dgUpG.u5vF/BKKQXrJ/GWPeKLHCSYMPZUgis9a
(scrypt) 29 • Django標準では用意されていない • 従来の方式に比べてメモリ使用量を増やし、ハードウェア化を難 しくしてある • TMTO(Time-Memory Trade
Off)=計算量を増やす代わりに メモリ使用量を削減することができてしまう • bitcoinフォークのLitecoinで利用されているらしく、既にある程度 ハードウェア化されている
Argon2 30 • Password Hashing Competition(2015.7) 勝者 • Djangoで利用にはサードパーティのライブラリが必要 •
メモリ使用量を設定するパラメータがある ◦ django m=512(kB), t=2(iterations), p=2(threads) ◦ PHP7.2 m=1024, t=2, p=2 ◦ Argon2 cli m=4096, t=3, p=1 argon2$argon2i$v=19$m=512,t=2,p=2$UUs1czNhenF3ZGs3 $LPSAw5kqjDMtvKq8M+A6Jw
Argon2 31 • argon2i サイドチャネル攻撃耐性 • argon2d GPUを使った攻撃に対する耐性 • argon2id
いいとこ取り argon2iがパスワードに適している(PHP7.2もargon2iを利用) argon2idはできて日が浅い
速度比較 32 設定値 100回 (秒) 1回あたり SHA1+Salt 0.0074 0.01 ms
PBKDF2 iterations = 100000 12.6987 127 ms SHA2+bcrypt rounds = 12 38.6854 387 ms Argon2 m=512, t=2, p=2 0.1901 2 ms ## python version: 3.6.5 ## python compiler: GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.1) ## cpu model: Intel(R) Core(TM) i5-4250U CPU @ 1.30GHz
33 • 古いハッシュ形式・iterationsが少ないユーザー ◦ Djangoはログインのタイミングで自動的に強化 ◦ ログイン試行するだけでiterations数が増える関数も • 最近アクセスしていない人は変更されない ▪
長く続いているサービスはバッチで置き換えをする ハッシュ関数を変えた後は
django内でのhash関数 34 変数 algorithm, iterations, など 関数 encode, verify, safe_summary,
must_udpate, harden_runtime
パスワードハッシュが弱いと 35 防げたはずの問題だったとして 取り上げられたケースも https://www.wired.com/story/under-armour-myfitnesspal-hack- password-hashing/
Password Recovery 36
Password Recovery 37 パスワードを忘れてしまったとき Hashから元の文字列を実際に復元するには
hashcat 38 • 世界最速を謳うパスワードクラッカー • https://hashcat.net/hashcat/ • OSS (MIT) •
GPU, FPGAなど利用可能 • 200以上のhashに対応 ◦ Django (SHA-1) ◦ Django (PBKDF2-SHA256) 注: パスワードクラックを推奨するものではありません。
使い方 39 $ sqlite3 db.sqlite3 "SELECT password FROM auth_user;" >
django_pass.txt $ hashcat -m 10000 -a 0 django_pass.txt 10-million-password-list-top-10000.txt -O
パスワードリスト 40 • https://github.com/danielmiessler/SecLists • セキュリティ評価のためのユーザ名, パスワードなど
デモ 41
デモ結果 42 • パスワードリストに載ると一瞬 ◦ パスワードハッシュ関数を選んでも、辞書攻撃には弱い • 利用者には強いパスワードを利用してもらうのが大事 ◦ リストに乗ったものは利用させない
43 リストから消せばよい?
44 そのほか
45 オフライン攻撃が容易な箇所は注意が必要 • 秘密鍵 ◦ v2のsshkeyやed25519はKDFラウンド数指定可能(-a) • zip ◦ stretchなし
or hmac-sha1×1000ラウンド • Word, Excel ◦ 2007以降は50000〜100000ラウンド DBだけでなくファイルも注意 参考 https://www.slideshare.net/herumi/ss-57319518#4
パスワードハッシュで出来なくなること 46 • チャレンジレスポンス型認証 ◦ CHAP ◦ CRAM-MD5 ◦ DIGEST-MD5
• クライアントでワンタイムnonceを使ってハッシュを計算 ◦ サーバー側でも生passwordが必要
47 まとめ
まとめ 48 • Djangoは標準のパスワードハッシュでも問題はない ◦ Argon2を選ぶともっと良い ◦ Djangoのパスワードハッシュアルゴリズムの変更は容易 • 利用者は強いパスワードを使うこと
• 昔から動かしているサービスはハッシュ移行を検討 • Password management in Django に詳細