@thisNatasha
Web Authentication:
a Future Without Passwords?
Natasha Rooney, @thisNatasha
@thisNatasha
Passwords are kinda
crud.
@thisNatasha
Hard to Remember
Causes users to
reuse passwords
@thisNatasha
Phishable
Tell me your
password and get
a free pen!
@thisNatasha
Rely on trust
No guarantee the
website won’t
get hacked...
@thisNatasha@thisNatasha
781 data breaches
in 2015
170m records stolen
Average $3.8m per breach
http://www.idtheftcenter.org/ITRC-Surveys-Studies/2015databreaches.html
@thisNatasha
@thisNatasha
"95% incidents involve
harvesting credentials stolen
from customer devices, then
logging into web applications
with them."
2015 Data Breach Investigations Report
@thisNatasha
Ha I know your passwordz
1. 123456
2. password
3. 12345678
4. qwerty
5. 12345
6. 123456789
7. football
8. 1234
9. 1234567
15. 1qaz2wsx
25. starwars (new!)
SplashData, compiled from more than 3.3 million leaked passwords during the 2015
@thisNatasha@thisNatasha
Some ways to help
We tried...
One time passcodes
Password aggregators
2 factor auth
@thisNatasha
All those methods are nice
but...
@thisNatasha
Still Phisable
and / or...
@thisNatasha
Security or
usability?
Make your choice.
@thisNatasha@thisNatasha
FIDO Alliance
Authentication Standards
Do not Sacrifice Usability
Privacy by Design
@thisNatasha
Bodies
Standards
Bodies
@thisNatasha
FIDO 2 step process
- User proves they have something
- Online using Public Key Cryptography
ONLINELOCAL
Authenticator
@thisNatasha
Quick intro to
Public Key Cryptography
@thisNatasha
Let’s get that Pikachu!
Jessie James
@thisNatasha@thisNatasha
Symmetric Crypto
(Caesar Cipher)
@thisNatasha
Key = 3
Let’s get that Pikachu!
=
Ohw’v jhw wkdw Slndfkx!
Jessie James
@thisNatasha
Key = 3
Let’s get that Pikachu!
=
Ohw’v jhw wkdw Slndfkx!
Jessie James
@thisNatasha
Key = 3
Let’s get that Pikachu!
=
Ohw’v jhw wkdw Slndfkx!
Jessie James
Ohw’v jhw wkdw Slndfkx!
=
Let’s get that Pikachu!
@thisNatasha@thisNatasha
Asymmetric Crypto
2 Keys
1 Secret Key
(keep it to yourself!)
1 Public Key
(share with others)
@thisNatasha
Jessie James
PUBLIC
@thisNatasha
Jessie James
Let’s get that Pikachu!
1cd87b63a2a933ca2...
PUBLIC
PUBLIC
@thisNatasha
Jessie James
Let’s get that Pikachu!
1cd87b63a2a933ca2...
Let’s get that Pikachu!
PUBLIC
PUBLIC
@thisNatasha
Jessie James
Let’s get that Pikachu!
1cd87b63a2a933ca2...
Let’s get that Pikachu!
PUBLIC
PUBLIC
PUBLIC
@thisNatasha
@thisNatasha
Does this key really
belong to james?
PUBLIC
@thisNatasha@thisNatasha
Certs
Certificate Authority (CA)
issues a Certificate
CA checks James’s identity
Digicert, Versign
(but anyone can be a CA)
@thisNatasha@thisNatasha
Certs
Certificate Authority (CA)
issues a Certificate
X.509
Version Number
Serial Number
Algorithm ID
Issuer
Validity period
Subject name
Subject Public Key Info
Certificate Signature Algorithm
Certificate Signature
...
@thisNatasha
Jessie James
Let’s get that Pikachu!
1cd87b63a2a933ca2...
Let’s get that Pikachu!
Giant Meowth
Certificate
Authority
PUBLIC
PUBLIC
@thisNatasha
@thisNatasha
Jessie James
Let’s get that Pikachu!
1cd87b63a2a933ca2...
Let’s get that Pikachu!
Giant Meowth
Certificate
Authority
PUBLIC
PUBLIC
@thisNatasha@thisNatasha
SSL / TLS
Also use
Public Key Cryptography
HTTPS
@thisNatasha
Back to FIDO...
@thisNatasha
FIDO 2 step process
- User proves they have something
- Online using Public Key Cryptography
ONLINELOCAL
Authenticator
@thisNatasha@thisNatasha
FIDO Frameworks UAF
U2F
2 Frameworks for your
convenience.
@thisNatasha
UAF: Universal Authentication Framework
- Same user as before?
- Biometric or otherwise
Challenge
1 2
?
3
@thisNatasha
U2F: Universal Second Factor
- Is a user present? Same as before?
- Prove you have something
1 2 3
Dongle / buttonVERIFICATION
AUTHENTICATION
@thisNatasha@thisNatasha
Registration
Creates Keys
Local:
- User does a normal login
- Invitation to use FIDO
- Keys created
Server:
- Public Key goes to Server
@thisNatasha@thisNatasha
Fido is kinda cool
because...
Deploy once for all
“authenticators”
No server has your
fingerprint (or other
biometric)
Usability
PKI stronger than user/pw
@thisNatasha
EXACTLY WHAT DOES THIS
HAVE TO DO WITH THE WEB?
@thisNatasha
@thisNatasha
Fido frameworks
Are coming to the web!
@thisNatasha
@thisNatasha@thisNatasha
WebAuth WG
3 Specs
Web Authentication API
Data Formats
Signature Formats
@thisNatasha
ONLINELOCAL
Authenticator
Web Authentication API
- Requesting asymmetric key pair
- Proving the browser has the private key
Setup User
Data
Send Public
Key
Local Browser
@thisNatasha
ONLINELOCAL
Authenticator
Web Authentication API
- Requesting asymmetric key pair
- Proving the browser has the private key
Ask for
Identity
Assertion
Prove we
have private
key
Local Browser
@thisNatasha
@thisNatasha
Registration
First Factor Auth
Device with own display
User is logged in.
var webauthnAPI = window.webauthn;
if (!webauthnAPI) { /* Platform not capable. Handle error. */ }
var userAccountInformation = {
rpDisplayName: "Acme", displayName: "John P. Smith",
name: "johnpsmith@example.com", id: "1098237235409872",
imageURL: "https://pics.acme.com/00/p/aBjjjpqPb.png"
};
// This Relying Party will accept any credential, but prefers an ES256 credential.
var cryptoParams = [
{
type: "ScopedCred", algorithm: "ES256"
},
{
type: "ScopedCred", algorithm: "RS256"
}
];
var challenge = "Y2xpbWIgYSBtb3VudGFpbg";
var timeoutSeconds = 300; // 5 minutes
var blacklist = []; // No blacklist
var extensions = {"webauthn.location": true}; // Include location information
// in attestation
// Note: The following call will cause the authenticator to display UI.
webauthnAPI.makeCredential(userAccountInformation, cryptoParams, challenge,
timeoutSeconds, blacklist, extensions)
.then(function (newCredentialInfo) {
// Send new credential info to server for verification and registration.
}).catch(function (err) {
// No acceptable authenticator or user refused consent. Handle appropriately.
});
@thisNatasha
Registration
First Factor Auth
Device with own display
User is logged in.
var webauthnAPI = window.webauthn;
if (!webauthnAPI) { /* Platform not capable. Handle error. */ }
var userAccountInformation = {
rpDisplayName: "Acme", displayName: "John P. Smith",
name: "johnpsmith@example.com", id: "1098237235409872",
imageURL: "https://pics.acme.com/00/p/aBjjjpqPb.png"
};
// This Relying Party will accept any credential, but prefers an ES256 credential.
var cryptoParams = [
{
type: "ScopedCred", algorithm: "ES256"
},
{
type: "ScopedCred", algorithm: "RS256"
}
];
var challenge = "Y2xpbWIgYSBtb3VudGFpbg";
var timeoutSeconds = 300; // 5 minutes
var blacklist = []; // No blacklist
var extensions = {"webauthn.location": true}; // Include location information
// in attestation
// Note: The following call will cause the authenticator to display UI.
webauthnAPI.makeCredential(userAccountInformation, cryptoParams, challenge,
timeoutSeconds, blacklist, extensions)
.then(function (newCredentialInfo) {
// Send new credential info to server for verification and registration.
}).catch(function (err) {
// No acceptable authenticator or user refused consent. Handle appropriately.
});
Credential Setup
@thisNatasha
Registration
First Factor Auth
Device with own display
User is logged in.
var webauthnAPI = window.webauthn;
if (!webauthnAPI) { /* Platform not capable. Handle error. */ }
var userAccountInformation = {
rpDisplayName: "Acme", displayName: "John P. Smith",
name: "johnpsmith@example.com", id: "1098237235409872",
imageURL: "https://pics.acme.com/00/p/aBjjjpqPb.png"
};
// This Relying Party will accept any credential, but prefers an ES256 credential.
var cryptoParams = [
{
type: "ScopedCred", algorithm: "ES256"
},
{
type: "ScopedCred", algorithm: "RS256"
}
];
var challenge = "Y2xpbWIgYSBtb3VudGFpbg";
var timeoutSeconds = 300; // 5 minutes
var blacklist = []; // No blacklist
var extensions = {"webauthn.location": true}; // Include location information
// in attestation
// Note: The following call will cause the authenticator to display UI.
webauthnAPI.makeCredential(userAccountInformation, cryptoParams, challenge,
timeoutSeconds, blacklist, extensions)
.then(function (newCredentialInfo) {
// Send new credential info to server for verification and registration.
}).catch(function (err) {
// No acceptable authenticator or user refused consent. Handle appropriately.
});
Credential is created.
Client finds the authenticator.
Authenticator shows UI
Authenticator returns response.
Send public key to sever.
@thisNatasha
Authentication
User visit site...
var webauthnAPI = window.webauthn;
if (!webauthnAPI) { /* Platform not capable. Handle error. */ }
var challenge = "Y2xpbWIgYSBtb3VudGFpbg";
var timeoutSeconds = 300; // 5 minutes
var whitelist = [{ type: "ScopedCred" }];
webauthnAPI.getAssertion(challenge, timeoutSeconds, whitelist)
.then(function (assertion) {
// Send assertion to server for verification
}).catch(function (err) {
// No acceptable credential or user refused consent. Handle appropriately.
});
Ask for identity assertion
Client finds authenticator
@thisNatasha
Authentication
User visit site...
var webauthnAPI = window.webauthn;
if (!webauthnAPI) { /* Platform not capable. Handle error. */ }
var challenge = "Y2xpbWIgYSBtb3VudGFpbg";
var timeoutSeconds = 300; // 5 minutes
var whitelist = [{ type: "ScopedCred" }];
webauthnAPI.getAssertion(challenge, timeoutSeconds, whitelist)
.then(function (assertion) {
// Send assertion to server for verification
}).catch(function (err) {
// No acceptable credential or user refused consent. Handle appropriately.
});
Ask for identity assertion
Client finds authenticator
@thisNatasha
Authentication
User visit site…
(no locally stored data)
var webauthnAPI = window.webauthn;
if (!webauthnAPI) { /* Platform not capable. Handle error. */ }
var challenge = "Y2xpbWIgYSBtb3VudGFpbg";
var timeoutSeconds = 300; // 5 minutes
var whitelist = [{ type: "ScopedCred" }];
webauthnAPI.getAssertion(challenge, timeoutSeconds, whitelist)
.then(function (assertion) {
// Send assertion to server for verification
}).catch(function (err) {
// No acceptable credential or user refused consent. Handle appropriately.
});
Authenticator returns response
Script sends assertion to server
Server validates
Onwards!
@thisNatasha
Must Use HTTPS
Security, yo.
Tips
@thisNatasha
Localstorage
Can be used for storing Credential ID.
Tips
@thisNatasha@thisNatasha
Warning!
Spec is being edited now!
All this could change...
@thisNatasha@thisNatasha
Recap
WebAuth (not now, but soon!)
Passwords are crud
Super Phisable
FIDO made some standards
UAF and U2F
Public Key Crypto
Symmetric and Asymmetric
W3C WebAuth Working Group
WebAuth API: Registration and
Authentication
@thisNatasha
Thank-you
People: Vijay Bharadwaj (Microsoft), Hubert Le Van Gong (PayPal),
Dirk Balfanz (Google), Alexei Czeskis (Google), Arnar Birgisson
(Google), Jeff Hodges (PayPal), Michael B. Jones (Microsoft), Rolf
Lindemann (Nok Nok Labs), Richard Barnes (Mozilla), Wendy Seltzer
(W3C), Anthony Nadalin, (Microsoft)
@thisNatasha
Extra for funsies.
@thisNatasha
Authentication
Same as before but with
locally stored data
& transaction
authorization extension
var challenge = "Y2xpbWIgYSBtb3VudGFpbg";
var timeoutSeconds = 300; // 5 minutes
var acceptableCredential1 = {
type: "ScopedCred",
id: "ISEhISEhIWhpIHRoZXJlISEhISEhIQo="
};
var acceptableCredential2 = {
type: "ScopedCred",
id: "cm9zZXMgYXJlIHJlZCwgdmlvbGV0cyBhcmUgYmx1ZQo="
};
var whitelist = [acceptableCredential1, acceptableCredential2];
var extensions = { 'webauthn.txauth.simple':
"Wave your hands in the air like you just don’t care" };
webauthnAPI.getAssertion(challenge, timeoutSeconds, whitelist, extensions)
.then(function (assertion) {
// Send assertion to server for verification
}).catch(function (err) {
// No acceptable credential or user refused consent. Handle appropriately.
});

Web Authentication: a Future Without Passwords?