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
3.9k
Password Hashing djangocongress 20180519
bungoume
May 19, 2018
Tweet
Share
More Decks by bungoume
See All by bungoume
djangocongressjp2023_password_hash
bungoume
2
1.2k
日経電子版でのDjango活用事例紹介 / djangocongressjp2022-nikkei
bungoume
4
5.2k
CircleCIの活用事例とCI高速化/circleci-community-meetup3-speedup
bungoume
3
1.5k
OSSで始めるセキュリティログ収集/oss-securitylog-builderscon2017
bungoume
29
11k
日経電子版のアプリ開発を支えるログ活用術/nikkei-log-201609
bungoume
1
1.3k
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
4th place solution Eedi - Mining Misconceptions in Mathematics
rist
0
140
偏光画像処理ライブラリを作った話
elerac
1
170
開発組織を進化させる!AWSで実践するチームトポロジー
iwamot
1
340
データベースの負荷を紐解く/untangle-the-database-load
emiki
2
500
ABWG2024採択者が語るエンジニアとしての自分自身の見つけ方〜発信して、つながって、世界を広げていく〜
maimyyym
1
130
AWS Well-Architected Frameworkで学ぶAmazon ECSのセキュリティ対策
umekou
2
140
データエンジニアリング領域におけるDuckDBのユースケース
chanyou0311
9
2.2k
Potential EM 制度を始めた理由、そして2年後にやめた理由 - EMConf JP 2025
hoyo
2
2.6k
ウォンテッドリーのデータパイプラインを支える ETL のための analytics, rds-exporter / analytics, rds-exporter for ETL to support Wantedly's data pipeline
unblee
0
120
Iceberg Meetup Japan #1 : Iceberg and Databricks
databricksjapan
0
340
脳波を用いた嗜好マッチングシステム
hokkey621
0
280
わたしがEMとして入社した「最初の100日」の過ごし方 / EMConfJp2025
daiksy
14
4.9k
Featured
See All Featured
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
129
19k
The Cost Of JavaScript in 2023
addyosmani
47
7.4k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
Bootstrapping a Software Product
garrettdimon
PRO
306
110k
Writing Fast Ruby
sferik
628
61k
The Language of Interfaces
destraynor
156
24k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Faster Mobile Websites
deanohume
306
31k
Agile that works and the tools we love
rasmusluckow
328
21k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
27
1.6k
Why You Should Never Use an ORM
jnunemaker
PRO
55
9.2k
What's in a price? How to price your products and services
michaelherold
244
12k
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 に詳細