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
Djangoのパスワードハッシュアルゴリズムで_PyramidのWebアプリケーション作った.pdf
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
厳しさとゆるさの間で迷う人に捧げる個人開発記
mizzsugar
0
62
SQLModel入門〜クエリと型〜
mizzsugar
3
1.5k
フルリモート向いてないと思っていた私が、なんだかんだ健やかに 1年半フルリモート出来ている話
mizzsugar
1
160
Djangoでのプロジェクトだって型ヒントを運用出来る!
mizzsugar
4
9.1k
「動くものは作れる」の一歩先へ 〜「自走プログラマー」の紹介〜
mizzsugar
0
640
pytestの第一歩 〜「テスト駆動Python」の紹介〜
mizzsugar
3
480
データ分析ツール開発でpoetryを使う選択肢
mizzsugar
1
1.2k
unittest.mockを使ってテストを書こう
mizzsugar
5
7k
変数に変数を代入したら?
mizzsugar
1
2.7k
Other Decks in Programming
See All in Programming
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
230
セキュリティの専門家じゃなくてもできる。「セキュリティ意識」をアップデートして サプライチェーン攻撃への耐性を高めよう。
tk3fftk
5
920
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
570
[2026年度第1回ORセミナー] 計画最適化ベンチャーと競技プログラミング人材
terryu16
0
270
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
4.5k
トークンをケチるな、設計しろ:GitHub Copilotを賢く使うコンテキスト戦略
ochtum
0
160
Mujeres en SEO Summit 2026 - Greatest Disaster Hits en Web Performance
guaca
0
200
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
740
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
190
AIだと陥りがちなJakarta EE最新技術への移行時の落とし穴と解決策
tnagao7
0
120
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
13k
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
400
Featured
See All Featured
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.4k
Utilizing Notion as your number one productivity tool
mfonobong
4
330
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2k
Automating Front-end Workflow
addyosmani
1370
210k
Mobile First: as difficult as doing things right
swwweet
225
10k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
210
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.2k
From π to Pie charts
rasagy
0
220
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
780
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の回数の増加タイミング見極め •
ログインした際のトークン発行
ありがとうございました。