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
5
4.1k
Password Hashing djangocongress 20180519
bungoume
May 19, 2018
Tweet
Share
More Decks by bungoume
See All by bungoume
djangocongressjp2023_password_hash
bungoume
2
1.4k
日経電子版でのDjango活用事例紹介 / djangocongressjp2022-nikkei
bungoume
4
6k
CircleCIの活用事例とCI高速化/circleci-community-meetup3-speedup
bungoume
3
1.5k
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
4.9k
Other Decks in Technology
See All in Technology
定期的な価値提供だけじゃない、スクラムが導くチームの共創化 / 20251004 Naoki Takahashi
shift_evolve
PRO
3
220
AIAgentの限界を超え、 現場を動かすWorkflowAgentの設計と実践
miyatakoji
0
110
研究開発部メンバーの働き⽅ / Sansan R&D Profile
sansan33
PRO
3
20k
Tomorrow graphlib, Let us use everybody
hayaosuzuki
0
160
Modern_Data_Stack最新動向クイズ_買収_AI_激動の2025年_.pdf
sagara
0
180
生成AIを活用したZennの取り組み事例
ryosukeigarashi
0
190
動画データのポテンシャルを引き出す! Databricks と AI活用への奮闘記(現在進行形)
databricksjapan
0
130
コンテキストエンジニアリングとは? 考え方と応用方法
findy_eventslides
4
870
成長自己責任時代のあるきかた/How to navigate the era of personal responsibility for growth
kwappa
3
230
Geospatialの世界最前線を探る [2025年版]
dayjournal
3
470
“2件同時配達”の開発舞台裏 〜出前館PMが挑んだダブルピック実現に向けた体験設計〜
demaecan
0
180
業務自動化プラットフォーム Google Agentspace に入門してみる #devio2025
maroon1st
0
180
Featured
See All Featured
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
The Language of Interfaces
destraynor
162
25k
Building an army of robots
kneath
306
46k
Optimising Largest Contentful Paint
csswizardry
37
3.4k
Product Roadmaps are Hard
iamctodd
PRO
54
11k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
54
3k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
132
19k
Java REST API Framework Comparison - PWX 2021
mraible
33
8.8k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.2k
Building Flexible Design Systems
yeseniaperezcruz
329
39k
Mobile First: as difficult as doing things right
swwweet
224
9.9k
BBQ
matthewcrist
89
9.8k
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 に詳細