Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Djangoのパスワードハッシュアルゴリズムで_PyramidのWebアプリケーション作った.pdf
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
mizzsugar
May 19, 2020
Programming
970
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Djangoのパスワードハッシュアルゴリズムで_PyramidのWebアプリケーション作った.pdf
mizzsugar
May 19, 2020
More Decks by mizzsugar
See All by mizzsugar
自分のPCにPython環境を用意して_VSCodeでStreamlitアプリを動かすまでの8ステップ.pdf
mizzsugar
0
110
Colabのみで初心者向けPythonハンズオン.pdf
mizzsugar
0
85
厳しさとゆるさの間で迷う人に捧げる個人開発記
mizzsugar
0
76
SQLModel入門〜クエリと型〜
mizzsugar
3
1.6k
フルリモート向いてないと思っていた私が、なんだかんだ健やかに 1年半フルリモート出来ている話
mizzsugar
1
170
Djangoでのプロジェクトだって型ヒントを運用出来る!
mizzsugar
4
9.1k
「動くものは作れる」の一歩先へ 〜「自走プログラマー」の紹介〜
mizzsugar
0
660
pytestの第一歩 〜「テスト駆動Python」の紹介〜
mizzsugar
3
490
データ分析ツール開発でpoetryを使う選択肢
mizzsugar
1
1.2k
Other Decks in Programming
See All in Programming
How I Stole PSI from Android Studio - DroidKaigi2026
worker8
0
100
新人はどこまで自力でやり、どこからAIに頼るべきか/エンジニア育成に向き合う_先輩たちの悩みと知見共有会
toppan_digital_dev
1
600
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
160
XHTMLが残したもの
yosuke_furukawa
PRO
2
680
GKE で Pod の見方を変えたら、スケールアウト時の挙動を真に捉えられた話
stkk
0
110
型解析で実現する Go の言語内 DSL / Conference に Go! タイムテーブルの歩き方 for Gophers
mazrean
0
140
GraphRAGのKnowledge Graphを 直接!見る/View-GraphRAG's-KnowledgeGraph-directly!
tyumugi1113
1
280
AIとGame Jamで、ゲームを完成させた話
takahirosaeki
0
120
Claude Codeを組織的に動かして月400PRを実現した話
happy_ryo
0
270
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
3
280
デプロイ直後のレイテンシスパイクを調べたら、 Railsの仕様にたどり着いた
nhsykym
0
110
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
5
5.9k
Featured
See All Featured
Test your architecture with Archunit
thirion
2
2.4k
Everyday Curiosity
cassininazir
0
310
Statistics for Hackers
jakevdp
799
230k
We Are The Robots
honzajavorek
0
360
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
450
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
270
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Utilizing Notion as your number one productivity tool
mfonobong
4
580
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
500
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
520
Transcript
Djangoのパスワードハッシュア ルゴリズムで PyramidのWebアプリケーショ ン作った 2020-05-18 mizzsugar0425 @BPLL
お前誰よ • みずきと申します。 • Twitter @mizzsugar0425 • PythonでWebサービス開発してます。(本業Django, 副業Pyramid) •
PyConJPのCfPの締切に焦ってます(;´Д`)
今日話す話の対象となる人 • ある程度Djangoを使ったWebアプリケーションまたはサービスの開発をできる 人
今日話すこと • Djangoデフォルトパスワードアルゴリズムの説明(ざっくり) • Djangoのソースコードを一部適用させたのでライセンスの話 • 作ったアプリでどうやってパスワードアルゴリズムを適用させたか • 爆誕させたもの↓ https://github.com/mizzsugar/pyramid-app-with-django-password-hash
きっかけ
最近思うこと
Djangoは制約が多すぎて辛い
そうだ、リプレースすればいいんだ(雑)
いろいろやらないといけないこ とあるけど・・・ migrationファイルどーするの ログインユーザーのトークンとか ORMで発行したクエリ その他Djangoにまかせた何か
Djangoデフォルトの パスワードハッシュアルゴリズムを 他のWebフレームワークで使うには どうすれば?
Djangoのパスワードの仕組みたどってみた from django.contrib.auth.models import User user = User.objects.create(email='sample.example.com') user.set_password('password') #
パスワードハッシュ user.save() # return True user.check_password('password') # パスワードチェック
check_password, set_passwordが エントリポイントらしいぞ
たどったら django.contrib.auth.hashersモジュールの check_password(上), make_password(下) にたどり着いた。 https://github.com/django/django/blob/master/django/contrib/auth/hashers. py#L30 https://github.com/django/django/blob/master/django/contrib/auth/hashers. py#L64
色んなハッシュアルゴリズム使えるよう settings.pyのPASSWORD_HASHERSで使いたいパスワードアルゴリズムを定義 PASSWORD_HASHERS = [ 'django.contrib.auth.hashers.PBKDF2PasswordHasher', 'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher', 'django.contrib.auth.hashers.Argon2PasswordHasher', 'django.contrib.auth.hashers.BCryptSHA256PasswordHasher', ]
デフォルトのsettings.pyのPASSWORD_HASHERS https://docs.djangoproject.com/ja/3.0/topics/auth/passwords/#how-django-stores-passwords
デフォルトではどのアルゴリズムが? PASSWORD_HASHERS = [ 'django.contrib.auth.hashers.PBKDF2PasswordHasher', 'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher', 'django.contrib.auth.hashers.Argon2PasswordHasher', 'django.contrib.auth.hashers.BCryptSHA256PasswordHasher', ] このリストを読み込んで一番上のアルゴリズムのクラスを使う仕組み。
デフォルトだとdjango.contrib.auth.hashersモジュールの PBKDF2PassswordHasherクラスを使うよう。
これを適用するには? PBKDF2PassswordHasherクラスをコピペするのが楽だけど ライセンス大丈夫?
Djangoは3-clause BSD-3-Clauseライセンス 以下の条件下なら修正あり、なしに関わらずソースコードの再配布OK 1. ソースコードの再配布は、上記の著作権表示、ここに列挙された条件、および下記の免責条項を保 持すること。 2. バイナリ形式の再配布は、上記の著作権表示、ここに列挙された条件、および下記の免責条項は、ド キュメントまたは他の資料で配布すること。 3.
このソフトウェアのコントリビューター (貢献者)の名前は、特定の書面による事前の許可なしに、このソ フトウェアから派生した製品の保証または販売促進のために使用してはいけない。 https://opensource.org/licenses/BSD-3-Clause
リポジトリにDjangoライセンス明記 https://github.com/mizzsugar/pyramid-app-with-django-password-hash/blob/ master/LICENSE.Django
今回作ったリポジトリ自体のライセンス • BSD-3-Clauseにした • Django自身のライセンスよりもゆるくするのは怖いのでやめといた
今回作ったもののディレクトリ構成 • Djangoから取り入れた部分はビジネスロジックとは切り離してライブラリとして導 入する方針 • ビジネスロジックではmake_password, check_passwordを呼び出すだけにす る
├── LICENSE ├── LICENSE.Django ├── README.rst └── application ├── Makefile
├── migrations │ └── 0001_core.sql ├── mypy.ini ├── openapi.yaml ├── poetry.lock ├── sample │ ├── __init__.py │ ├── application.py │ ├── bootstrap.py │ ├── domain │ │ ├── __init__.py │ │ └── authentication.py(viewで呼び出す認証処理書いてる ) │ │ │ ├── libs │ │ ├── __init__.py │ │ ├── crypto.py(make_password, check_passwordに必要) │ │ ├── encoding.py(make_password, check_passwordに必要) │ │ ├── module_loading.py(make_password, check_passwordに必要) │ │ └── password.py(ここにmake_password, check_passwordがある) │ ├── repository │ ├── scripts │ ├── views │ └── wsgi.py └── tests ※一部省略しています。
パスワードチェックの実装 def sign_in(self, draft: sample.dto.SignIn) -> sample.domain.dto.User: try: user =
self._repository.authentication.fetch_by_email(draft.email) # DBアクセス except sample.repository.exceptions.NotFoundError: raise sample.domain.exceptions.InvalidCredentialError() if not sample.libs.password.check_password(draft.password, user.password): raise sample.domain.exceptions.InvalidCredentialError() return sample.domain.converters.User.from_repository(user)
パスワードを暗号化する実装 def register_user(self, draft: sample.domain.dto.DraftUser) -> None: password = sample.libs.password.make_password(draft.password)
# パスワードハッシュ try: self._repository.authentication.register_user( sample.repository.dto.DraftUser(email=draft.email, password=password)) # DBに登録 except sample.repository.exceptions.ConflictError: raise sample.domain.exceptions.AlreadyRegisteredError()
これからしたいこと • Djangoから得た部分のTypeHint • CIの設定 • パスワードのところもうちょっとテスト追加 • iterationの回数の増加タイミング見極め •
ログインした際のトークン発行
ありがとうございました。