SlideShare a Scribd company logo
François Marier – @fmarier
Killing Passwords
with JavaScript
Killing Passwords with JavaScript
Killing Passwords with JavaScript
Killing Passwords with JavaScript
Killing Passwords with JavaScript
Killing Passwords with JavaScript
Killing Passwords with JavaScript
Killing Passwords with JavaScript
Killing Passwords with JavaScript
Killing Passwords with JavaScript
Killing Passwords with JavaScript
problem #1:
passwords are hard to secure
bcrypt / scrypt / pbkdf2
per-user salt
site secret
password & lockout policies
secure recovery
bcrypt / scrypt / pbkdf2
per-user salt
site secret
password & lockout policies
secure recovery
bcrypt / scrypt / pbkdf2
per-user salt
site secret
password & lockout policies
secure recovery
bcrypt / scrypt / pbkdf2
per-user salt
site secret
password & lockout policies
secure recovery
bcrypt / scrypt / pbkdf2
per-user salt
site secret
password & lockout policies
secure recovery
bcrypt / scrypt / pbkdf2
per-user salt
site secret
password & lockout policies
secure recovery
2013
2013
password
password
guidelines
guidelines
passwords are hard to secure
they are a liability
ALTER TABLE user
DROP COLUMN password;
problem #2:
passwords are hard to remember
Killing Passwords with JavaScript
Killing Passwords with JavaScript
pick an easy password
pick an easy password
use it everywhere
passwords are hard to remember
they need to be reset
Killing Passwords with JavaScript
control
email
account
control
all
accounts
=
Killing Passwords with JavaScript
“People want
a little dating
before marriage.”
Eric Vishria – Rockmelt
Killing Passwords with JavaScript
decentralised
myid.com/u/francois
Killing Passwords with JavaScript
Killing Passwords with JavaScript
privacy®
existing login systems
are not good enough
ideal web-wide identity system
●
decentralised
●
simple
●
cross-browser
ideal web-wide identity system
●
decentralised
●
simple
●
cross-browser
ideal web-wide identity system
●
decentralised
●
simple
cross-browser
ideal web-wide identity system
what if it were a standard
part of the web browser?
Killing Passwords with JavaScript
how does it work?
fmarier@gmail.com
fmarier@gmail.com
demo #1:
http://www.voo.st/
http://www.debuggex.com
fmariertest@eyedee.me
Persona is already a
decentralised system
SMS with PIN codes
SMS with PIN codes
Jabber / XMPP
SMS with PIN codes
Jabber / XMPP
Yubikeys
SMS with PIN codes
Jabber / XMPP
Yubikeys
LDAP accounts
SMS with PIN codes
Jabber / XMPP
Yubikeys
LDAP accounts
Client certificates
SMS with PIN codes
Jabber / XMPP
Yubikeys
LDAP accounts
Client certificates
Password-wrapped secret key
{
"public-key": {
"algorithm":
"RS",
"n":"685484565272...",
"e":"65537"
},
"encrypted-private-key": {
"iv": "tmg7gztUQT...",
"salt": "JMtGwlF5UWY",
"ct": "8DdOjD1IA1..."
},
"authentication": "...",
"provisioning": "..."
}
decentralisation is the answer, but it's not
a product adoption strategy
we can't wait for all browsers
to adopt Persona
navigator.id.*
Killing Passwords with JavaScript
Killing Passwords with JavaScript
Killing Passwords with JavaScript
we can't wait for all browsers
to adopt Persona
solution: a temporary
javascript shim
L
I
F
D
Locally
Isolated
Feature
Domain
goal: trusted code
running in the browser
login.persona.org
localStorage
localStorage.setItem("key", serializedKey);
var serializedKey = localStorage.getItem("key");
storage tied to
login.persona.org
window.postMessage()
https://login.persona.org
localStorage
postMessage
Persona supports
all modern browsers
>= 8
we can't wait for all domains
to adopt Persona
we can't wait for all domains
to adopt Persona
solution: a temporary
centralised fallback
demo #2:
http://sloblog.io/
fmariertest@aol.com
Persona already works
with all email domains
identity bridging
demo #3:
http://www.reasonwell.com/
fmariertest@yahoo.com
Killing Passwords with JavaScript
Killing Passwords with JavaScript
Persona works everywhere
lessons learned
#1user testing
is critical
Killing Passwords with JavaScript
Killing Passwords with JavaScript
Killing Passwords with JavaScript
Killing Passwords with JavaScript
Killing Passwords with JavaScript
#2nobody wants
to be first
“how many users
does Persona have?”
Killing Passwords with JavaScript
700,000,000
#3if a problem has
been around for a
while, it's probably
a hard one
see if you can solve
part of the problem
$ ssh francois@myserver.com
francois@myserver.com's password:
Killing Passwords with JavaScript
Persona is a simple
solution for
signing into the web
how simple is it
for developers?
how simple is it
for developers?
4 easy steps
https://developer.mozilla.org/docs/Persona/Quick_Setup
1. load javascript library
<script src=”https://login.persona.org/include.js”>
1. load javascript library
2. setup login & logout callbacks
navigator.id.watch(...);
1. load javascript library
2. setup login & logout callbacks
navigator.id.watch(...);
1. load javascript library
2. setup login & logout callbacks
3. add login and logout buttons
navigator.id.request();
navigator.id.logout();
1. load javascript library
2. setup login & logout callbacks
3. add login and logout buttons
4. verify proof of ownership
1. load javascript library
2. setup login & logout callbacks
3. add login and logout buttons
4. verify proof of ownership
no API key
needed
one small request
Killing Passwords with JavaScript
building a new site:
default to Persona
working on an existing site:
add support for Persona
before
after
after
navigator.id.request()
Killing Passwords with JavaScript
ALTER TABLE user
DROP COLUMN password;
To learn more about Persona:
https://login.persona.org/
http://identity.mozilla.com/
https://developer.mozilla.org/docs/Persona/Why_Persona
https://developer.mozilla.org/docs/Persona/Quick_Setup
https://github.com/mozilla/browserid-cookbook
https://developer.mozilla.org/docs/Persona/Libraries_and_plugins
https://wiki.mozilla.org/Identity#Get_Involved
@fmarier http://fmarier.org
identity provider API
https://eyedee.me/.well-known/browserid:
{
"public-key": {
"algorithm":"RS",
"n":"8606...",
"e":"65537"
},
"authentication": "/browserid/sign_in.html",
"provisioning": "/browserid/provision.html"
}
https://eyedee.me/.well-known/browserid:
{
"public-key": {
"algorithm":"RS",
"n":"8606...",
"e":"65537"
},
"authentication": "/browserid/sign_in.html",
"provisioning": "/browserid/provision.html"
}
identity provider API
https://eyedee.me/.well-known/browserid:
{
"public-key": {
"algorithm":"RS",
"n":"8606...",
"e":"65537"
},
"authentication": "/browserid/sign_in.html",
"provisioning": "/browserid/provision.html"
}
identity provider API
https://eyedee.me/.well-known/browserid:
{
"public-key": {
"algorithm":"RS",
"n":"8606...",
"e":"65537"
},
"authentication": "/browserid/sign_in.html",
"provisioning": "/browserid/provision.html"
}
identity provider API
https://eyedee.me/.well-known/browserid:
{
"public-key": {
"algorithm":"RS",
"n":"8606...",
"e":"65537"
},
"authentication": "/browserid/sign_in.html",
"provisioning": "/browserid/provision.html"
}
identity provider API
identity provider API
1. check for your /.well-known/browserid
2. try the provisioning endpoint
3. show the authentication page
4. call the provisioning endpoint again
identity provider API
1. check for your /.well-known/browserid
2. try the provisioning endpoint
3. show the authentication page
4. call the provisioning endpoint again
identity provider API
1. check for your /.well-known/browserid
2. try the provisioning endpoint
3. show the authentication page
4. call the provisioning endpoint again
identity provider API
1. check for your /.well-known/browserid
2. try the provisioning endpoint
3. show the authentication page
4. call the provisioning endpoint again
© 2013 François Marier <francois@mozilla.com>
This work is licensed under a
Creative Commons Attribution-ShareAlike 3.0 New Zealand License.
Laptop password: https://secure.flickr.com/photos/reidrac/4696900602/
Top 500 passwords: http://xato.net/passwords/more-top-worst-passwords/
Restaurant dinner: https://secure.flickr.com/photos/yourdon/3977084094/
Parchment: https://secure.flickr.com/photos/27613359@N03/6750396225/
Yubikey: https://secure.flickr.com/photos/knk/3379897261/
Stop sign: https://secure.flickr.com/photos/artbystevejohnson/6673406227/
Photo credits:

More Related Content

Killing Passwords with JavaScript