135
François Marier – @fmarier Securing the Web without site-specific passwords

Securing the Web without site-specific passwords

Embed Size (px)

DESCRIPTION

Has anyone else noticed that the OWASP Top 10 is not changing very much? Especially in the realm of authentication-related problems. I don't claim to have the one true solution for this, but one thing is certain: if we change how things are done on the web and relieve developers from having to store passwords, we can make things better. We need to let web developers outsource their authentication needs to people who can do it well. Does that mean we should force all of our users to join Facebook? Well not really. That might work for some sites, but outsourcing all of our logins to a single for-profit company isn't a solution that works for the whole web. The open web needs a better solution. One that enable users to choose their identity provider and shop for the most secure one if that's what they're into. This is the promise behind Persona and the BrowserID protocol. Choose your email provider carefully and let's get rid of all of these site-specific passwords that are just sitting there waiting to be leaked and cracked.

Citation preview

Page 1: Securing the Web without site-specific passwords

François Marier – @fmarier

Securing the Web without site-specific passwords

Page 2: Securing the Web without site-specific passwords

François Marier – @fmarier

F**k all of these passwords, we can do better than this!

Page 3: Securing the Web without site-specific passwords
Page 4: Securing the Web without site-specific passwords
Page 5: Securing the Web without site-specific passwords
Page 6: Securing the Web without site-specific passwords
Page 7: Securing the Web without site-specific passwords
Page 8: Securing the Web without site-specific passwords
Page 9: Securing the Web without site-specific passwords
Page 10: Securing the Web without site-specific passwords
Page 11: Securing the Web without site-specific passwords
Page 12: Securing the Web without site-specific passwords
Page 13: Securing the Web without site-specific passwords

problem #1:

passwords are hard to secure

Page 14: Securing the Web without site-specific passwords

bcrypt / scrypt / pbkdf2

per-user salt

site secret

password & lockout policies

secure recovery

Page 15: Securing the Web without site-specific passwords

bcrypt / scrypt / pbkdf2

per-user salt

site secret

password & lockout policies

secure recovery

Page 16: Securing the Web without site-specific passwords

bcrypt / scrypt / pbkdf2

per-user salt

site secret

password & lockout policies

secure recovery

Page 17: Securing the Web without site-specific passwords

bcrypt / scrypt / pbkdf2

per-user salt

site secret

password & lockout policies

secure recovery

Page 18: Securing the Web without site-specific passwords

bcrypt / scrypt / pbkdf2

per-user salt

site secret

password & lockout policies

secure recovery

Page 19: Securing the Web without site-specific passwords

bcrypt / scrypt / pbkdf2

per-user salt

site secret

password & lockout policies

secure recovery

20132013

passwordpassword

guidelines

guidelines

Page 20: Securing the Web without site-specific passwords

passwords are hard to secure

they are a liability

Page 21: Securing the Web without site-specific passwords

ALTER TABLE userDROP COLUMN password;

Page 22: Securing the Web without site-specific passwords

problem #2:

passwords are hard to remember

Page 23: Securing the Web without site-specific passwords
Page 24: Securing the Web without site-specific passwords
Page 25: Securing the Web without site-specific passwords

pick an easy password

Page 26: Securing the Web without site-specific passwords

pick an easy password

use it everywhere

Page 27: Securing the Web without site-specific passwords

negative externality:

sites that don't care about securityimpose a cost on more important sites

Page 28: Securing the Web without site-specific passwords

passwords are hard to remember

they need to be reset

Page 29: Securing the Web without site-specific passwords
Page 30: Securing the Web without site-specific passwords

controlemail

account

controlall

accounts=

Page 31: Securing the Web without site-specific passwords

existing login solutions

Page 32: Securing the Web without site-specific passwords

client certificates

Page 33: Securing the Web without site-specific passwords
Page 34: Securing the Web without site-specific passwords
Page 35: Securing the Web without site-specific passwords

decentralised

Page 36: Securing the Web without site-specific passwords

myid.com/u/francois

Page 37: Securing the Web without site-specific passwords
Page 38: Securing the Web without site-specific passwords
Page 39: Securing the Web without site-specific passwords

privacy®

Page 40: Securing the Web without site-specific passwords

existing login systemsare not good enough

Page 41: Securing the Web without site-specific passwords

ideal web-wide identity system

Page 42: Securing the Web without site-specific passwords

● decentralised● simple● cross-browser

ideal web-wide identity system

Page 43: Securing the Web without site-specific passwords

● decentralised● simple● cross-browser

ideal web-wide identity system

Page 44: Securing the Web without site-specific passwords

● decentralised● simple

cross-browser

ideal web-wide identity system

Page 45: Securing the Web without site-specific passwords

what if it were a standardpart of the web browser?

