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
WebAuthn for Java developers
Search
Yoshikazu Nojima
May 18, 2019
Programming
2
1.9k
WebAuthn for Java developers
An introduction to WebAuthn for Java developers
Yoshikazu Nojima
May 18, 2019
Tweet
Share
More Decks by Yoshikazu Nojima
See All by Yoshikazu Nojima
サーバーサイド開発者のためのパスキー入門
ynojima
4
790
Mavenパッケージの署名検証
ynojima
1
57
FIDO CTAP2 from Authenticator perspective
ynojima
2
890
WebAuthn & WebAuthn4J Introduction
ynojima
2
2.5k
Introduction to WebAuthn Testing API
ynojima
3
1.9k
WebAuthn from the relying-party view
ynojima
2
6k
WebAuthn in a nutshell - NTT Tech Conf #3 (ja)
ynojima
2
1.9k
Spring Securityでハードウェアトークン認証
ynojima
0
870
Other Decks in Programming
See All in Programming
CloudNativePGを布教したい
nnaka2992
0
110
第3回関東Kaggler会_AtCoderはKaggleの役に立つ
chettub
3
1.2k
Visual StudioのGitHub Copilotでいろいろやってみる
tomokusaba
1
210
技術を改善し続ける
gumioji
0
120
XStateを用いた堅牢なReact Components設計~複雑なClient Stateをシンプルに~ @React Tokyo ミートアップ #2
kfurusho
1
990
2025.2.14_Developers Summit 2025_登壇資料
0101unite
0
200
Jakarta EE meets AI
ivargrimstad
0
360
推しメソッドsource_locationのしくみを探る - はじめてRubyのコードを読んでみた
nobu09
2
310
dbt Pythonモデルで実現するSnowflake活用術
trsnium
0
260
Boost Performance and Developer Productivity with Jakarta EE 11
ivargrimstad
0
830
SwiftUI Viewの責務分離
elmetal
PRO
2
270
一休.com のログイン体験を支える技術 〜Web Components x Vue.js 活用事例と最適化について〜
atsumim
0
990
Featured
See All Featured
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
21
2.5k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.3k
Designing for humans not robots
tammielis
250
25k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
30
4.6k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
133
33k
Facilitating Awesome Meetings
lara
52
6.2k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
Optimising Largest Contentful Paint
csswizardry
34
3.1k
VelocityConf: Rendering Performance Case Studies
addyosmani
328
24k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
A Philosophy of Restraint
colly
203
16k
Transcript
Copyright © Yoshikazu Nojima 2018 Java開発者のためのWebAuthn入門 2019-05-18 JJUG CCC Spring
能島 良和 (@shiroica)
Copyright © Yoshikazu Nojima 2018 自己紹介 • 能島良和 • 通信キャリアでホスティングサービスの開発・運用
• 前職は通信キャリア系SIerで社内向けにSpringのPJ支援業務 • Apache CloudStack Commiter(活動休止中。。) • WebAuthn周りは趣味 • Twitter:@shiroica • GitHub:ynojima 1
Copyright © Yoshikazu Nojima 2018 突然ですが・・・ この中にオンラインサービスのアカウントを 乗っ取られた経験のある方はいますか? 2
Copyright © Yoshikazu Nojima 2018 恥ずかしながら私はあります・・・ 3
Copyright © Yoshikazu Nojima 2018 パスワードの限界 パスワードには以下の問題があります。 • フィッシング攻撃耐性 •
本物そっくりの偽物サイトを作成し、ユーザーを誤認させたうえでID/Passwordを入力させ詐取 • 精巧に作成されたフィッシングサイトは45%のユーザーが騙されるという研究結果も • リスト型攻撃耐性 • 脆弱な他サービスで流出したID/Passwordを用いた攻撃 • 自サービスは堅牢でも、ユーザーがパスワードを使いまわした場合、巻き添え被害の可能性 • モバイルデバイス対応 • モバイルデバイスでは複雑なパスワードの入力が不便 パスワード要求はユーザーの離脱率に顕著な悪影響 パスワード認証に代わる認証手段が必要 4
Copyright © Yoshikazu Nojima 2018 Web Authentication仕様とは 最近W3Cで勧告候補になった、パスワード認証の問題点を克服したセキュアな認証を 実現するためのWeb標準。セキュリティキーによる二段階認証や生体認証を実現。 ▪主な特徴
• 指紋認証や顔認証など認証方式を差し替え可能 • 生体情報をサーバーで保存せず、安全性が高い • フィッシング攻撃、 CSRF攻撃対策の組込 5
Copyright © Yoshikazu Nojima 2018 Web Authenticationの認証フロー(概略) • ユーザー登録 ユーザー
認証デバイス ブラウザ サーバー DB RP固有公開鍵 の保存 承認ジェスチャ (指紋スキャン等) の実施 • RP固有公開鍵 • Credential Id • ドメイン(RP Id)のハッ シュ • その他 を送信 • RP固有公開鍵 • Credential Id • ドメイン(RP Id)のハッシュ • その他 を送信 耐タンパ 領域 RP固有秘密鍵 を保存 RP固有公開鍵・秘密鍵ペアを生成 • チャレンジ • チャレンジ、ドメイン(RpId) その他のハッシュ クライアントデータのハッシュ、 RP Idに対する署名を生成 ドメイン(RP Id) チャレンジ その他の検証 耐タンパ 領域 • ローカル認証情報(生体情報等) を検証 ユーザー検証機能付き認証デバイスの場合
Copyright © Yoshikazu Nojima 2018 Web Authenticationの認証フロー(概略) • ユーザー認証 ユーザー
認証デバイス ブラウザ サーバー 承認ジェスチャ (指紋スキャン等) の実施 • Credential Id • 認証デバイスデータ • RP Idのハッシュ • フラグ • カウンタ • 資格情報データ • 署名 を送信 • Credential Id • チャレンジ、ドメイン (RpId)その他 • 認証デバイスデータ • RP Idのハッシュ • フラグ • カウンタ • 資格情報データ • 署名 を送信 • RP Idのハッシュ • チャレンジ、ドメイン(RpId) その他のハッシュ RP固有秘密鍵でRpIdのハッシュ、 フラグ、カウンタ、クライアント データのハッシュを署名 ドメイン(RP Id)、署名 チャレンジ、その他の検証 • チャレンジ を送信 ユーザー検証機能付き認証デバイスの場合 耐タンパ 領域 • ローカル認証情報(生体情報等) を検証 RP固有秘密鍵を読込 ローカル認証 公開鍵認証 DB RP固有公開鍵 の読込
Copyright © Yoshikazu Nojima 2018 WebAuthnの技術的な特徴 ローカル認証と公開鍵認証の組み合わせ • ローカル認証 •
ユーザーと認証デバイス間の認証 認証方式は交換可能(例:指紋認証、虹彩認証、PIN) • 公開鍵認証 • 認証デバイスとサーバー間の認証 8 ユーザー 認証デバイス サーバー ローカル認証 (指紋認証等) 公開鍵認証
Copyright © Yoshikazu Nojima 2018 生体認証をローカル認証とするメリット 生体認証をリモート認証とした場合のリスク • 生体情報は変更不可能なことから究極のプライバシー情報。取扱は慎重さが求められる •
サーバーに生体情報を保存する生体認証では、生体情報は経路上で様々な攻撃に晒される • WebAuthnでは生体情報が認証デバイスから外に流通せず、安全性が高い(ローカル認証) • クライアント(ブラウザ)とサーバーは公開鍵と、公開鍵で検証できる署名を受け取るのみ • 生体情報と秘密鍵は認証デバイスのTPMやセキュアエレメントのような耐タンパ領域に保存 • デメリット • 登録時に使用した認証デバイスがないと認証できない ※認証デバイスの保持を認証要素の1つと見做せる側面もある 9 ユーザー 認証デバイス ブラウザ サーバー DB 生体情報の 検証 承認ジェスチャ (生体情報) の提供 • 生体情報 • 生体情報
Copyright © Yoshikazu Nojima 2018 フィッシング攻撃に対する効果 • ユーザー認証 ユーザー 認証デバイス
ブラウザ サーバー 承認ジェスチャ (指紋スキャン等) の実施 • Credential Id • 認証デバイスデータ • RP Idのハッシュ • フラグ • カウンタ • 資格情報データ • 署名 を送信 • Credential Id • チャレンジ、ドメイン (RpId)その他 • 認証デバイスデータ • RP Idのハッシュ • フラグ • カウンタ • 資格情報データ • 署名 を送信 • RP Idのハッシュ • チャレンジ、ドメイン(RpId) その他のハッシュ RP固有秘密鍵でRpIdのハッシュ、 フラグ、カウンタ、クライアント データのハッシュを署名 • チャレンジ を送信 ユーザー検証機能付き認証デバイスの場合 耐タンパ 領域 • ローカル認証情報(生体情報等) を検証 RP固有秘密鍵を読込 ドメイン(RP Id)、署名 その他の検証 DB RP固有公開鍵 の読込 秘密鍵はRpId(≒ドメイン)毎に保存されており、 フィッシング攻撃で他ドメインから認証要求を受けて も秘密鍵は不正利用されない
Copyright © Yoshikazu Nojima 2018 リスト型攻撃に対する効果 • ユーザー認証 ユーザー 認証デバイス
ブラウザ サーバー 承認ジェスチャ (指紋スキャン等) の実施 • Credential Id • 認証デバイスデータ • RP Idのハッシュ • フラグ • カウンタ • 資格情報データ • 署名 を送信 • Credential Id • チャレンジ、ドメイン (RpId)その他 • 認証デバイスデータ • RP Idのハッシュ • フラグ • カウンタ • 資格情報データ • 署名 を送信 • RP Idのハッシュ • チャレンジ、ドメイン(RpId) その他のハッシュ RP固有秘密鍵でRpIdのハッシュ、 フラグ、カウンタ、クライアント データのハッシュを署名 • チャレンジ を送信 ユーザー検証機能付き認証デバイスの場合 耐タンパ 領域 • ローカル認証情報(生体情報等) を検証 RP固有秘密鍵を読込 ドメイン(RP Id)、署名 その他の検証 DB RP固有公開鍵 の読込 サーバー側に保存されるのはRP固有の公開鍵であり、 他サイトで漏洩してもリスト型攻撃を受ける心配は不要
Copyright © Yoshikazu Nojima 2018 モバイルデバイス対応 近年のスマホで充実している、生体認証(指紋、顔認識)を ローカル認証に活用することで、パスワードを打ち込む 煩雑さからユーザーを開放し、離脱率を抑えることが期待 12
Copyright © Yoshikazu Nojima 2018 サーバーサイド観点でのWebAuthn 13
Copyright © Yoshikazu Nojima 2018 サービス/システムにWebAuthnを導入する場合、 サーバーサイドで必要な対応 14 • ユーザー認証
ユーザー 認証デバイス ブラウザ サーバー 承認ジェスチャ (指紋スキャン等) の実施 • Credential Id • 認証デバイスデータ • RP Idのハッシュ • フラグ • カウンタ • 資格情報データ • 署名 を送信 • Credential Id • チャレンジ、ドメイン (RpId)その他 • 認証デバイスデータ • RP Idのハッシュ • フラグ • カウンタ • 資格情報データ • 署名 を送信 • RP Idのハッシュ • チャレンジ、ドメイン(RpId) その他のハッシュ RP固有秘密鍵でRpIdのハッシュ、 フラグ、カウンタ、クライアント データのハッシュを署名 ドメイン(RP Id)、署名 チャレンジ、その他の検証 • チャレンジ を送信 ユーザー検証機能付き認証デバイスの場合 耐タンパ 領域 • ローカル認証情報(生体情報等) を検証 RP固有秘密鍵を読込 DB RP固有公開鍵 の読込 フロントエンドからcredentialIdやチャレンジ、署名な どの認証情報を受信し、WebAuthn仕様で定められた 検証を実施 リプレイ攻撃防止用のチャレンジを送信
Copyright © Yoshikazu Nojima 2018 WebAuthn4Jとは • WebAuthnの登録・認証メッセージ検証用ライブラリ • Java製、Apache2ライセンス
• コミュニティベースの開発 • https://github.com/webauthn4j/webauthn4j ◼ 主な特徴 • 全Attestation Statement対応 • FIDO Allianceの準拠テストツールをパス • ポータビリティ • 依存ライブラリはJackson(JSON, CBOR処理)、Apache Kerby (ASN.1処理)、SLF4J(ログインタフェース)のみ。導入の障壁が少ない • テストサポート機能の充実 • Keycloak向け拡張モジュール開発中 • Spring Security拡張モジュール開発中 15
Copyright © Yoshikazu Nojima 2018 基本的な使用方法(登録) 16 // フロントエンドから受信したリクエスト、検証条件を詰めてコンテキストクラスを組立 WebAuthnRegistrationContext
registrationContext = new WebAuthnRegistrationContext(clientDataJSON, attestationObject, transports, serverProperty, userVerificationRequired); // Validatorの生成 WebAuthnRegistrationContextValidator webAuthnRegistrationContextValidator = WebAuthnRegistrationContextValidator.createNonStrictRegistrationContextValidator(); // 検証の実施 WebAuthnRegistrationContextValidationResponse response = webAuthnRegistrationContextValidator.validate(registrationContext); // Authenticatorインスタンスの組立 Authenticator authenticator = // アプリの要件にあわせ、Authenticatorインタフェースの独自実装利用可 new AuthenticatorImpl( response.getAttestationObject().getAuthenticatorData().getAttestedCredentialData(), response.getAttestationObject().getAttestationStatement(), response.getAttestationObject().getAuthenticatorData().getSignCount() ); save(authenticator); // 認証に備え、永続化(方式はアプリケーション依存)
Copyright © Yoshikazu Nojima 2018 // フロントエンドから受信したリクエスト、検証条件を詰めてコンテキストクラスを組立 WebAuthnAuthenticationContext authenticationContext =
new WebAuthnAuthenticationContext( credentialId, clientDataJSON, authenticatorData, signature, serverProperty, userVerificationRequired); // 永続化していたAuthenticatorの読込(方式はアプリケーション依存) Authenticator authenticator = load(credentialId); // Validatorの生成 WebAuthnAuthenticationContextValidator webAuthnAuthenticationContextValidator = new WebAuthnAuthenticationContextValidator(); // 検証の実施 WebAuthnAuthenticationContextValidationResponse response = webAuthnAuthenticationContextValidator.validate(authenticationContext, authenticator); // カウンタの更新(方式はアプリケーション依存) updateCounter( response.getAuthenticatorData().getAttestedCredentialData().getCredentialId(), response.getAuthenticatorData().getSignCount() ); 基本的な使用方法(認証) 17
Copyright © Yoshikazu Nojima 2018 テストサポート機能 • WebAuthnによるログインのテストを自動化する場合、 最大の問題は認証デバイスをどうするか •
WebAuthn4Jではテストサポート用に認証デバイスのエミュレータを用意 18 // 認証デバイスエミュレータの接続されたクライアントエミュレータを準備 private ClientPlatform clientPlatform = EmulatorUtil.createClientPlatform(new AndroidSafetyNetAuthenticator()); @Test void validate_test(){ String rpId = “example.com”; Challenge challenge = new DefaultChallenge(); AuthenticatorSelectionCriteria authenticatorSelectionCriteria = new AuthenticatorSelectionCriteria(AuthenticatorAttachment.CROSS_PLATFORM, true, UserVerificationRequirement.REQUIRED); PublicKeyCredentialParameters publicKeyCredentialParameters = new PublicKeyCredentialParameters(PublicKeyCredentialType.PUBLIC_KEY, COSEAlgorithmIdentifier.ES256); PublicKeyCredentialUserEntity publicKeyCredentialUserEntity = new PublicKeyCredentialUserEntity(); AuthenticationExtensionsClientInputs<RegistrationExtensionClientInput> extensions = new AuthenticationExtensionsClientInputs<>(); PublicKeyCredentialCreationOptions credentialCreationOptions = new PublicKeyCredentialCreationOptions( new PublicKeyCredentialRpEntity(rpId, “example.com”), publicKeyCredentialUserEntity, challenge, Collections.singletonList(publicKeyCredentialParameters), null, Collections.emptyList(), authenticatorSelectionCriteria, AttestationConveyancePreference.DIRECT, extensions ); // エミュレータによるCredentialの生成 PublicKeyCredential<AuthenticatorAttestationResponse, RegistrationExtensionClientOutput> publicKeyCredential = clientPlatform.create(credentialCreationOptions); // 以下省略 }
Copyright © Yoshikazu Nojima 2018 WebAuthn4Jのスコープ (1/2) 19 • ユーザー認証
ユーザー 認証デバイス ブラウザ サーバー 承認ジェスチャ (指紋スキャン等) の実施 • Credential Id • 認証デバイスデータ • RP Idのハッシュ • フラグ • カウンタ • 資格情報データ • 署名 を送信 • Credential Id • チャレンジ、ドメイン (RpId)その他 • 認証デバイスデータ • RP Idのハッシュ • フラグ • カウンタ • 資格情報データ • 署名 を送信 • RP Idのハッシュ • チャレンジ、ドメイン(RpId) その他のハッシュ RP固有秘密鍵でRpIdのハッシュ、 フラグ、カウンタ、クライアント データのハッシュを署名 ドメイン(RP Id)、署名 チャレンジ、その他の検証 • チャレンジ を送信 ユーザー検証機能付き認証デバイスの場合 耐タンパ 領域 • ローカル認証情報(生体情報等) を検証 RP固有秘密鍵を読込 DB RP固有公開鍵 の読込 スコープ外 スコープ外 スコープ • WebAuthn4JはWebAuthnの Attestation/Assertionの検証のみを実施 する単機能ライブラリ • HTTPリクエストからのAttestation/ Assertionの取出処理、DBへの永続化 はスコープ外 • Servlet APIなど、特定のAPIに 依存しない為の設計
Copyright © Yoshikazu Nojima 2018 WebAuthn4Jのスコープ (2/2) • ギャップへの対応 •
認証フレームワークに合わせたアダプタライブラリを準備 • Spring Security • Spring Security WebAuthnというExtensionを開発中 • Spring Securityに則ったWebAuthn実装を提供 • Spring SecurityのAuthenticationProviderインタフェースの実装 • WebAuthnオプション提供用RESTエンドポイントServletFilter • 認証用ServletFilter • JavaConfig • 等々 • Spring Security本体にPull Request中 20
Copyright © Yoshikazu Nojima 2018 まとめ • パスワード認証には限界がある • フィッシング攻撃対応
• リスト型攻撃対応 • モバイルデバイス対応 • W3Cで新しい認証方式としてWeb Authentication仕様の策定が進められている • ローカル認証と公開鍵認証の組み合わせ • 生体情報をサーバーで保存する必要がなく安全性が高い • 仕様としてフィッシング攻撃対策、CSRF攻撃対策を盛込済 • 主要ブラウザで実装が進行中 • Edge/Chrome/Firefox/Safari • サーバーサイドの実装を補助する為、WebAuthn4JというJavaライブラリを開発 • Spring SecurityやKeycloak向けにアダプタ開発中 21