SlideShare uma empresa Scribd logo
1 de 24
Baixar para ler offline
Shizuoka.py#3
Pythonで二段階認証
@aoshiman

2013.11.16
13年11月17日日曜日
自己紹介
• @aoshiman
• 静岡の食品会社で社内SEやってます
• 会社ではWindowsサーバとかVBAとか弄ってます
• Pythonは完全に趣味です
• Twitterbot @cookpad_recipe とかやってます
• ちなみに食品会社ですが、偽装はやっていません!!
13年11月17日日曜日
二段階認証を自分のブログに実装してみ
た
•自分のブログ Ubuntu on さくらVPS Python2.6 +  
Flask0.9
•毎朝、Logwatchレポートが届く
•毎日飽きもせず、phpMyAdmin攻撃を繰り返されて
いる
※phpMyAdmin攻撃とはPHP製MySQL管理ツール(GUI)の脆弱性を狙った飽
くなきアタックのこと

13年11月17日日曜日
俺、PHPなんて入れてねーよ(́・ω・`)

13年11月17日日曜日
とはいえコツコツ地道にログイン認証へのアタックを
続けられるのも精神的に嫌
最近まったくFlaskを触っていなかったということも
あり、リハビリを兼ねて二段階認証を実装してみた

13年11月17日日曜日
二段階認証とは
ユーザー認証後、もしくはユーザー認証と同時に、ユ
ーザー認証とは別要素の方法で認証する仕組み
ユーザー認証後

13年11月17日日曜日

ユーザー認証と同時
二段階認証は英語で Two Factor Authentication
調べていくと Two-step verificationという言い方もあ
る(Google Authenticator のサブタイトルがそう)
いくつか呼び方がありますが、深く調べていくときりが
ないのでこれ以降は日本語で二段階認証、英語でTwo
Factor Authenticationと呼びます

13年11月17日日曜日
なぜ二段階認証を採用するWebサービスが増えてきて
いるのだろうか ※とはいっても殆どが大きなサービスだが
(あくまでも私見だが)
◎ネガティブな要素
パスワードリスト攻撃の増加
パスワード使い回しの弊害が自サイトに影響をおよぼす
◎ポジティブな要素
スマフォ普及によりワンタイムパスワード発行アプリを
使用できるユーザーが増えた
Twilioの(開発者への)普及
13年11月17日日曜日
二段階認証の二段階目のバリエーション
現在の主流は何らかの方法で得た確認コードを画面に
入力させる
◎確認コードを入力させる

•SMS (TwilioAPIなど)
•電話(TwilioAPIなど)
•パスワード発行アプリ
(Google Authenticator、
FaceBookコードジェネレータ)

•パスワード発行デバイス
(RSA社 SecureID)
•乱数表

13年11月17日日曜日

◎確認ボタンを押す

•スマートフォンアプリ
二段階認証を採用しているサービス
◎確認コードを入力させる

◎確認ボタンを押す

•Twitter(米国)
•Facebook
•DropBox
•Evernote
•Gmail
•Google Apps
•GitHub
•WordPress
•その他いろいろな銀行
•PAMもある(sshログインな

•Twitter for iOS Android

ど)
13年11月17日日曜日
OATHについて
OATHとは

http://www.openauthentication.org/

ワンタイムパスワード発行アルゴリズムの標準化を目
指して設立された団体
Initiative For Open Authtication
中心企業にVerisgin Symantec Sandiskなど
※紛らわしいが、セキュアなWebAPI認証のOAuth(オーオース)とは別

OATHが取りまとめてRFCになっている仕様が
HOTP(RFC4226)An HMAC-Based One-Time Password Algorithm
TOTP(RFC6238)Time-Based One-Time Password Algorithm

13年11月17日日曜日
TOTPについて
先程申し上げたとおり、OATHが取りまとめてRFC
になっている仕様が
HOTP(RFC4226)An HMAC-Based One-Time Password Algorithm
TOTP(RFC6238)Time-Based One-Time Password Algorithm

もともとはHOTPありき、それを時刻同期ベースに拡
張したのがTOTP※HOTPはカウンターベース
HOTPはサーバとクライアントで回数を保持、及び同期を取る必要があるが、
TOTPはサーバとクライアントが各々正しい時刻をセットしていれば同期する必
要はない。

最近のWebサービス系二段階認証で採用されてきてい
るのはTOTP
13年11月17日日曜日
TOTPを利用したワンタイムパスワード
の発行
シークレットキーの作成
Base32文字列を使用

ABCDEFGHIJKLMNOPQRSTUVWXYZ234567

16文字のシークレットキーを使用するものが多い※推
奨は160bit(20文字)以上(RFC4226)
これ以降出てくるsecretには JBSWY3DPEHPK3PXP を使用します
(Base32におけるHexspeakのようです)
※Python2.7.5で確認しています
13年11月17日日曜日
TOTPを利用したワンタイムパスワード
の発行
タイムコードの作成
インターバルを何秒にするかを決定し、ユニックスタイムをインターバルで割る
※インターバルとは同一パスワードを何秒間発行するかということで、30秒が推
奨されている

これによって30秒間、同じタイムコードが生成される
インターバルを10秒にして確認すると理解しやすいかも
※Python2.7.5で確認しています
13年11月17日日曜日
TOTPを利用したワンタイムパスワード
の発行
HMACダイジェストの算出
Base32文字列から作成したシークレットキーをKey、タイムコードをMessage
として鍵付きハッシュを作成
ハッシュ関数にはSHA1、SHA256、SHA512などが使える(基本SAH1)

※Python2.7.5で確認しています
13年11月17日日曜日
TOTPを利用したワンタイムパスワード
の発行
オフセットの算出とビット演算及びワンタイムパスワード算出
•算出されたHMACの最後のバイト[19]を0xfでマスク(&)
•その値をオフセットとし、そのオフセットに基いてビット演算をする
•ビット演算した値を10 のパスワード桁数分の乗数(6桁なら 10 ** 6)で割る
•割った余りがワンタイムパスワードとなる(桁が足りなけれれば0埋め)

※Python2.7.5で確認しています
13年11月17日日曜日
TOTPを利用したワンタイムパスワード
の発行
この算出をサーバ、クライアントそれぞれ実施し、
答え合わせをする仕組み
インターバルに基づいたタイムコードが基準になって
いるため、インターバルが30秒ならば30秒間同じパ
スワードが生成される

13年11月17日日曜日
Google Authenticatorを利用する
Google AuthenticatorはGoogle謹製の
TOTP(HOTP)ベースのパスワード発行アプリ
これをユーザーに使用させているWebサービスは多い
Google Authenticatorへの登録を煩わしさを軽減す
るために設定値が記載されたQRコードの読み取りが
できる

13年11月17日日曜日
Google Authenticatorを利用する
KeyUriのフォーマット

これをQRコードに埋め込んで使用

otpauth://totp/shizuokapy@example.com?secret=JBSWY3DPEHPK3PXP&issuer=Shizuokapy

①

②

③

④

①TOTPかHOTPを指定
②user@domain(一意であればOK)
③シークレットコード
④発行者

その他パラメーター ※無ければデフォルト値を使用
Algorithm デフォルト SHA1 他 SHA256 SHA512
Digits デフォルト6
Period デフォルト30

13年11月17日日曜日
Google Authenticatorセッティング時
の注意
シークレットキーを盗まれない対策が必要
•公衆無線LANの環境でGoogle Authenticatorのセッティングをしない
(常時SSLならよいのだが。。)
•手動でセッティングする場合はショルダーハックに注意する
ワンタイムパスワードからシークレットキーを導き出すのはおそらく出来ないが・・
とあるWebサービスが
•インターバルが30秒
•ハッシュ作成時にSHA1を使用
•パスワードが6桁
•時刻が合っている
だった場合、
シークレットキーが盗まれれば同じパスワードを発行出来る可能性は高い

13年11月17日日曜日
二段階認証の実装時に気をつけたこと
クライアント側との時間のズレを考慮する
•15秒ずれているだけでも照合が不一致になる確率は50%
•例えば、ユニックスタイムを -30させたパスワードも許可させる
•クライアント側の時刻が進んでいる場合もあるのでそれも考慮するかどうか+30
但し、照合を甘くするとそれだけセキュリティ強度が弱くなる
6桁のパスワード 30秒間に 1/1,000,000 が 3/1,000,000になる

formに入力したパスワードとTOTPのパスワードの型
を合わせる(int or str)
おもいっきりハマりました。。

13年11月17日日曜日
まとめ
•TOTPは算出が複雑だけど公開情報があるので頑張
ればちゃんと作れる
•もし自社サービス等で二段階認証を行う場合、時間
のズレを考慮する。また、シークレットキーの扱いに
は注意!
•Google Authenticatorは便利ではあるがパスワード
を確認する作業が煩雑。なにか代替品を考えてみた
い。

13年11月17日日曜日
ご清聴ありがとうございました

13年11月17日日曜日
参考資料
RFC4226 6238
http://tools.ietf.org/html/rfc4226
http://tools.ietf.org/html/rfc6238
Flask製TFAサンプル及びデモサイト via Twilioの中の人
https://www.twilio.com/blog/2013/04/add-two-factor-authentication-toyour-website-with-google-authenticator-and-twilio-sms.html
OATHによるワンタイムパスワードの仕様
http://yamatamemo.blogspot.jp/2011/05/oath-1.html
http://yamatamemo.blogspot.jp/2011/05/oath-2.html
http://yamatamemo.blogspot.jp/2011/05/oath-3.html
Google Authenticator
http://code.google.com/p/google-authenticator/
Javascriptの実装
http://blog.tinisles.com/2011/10/google-authenticator-one-timepassword-algorithm-in-javascript/
13年11月17日日曜日

Mais conteúdo relacionado

Mais procurados

Unity ネイティブプラグインの作成について
Unity ネイティブプラグインの作成についてUnity ネイティブプラグインの作成について
Unity ネイティブプラグインの作成について
Tatsuhiko Yamamura
 

Mais procurados (20)

動的コンテンツをオリジンとしたCloudFrontを構築してみた
動的コンテンツをオリジンとしたCloudFrontを構築してみた動的コンテンツをオリジンとしたCloudFrontを構築してみた
動的コンテンツをオリジンとしたCloudFrontを構築してみた
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
 
20191030 AWS Black Belt Online Seminar AWS IoT Analytics Deep Dive
20191030 AWS Black Belt Online Seminar AWS IoT Analytics Deep Dive 20191030 AWS Black Belt Online Seminar AWS IoT Analytics Deep Dive
20191030 AWS Black Belt Online Seminar AWS IoT Analytics Deep Dive
 
Spring Social でソーシャルログインを実装する
Spring Social でソーシャルログインを実装するSpring Social でソーシャルログインを実装する
Spring Social でソーシャルログインを実装する
 
Spring native について
Spring native についてSpring native について
Spring native について
 
最近のKeycloakのご紹介 ~クライアントポリシーとFAPI~
最近のKeycloakのご紹介 ~クライアントポリシーとFAPI~最近のKeycloakのご紹介 ~クライアントポリシーとFAPI~
最近のKeycloakのご紹介 ~クライアントポリシーとFAPI~
 
NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...
NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...
NTTデータ流Infrastructure as Code~ 大規模プロジェクトを通して考え抜いた基盤自動化の新たな姿~(NTTデータ テクノロジーカンフ...
 
Azure API Management 俺的マニュアル
Azure API Management 俺的マニュアルAzure API Management 俺的マニュアル
Azure API Management 俺的マニュアル
 
分割と整合性と戦う
分割と整合性と戦う分割と整合性と戦う
分割と整合性と戦う
 
20200722 AWS Black Belt Online Seminar AWSアカウント シングルサインオンの設計と運用
20200722 AWS Black Belt Online Seminar AWSアカウント シングルサインオンの設計と運用20200722 AWS Black Belt Online Seminar AWSアカウント シングルサインオンの設計と運用
20200722 AWS Black Belt Online Seminar AWSアカウント シングルサインオンの設計と運用
 
20190814 AWS Black Belt Online Seminar AWS Serverless Application Model
20190814 AWS Black Belt Online Seminar AWS Serverless Application Model  20190814 AWS Black Belt Online Seminar AWS Serverless Application Model
20190814 AWS Black Belt Online Seminar AWS Serverless Application Model
 
今こそ知りたい!Microsoft Azureの基礎
今こそ知りたい!Microsoft Azureの基礎今こそ知りたい!Microsoft Azureの基礎
今こそ知りたい!Microsoft Azureの基礎
 
実装して理解するLINE LoginとOpenID Connect入門
実装して理解するLINE LoginとOpenID Connect入門実装して理解するLINE LoginとOpenID Connect入門
実装して理解するLINE LoginとOpenID Connect入門
 
Awsをオンプレドメコンに連携させる
Awsをオンプレドメコンに連携させるAwsをオンプレドメコンに連携させる
Awsをオンプレドメコンに連携させる
 
Keycloak拡張入門
Keycloak拡張入門Keycloak拡張入門
Keycloak拡張入門
 
ドメイン駆動設計 ~ユーザー、モデル、エンジニアの新たな関係~
ドメイン駆動設計 ~ユーザー、モデル、エンジニアの新たな関係~ドメイン駆動設計 ~ユーザー、モデル、エンジニアの新たな関係~
ドメイン駆動設計 ~ユーザー、モデル、エンジニアの新たな関係~
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
Unity ネイティブプラグインの作成について
Unity ネイティブプラグインの作成についてUnity ネイティブプラグインの作成について
Unity ネイティブプラグインの作成について
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
 
20210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #13
20210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #1320210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #13
20210127 今日から始めるイベントドリブンアーキテクチャ AWS Expert Online #13
 

Destaque

Webアプリでパスワード保護はどこまでやればいいか
Webアプリでパスワード保護はどこまでやればいいかWebアプリでパスワード保護はどこまでやればいいか
Webアプリでパスワード保護はどこまでやればいいか
Hiroshi Tokumaru
 

Destaque (8)

AeroGear & Java EE 7 で簡単プッシュ
AeroGear & Java EE 7 で簡単プッシュAeroGear & Java EE 7 で簡単プッシュ
AeroGear & Java EE 7 で簡単プッシュ
 
ソフトウェアテスト・ヒストリーの学び方 (WACATE 2010冬 クロージングセッション) 20101219
ソフトウェアテスト・ヒストリーの学び方 (WACATE 2010冬 クロージングセッション) 20101219ソフトウェアテスト・ヒストリーの学び方 (WACATE 2010冬 クロージングセッション) 20101219
ソフトウェアテスト・ヒストリーの学び方 (WACATE 2010冬 クロージングセッション) 20101219
 
IntelliJ IDEAで快適なPython生活
IntelliJ IDEAで快適なPython生活IntelliJ IDEAで快適なPython生活
IntelliJ IDEAで快適なPython生活
 
Webアプリでパスワード保護はどこまでやればいいか
Webアプリでパスワード保護はどこまでやればいいかWebアプリでパスワード保護はどこまでやればいいか
Webアプリでパスワード保護はどこまでやればいいか
 
Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編Spring bootでweb セキュリティ(ログイン認証)編
Spring bootでweb セキュリティ(ログイン認証)編
 
VPS借りたけどセキュリティが心配! 初心者が気をつけたいセキュリティの話
VPS借りたけどセキュリティが心配! 初心者が気をつけたいセキュリティの話VPS借りたけどセキュリティが心配! 初心者が気をつけたいセキュリティの話
VPS借りたけどセキュリティが心配! 初心者が気をつけたいセキュリティの話
 
C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!C#でもメタプログラミングがしたい!!
C#でもメタプログラミングがしたい!!
 
Java Web Application Security with Java EE, Spring Security and Apache Shiro ...
Java Web Application Security with Java EE, Spring Security and Apache Shiro ...Java Web Application Security with Java EE, Spring Security and Apache Shiro ...
Java Web Application Security with Java EE, Spring Security and Apache Shiro ...
 

Pythonで二段階認証