Page 46: Securing the Web without site-specific passwords
Page 47: Securing the Web without site-specific passwords

how does it work?

Page 50: Securing the Web without site-specific passwords

getting a proof of email ownership

Page 51: Securing the Web without site-specific passwords

authenticate?

Page 52: Securing the Web without site-specific passwords

authenticate?

public key

Page 53: Securing the Web without site-specific passwords

authenticate?

public key

signed public key

Page 54: Securing the Web without site-specific passwords

you have a signed statement from yourprovider that you own your email address

Page 55: Securing the Web without site-specific passwords
Page 56: Securing the Web without site-specific passwords

logging into a 3rd party site

Page 57: Securing the Web without site-specific passwords

Valid for: 2 minutes

wikipedia.org

assertion

Page 58: Securing the Web without site-specific passwords

Valid for: 2 minutes

wikipedia.org

check audience

assertion

Page 59: Securing the Web without site-specific passwords

Valid for: 2 minutes

wikipedia.org

check audiencecheck expiry

assertion

Page 60: Securing the Web without site-specific passwords

Valid for: 2 minutes

wikipedia.org

check audiencecheck expirycheck signature

assertion

Page 61: Securing the Web without site-specific passwords

assertion

Valid for: 2 minutes

wikipedia.org

public key

Page 62: Securing the Web without site-specific passwords

assertion

Valid for: 2 minutes

wikipedia.org

Page 63: Securing the Web without site-specific passwords

assertion

session cookie

Page 64: Securing the Web without site-specific passwords

demo #1:

http://www.voo.st/

[email protected]

Page 65: Securing the Web without site-specific passwords

Persona is already adecentralised system

Page 66: Securing the Web without site-specific passwords

SMS with PIN codes

Page 67: Securing the Web without site-specific passwords

SMS with PIN codes

Jabber / XMPP

Page 68: Securing the Web without site-specific passwords

SMS with PIN codes

Jabber / XMPP

Yubikeys

Page 69: Securing the Web without site-specific passwords

SMS with PIN codes

Jabber / XMPP

Yubikeys

LDAP accounts

Page 70: Securing the Web without site-specific passwords

SMS with PIN codes

Jabber / XMPP

Yubikeys

LDAP accounts

Client certificates

Page 71: Securing the Web without site-specific passwords

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": "..."}

Page 72: Securing the Web without site-specific passwords

decentralisation is the answer, but it's not

a product adoption strategy

Page 73: Securing the Web without site-specific passwords

we can't wait for all domainsto adopt Persona

Page 74: Securing the Web without site-specific passwords

we can't wait for all domainsto adopt Persona

solution: a temporarycentralised fallback

Page 75: Securing the Web without site-specific passwords

demo #2:

http://sloblog.io/

[email protected]

Page 76: Securing the Web without site-specific passwords

Persona already workswith all email domains

Page 77: Securing the Web without site-specific passwords

identity bridging

Page 78: Securing the Web without site-specific passwords

demo #3:

http://www.reasonwell.com/

[email protected]

Page 79: Securing the Web without site-specific passwords
Page 80: Securing the Web without site-specific passwords
Page 81: Securing the Web without site-specific passwords
Page 82: Securing the Web without site-specific passwords

Persona supportsall modern browsers

>= 8

Page 83: Securing the Web without site-specific passwords

Persona is decentralised,simple and cross-browser

Page 84: Securing the Web without site-specific passwords

it's simple for users, but is it also

simple for developers?

Page 85: Securing the Web without site-specific passwords
Page 86: Securing the Web without site-specific passwords

<script src=”https://login.persona.org/include.js”></script></body></html>

Page 87: Securing the Web without site-specific passwords

navigator.id.watch({ loggedInEmail: “[email protected]”, onlogin: function (assertion) { $.post('/login', {assertion: assertion}, function (data) { // do something } ); }, onlogout: function () { window.location = '/logout'; }});

Page 88: Securing the Web without site-specific passwords

navigator.id.watch({ loggedInUser: “[email protected]”, onlogin: function (assertion) { $.post('/login', {assertion: assertion}, function (data) { // do something } ); }, onlogout: function () { window.location = '/logout'; }});

Page 89: Securing the Web without site-specific passwords

navigator.id.watch({ loggedInUser: null, onlogin: function (assertion) { $.post('/login', {assertion: assertion}, function (data) { // do something } ); }, onlogout: function () { window.location = '/logout'; }});

Page 90: Securing the Web without site-specific passwords

navigator.id.watch({ loggedInUser: null, onlogin: function (assertion) { $.post('/login', {assertion: assertion}, function (data) { // do something } ); }, onlogout: function () { window.location = '/logout'; }});

Page 91: Securing the Web without site-specific passwords

navigator.id.watch({ loggedInUser: null, onlogin: function (assertion) { $.post('/login', {assertion: assertion}, function (data) { window.location = '/'; } ); }, onlogout: function () { window.location = '/logout'; }});

Page 92: Securing the Web without site-specific passwords
Page 93: Securing the Web without site-specific passwords

navigator.id.request()

Page 94: Securing the Web without site-specific passwords
Page 95: Securing the Web without site-specific passwords
Page 96: Securing the Web without site-specific passwords
Page 97: Securing the Web without site-specific passwords

navigator.id.watch({ loggedInUser: null, onlogin: function (assertion) { $.post('/login', {assertion: assertion}, function (data) { window.location = '/'; } ); }, onlogout: function () { window.location = '/logout'; }});

Page 98: Securing the Web without site-specific passwords

eyJhbGciOiJEUzEyOCJ9.eyJwdWJsaWMta2V5Ijp7ImFsZ29yaXRobSI6IkRTIiwieSI6ImNhZDg2ZDgyNWU0MjBkMGI4Njk5MjM4ZDM5ZTFjYjIyOGMyMTk1NWFiMzcwOTQ1YzExNzBhMzM4NjcyNDM0ZDJmNGYxZDg5ZjFkZjMzNmU1ZjZjZjk2YjhiOTlmMjgyNmFjNTYxZmI1YWMyYTc4ZjNhMzBkNGYxNTVhYjc3ZGExYmY3MWU4ZGMzNjQ0MmU2NjQ3MmE5Mjg0N2I2YjFlNDRkMTJlM2IwMjVjOWZmNTFmNDdhMWE5ZWYyMGZhOTVjMTcxZjBkMTYzNGE4ZTY4YTk5NWU3ZjFjY2FiYTJlOTRjYTI3ODE1ZWVkMTcxYjY1YTJmZGQzNTE1NjY3OTI0ZjUiLCJwIjoiZmY2MDA0ODNkYjZhYmZjNWI0NWVhYjc4NTk0YjM1MzNkNTUwZDlmMWJmMmE5OTJhN2E4ZGFhNmRjMzRmODA0NWFkNGU2ZTBjNDI5ZDMzNGVlZWFhZWZkN2UyM2Q0ODEwYmUwMGU0Y2MxNDkyY2JhMzI1YmE4MWZmMmQ1YTViMzA1YThkMTdlYjNiZjRhMDZhMzQ5ZDM5MmUwMGQzMjk3NDRhNTE3OTM4MDM0NGU4MmExOGM0NzkzMzQzOGY4OTFlMjJhZWVmODEyZDY5YzhmNzVlMzI2Y2I3MGVhMDAwYzNmNzc2ZGZkYmQ2MDQ2MzhjMmVmNzE3ZmMyNmQwMmUxNyIsInEiOiJlMjFlMDRmOTExZDFlZDc5OTEwMDhlY2FhYjNiZjc3NTk4NDMwOWMzIiwiZyI6ImM1MmE0YTBmZjNiN2U2MWZkZjE4NjdjZTg0MTM4MzY5YTYxNTRmNGFmYTkyOTY2ZTNjODI3ZTI1Y2ZhNmNmNTA4YjkwZTVkZTQxOWUxMzM3ZTA3YTJlOWUyYTNjZDVkZWE3MDRkMTc1ZjhlYmY2YWYzOTdkNjllMTEwYjk2YWZiMTdjN2EwMzI1OTMyOWU0ODI5YjBkMDNiYmM3ODk2YjE1YjRhZGU1M2UxMzA4NThjYzM0ZDk2MjY5YWE4OTA0MWY0MDkxMzZjNzI0MmEzODg5NWM5ZDViY2NhZDRmMzg5YWYxZDdhNGJkMTM5OGJkMDcyZGZmYTg5NjIzMzM5N2EifSwicHJpbmNpcGFsIjp7ImVtYWlsIjoiZm9vQG1vY2tteWlkLmNvbSJ9LCJpYXQiOjEzNzY1MzY0NjM1MTgsImV4cCI6MTM3NjU0MDA2MzUxOCwiaXNzIjoibW9ja215aWQuY29tIn0.IeUR0_3ayAZkdNSXjF4aaCwSHnHa4X1lzrjX-qkNcPIbXx1hmQQPwg~eyJhbGciOiJEUzEyOCJ9.eyJleHAiOjEzNzY1MzY3MDc2MzUsImF1ZCI6Imh0dHA6Ly9sb2NhbGhvc3QifQ.NJ8H1qZcWXbXfPJSdgB_mORHQ442ZkY0XYfdQsZZsIjooG7k7qWyVw

Page 99: Securing the Web without site-specific passwords

navigator.id.watch({ loggedInUser: null, onlogin: function (assertion) { $.post('/login', {assertion: assertion}, function (data) { window.location = '/home'; } ); }, onlogout: function () { window.location = '/logout'; }});

Page 100: Securing the Web without site-specific passwords

require_once('Auth/BrowserID.php');

$verifier = new Auth_BrowserID('http://123done.org');$result = $verifier->verifyAssertion($_POST['assertion']);

Page 101: Securing the Web without site-specific passwords

{ status: “okay”,

audience: “http://123done.org”,

expires: 1344849682560,

email: “[email protected]”,

issuer: “login.persona.org”}

Page 102: Securing the Web without site-specific passwords

require_once('Auth/BrowserID.php');

$verifier = new Auth_BrowserID('http://123done.org');$result = $verifier->verifyAssertion($_POST['assertion']);

if ($result->status === 'okay') { echo "Hi " . $result->email;} else { echo "Error: " . $result->reason;}

Page 103: Securing the Web without site-specific passwords

{ status: “failed”,

reason: “assertion has expired”}

Page 104: Securing the Web without site-specific passwords

require_once('Auth/BrowserID.php');

$verifier = new Auth_BrowserID('http://123done.org');$result = $verifier->verifyAssertion($_POST['assertion']);

if ($result->status === 'okay') { echo "Hi " . $result->email;} else { echo "Error: " . $result->reason;}

Page 105: Securing the Web without site-specific passwords
Page 106: Securing the Web without site-specific passwords
Page 107: Securing the Web without site-specific passwords

navigator.id.logout()

Page 108: Securing the Web without site-specific passwords

navigator.id.watch({ loggedInUser: null, onlogin: function (assertion) { $.post('/login', {assertion: assertion}, function (data) { window.location = '/home'; } ); }, onlogout: function () { window.location = '/logout'; }});

Page 109: Securing the Web without site-specific passwords
Page 110: Securing the Web without site-specific passwords

1. load javascript library

Page 111: Securing the Web without site-specific passwords

1. load javascript library

2. setup login & logout callbacks

Page 112: Securing the Web without site-specific passwords

1. load javascript library

2. setup login & logout callbacks

3. add login and logout buttons

Page 113: Securing the Web without site-specific passwords

1. load javascript library

2. setup login & logout callbacks

3. add login and logout buttons

4. verify proof of ownership

Page 114: Securing the Web without site-specific passwords

1. load javascript library

2. setup login & logout callbacks

3. add login and logout buttons

4. verify proof of ownership

no API keyneeded

Page 115: Securing the Web without site-specific passwords

you can add support forPersona in four easy steps

Page 116: Securing the Web without site-specific passwords

one simple request

Page 117: Securing the Web without site-specific passwords
Page 118: Securing the Web without site-specific passwords

building a new site:default to Persona

Page 119: Securing the Web without site-specific passwords

working on an existing site:add support for Persona

Page 120: Securing the Web without site-specific passwords

before

Page 121: Securing the Web without site-specific passwords

after

Page 122: Securing the Web without site-specific passwords

after

navigator.id.request()

Page 123: Securing the Web without site-specific passwords
Page 124: Securing the Web without site-specific passwords

ALTER TABLE userDROP COLUMN password;

Page 125: Securing the Web without site-specific passwords

To learn more about Persona:

https://login.persona.org/http://identity.mozilla.com/

https://developer.mozilla.org/docs/Persona/Why_Personahttps://developer.mozilla.org/docs/Persona/Quick_Setup

https://github.com/mozilla/browserid-cookbookhttps://developer.mozilla.org/docs/Persona/Libraries_and_plugins

http://123done.org/https://wiki.mozilla.org/Identity#Get_Involved

@fmarier http://fmarier.org

Page 126: Securing the Web without site-specific passwords

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"}

Page 127: Securing the Web without site-specific passwords

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

Page 128: Securing the Web without site-specific passwords

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

Page 129: Securing the Web without site-specific passwords

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

Page 130: Securing the Web without site-specific passwords

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

Page 131: Securing the Web without site-specific passwords

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

Page 132: Securing the Web without site-specific passwords

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

Page 133: Securing the Web without site-specific passwords

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

Page 134: Securing the Web without site-specific passwords

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

Page 135: Securing the Web without site-specific passwords

© 2013 François Marier <[email protected]>This work is licensed under aCreative Commons Attribution-ShareAlike 3.0 New Zealand License.

Top 500 passwords: http://xato.net/passwords/more-top-worst-passwords/

Parchment: https://secure.flickr.com/photos/27613359@N03/6750396225/

Cookie on tray: https://secure.flickr.com/photos/jamisonjudd/4810986199/

Uncle Sam: https://secure.flickr.com/photos/donkeyhotey/5666065982/

Australian passport: https://secure.flickr.com/photos/digallagher/5453987637/

Stop sign: https://secure.flickr.com/photos/artbystevejohnson/6673406227/

Photo credits: