{"id":2397,"date":"2018-01-25T14:47:17","date_gmt":"2018-01-25T13:47:17","guid":{"rendered":"http:\/\/blog.mozilla.org\/press-de\/?p=2397"},"modified":"2018-01-25T14:47:17","modified_gmt":"2018-01-25T13:47:17","slug":"wie-hardware-token-basierte-zwei-faktor-authentifizierung-mit-der-webauthn-api-funktioniert","status":"publish","type":"post","link":"https:\/\/blog.mozilla.org\/press-de\/2018\/01\/25\/wie-hardware-token-basierte-zwei-faktor-authentifizierung-mit-der-webauthn-api-funktioniert\/","title":{"rendered":"Wie Hardware-Token-basierte Zwei-Faktor-Authentifizierung mit der WebAuthn-API funktioniert"},"content":{"rendered":"<p>Um eine h\u00f6here Sicherheit f\u00fcr die Anmeldung zu gew\u00e4hrleisten, setzen Webseiten eine Zwei-Faktor-Authentifizierung (2FA) ein, wobei derzeit h\u00e4ufig eine Smartphone-App oder Textnachrichten verwendet werden. Diese Mechanismen erschweren das <a href=\"https:\/\/developer.mozilla.org\/de\/docs\/Mozilla\/Phishing\" target=\"_blank\" rel=\"noopener\">Phishing<\/a>, k\u00f6nnen es aber nicht vollst\u00e4ndig verhindern &#8211; Benutzer k\u00f6nnen immer noch dazu verleitet werden, Codes weiterzugeben und auch SMS-Nachrichten sind nicht vor Abfangen gesch\u00fctzt.<\/p>\n<p>Firefox 60 wird mit standardm\u00e4\u00dfig aktivierter <a href=\"https:\/\/www.w3.org\/TR\/webauthn\/\" target=\"_blank\" rel=\"noopener\">WebAuthn-API<\/a> ausgeliefert. Diese bietet eine Zwei-Faktor-Authentifizierung, die auf <a href=\"https:\/\/de.wikipedia.org\/wiki\/Asymmetrisches_Kryptosystem\" target=\"_blank\" rel=\"noopener\">Public-Key-Kryptographie<\/a> basiert und die gegen Phishing, wie wir es heute kennen, immun ist. In dieser Einf\u00fchrung erfahren Sie, wie Sie Millionen von Nutzern, die bereits im Besitz von <a href=\"https:\/\/de.wikipedia.org\/wiki\/U2F\" target=\"_blank\" rel=\"noopener\">FIDO U2F USB-Token<\/a> sind, absichern k\u00f6nnen.<\/p>\n<p><b>Registrierung von Zweit-Faktoren<\/b><\/p>\n<p>Beginnen wir mit einem einfachen Beispiel: Eine Webseite fordert ein neues Credential an, das mit einem standardm\u00e4\u00dfigen, \u00fcber USB angeschlossenen FIDO U2F-Ger\u00e4t kompatibel ist. Es gibt viele dieser kompatiblen Token, die Yubikey, U2F Zero oder auch anders hei\u00dfen:<\/p>\n<pre><code class=\"js hljs javascript\"><span class=\"hljs-keyword\">const<\/span> cose_alg_ECDSA_w_SHA256 = <span class=\"hljs-number\">-7<\/span>;\r\n\r\n<span class=\"hljs-comment\">\/* Die Challenge wird vom Server generiert. *\/<\/span>\r\n<span class=\"hljs-keyword\">let<\/span> challenge = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">Uint8Array<\/span>([<span class=\"hljs-number\">21<\/span>,<span class=\"hljs-number\">31<\/span>,<span class=\"hljs-number\">105<\/span> <span class=\"hljs-comment\">\/* 29 weitere, vom Server zuf\u00e4llig generierte Bytes *\/<\/span>]);\r\n<span class=\"hljs-keyword\">let<\/span> pubKeyCredParams = [{\r\n  <span class=\"hljs-attr\">type<\/span>: <span class=\"hljs-string\">\"public-key\"<\/span>,\r\n  <span class=\"hljs-attr\">alg<\/span>: cose_alg_ECDSA_w_SHA256\r\n}];\r\n<span class=\"hljs-keyword\">let<\/span> rp = {\r\n  <span class=\"hljs-attr\">name<\/span>: <span class=\"hljs-string\">\"Test Website\"<\/span>\r\n};\r\n<span class=\"hljs-keyword\">let<\/span> user = {\r\n  <span class=\"hljs-attr\">name<\/span>: <span class=\"hljs-string\">\"Firefox User &lt;firefox@example.com&gt;\"<\/span>,\r\n  <span class=\"hljs-attr\">displayName<\/span>: <span class=\"hljs-string\">\"Firefox User\"<\/span>,\r\n  <span class=\"hljs-attr\">id<\/span>: <span class=\"hljs-keyword\">new<\/span> TextEncoder(<span class=\"hljs-string\">\"utf-8\"<\/span>).encode(<span class=\"hljs-string\">\"firefox@example.com\"<\/span>)\r\n};\r\n\r\n<span class=\"hljs-keyword\">let<\/span> publicKey = {challenge, pubKeyCredParams, rp, user};\r\nnavigator.credentials.create({publicKey})\r\n  .then(decodeCredential);<\/code><\/pre>\n<p>Werden USB U2F-Token verwendet, warten alle kompatiblen Token, die mit dem System des Nutzers verbunden sind, auf eine Interaktion mit diesem. Sobald der Nutzer eines der Ger\u00e4te ber\u00fchrt, wird ein neues Credential generiert und das <i>Promise<\/i> aufgel\u00f6st.<\/p>\n<p>Die benutzerdefinierte Funktion\u00a0<i><code>decodeCredential()<\/code><\/i>dekodiert die Antwort, um eine Schl\u00fcsselkennung zu erhalten. Diese ist entweder eine ID f\u00fcr das auf dem Ger\u00e4t gespeicherte ECDSA-Schl\u00fcsselpaar oder das ECDSA-Schl\u00fcsselpaar selbst, verschl\u00fcsselt mit einem geheimen, ger\u00e4tespezifischen Schl\u00fcssel. Der \u00f6ffentliche Schl\u00fcssel, der zum ECDSA-Paar geh\u00f6rt, wird im Klartext gesendet.<\/p>\n<p>Die Schl\u00fcsselkennung, der \u00f6ffentliche Schl\u00fcssel und eine Signatur m\u00fcssen vom Backend mittels der zuf\u00e4lligen <em>Challenge<\/em> verifiziert werden. Da ein Credential kryptographisch an die Webseite gebunden ist, die es angefordert hat, w\u00fcrde dieser Schritt fehlschlagen, sollten die urspr\u00fcnglichen Angaben nicht \u00fcbereinstimmen. Dies verhindert die Wiederverwendung von Credentials, die f\u00fcr andere Webseiten generiert wurden.<\/p>\n<p>Sofern erfolgreich, werden Schl\u00fcsselkennung und \u00f6ffentlicher Schl\u00fcssel fortan dem aktuellen Benutzer zugeordnet. Die WebAuthn-API setzt keine spezifische Browser-Benutzeroberfl\u00e4che voraus, sodass es in der alleinigen Verantwortung der Webseite liegt, den Nutzern zu signalisieren, wann sie sich mit einem Token registrieren sollen.<\/p>\n<p><b>Anmeldung mithilfe eines registrierten Zweit-Faktors<\/b><\/p>\n<p>Wenn sich der Nutzer das n\u00e4chste Mal auf der Webseite anmeldet, muss er den Besitz des zweiten Faktors nachweisen, der die Credentials im vorherigen Abschnitt erstellt hat. Das Backend sendet die gespeicherte Schl\u00fcsselkennung mit einer neuen <i>Challenge<\/i> an den Benutzer. Da\u00a0<code>allowCredentials\u00a0<\/code>ein Array ist, erlaubt es das Senden von mehr als einer Schl\u00fcsselkennung, falls mehrere mit einem Benutzerkonto registriert wurden.<\/p>\n<pre><code class=\"js hljs javascript\"><span class=\"hljs-comment\">\/* Die Challenge wird vom Server generiert. *\/<\/span>\r\n<span class=\"hljs-keyword\">let<\/span> challenge = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">Uint8Array<\/span>([<span class=\"hljs-number\">42<\/span>,<span class=\"hljs-number\">42<\/span>,<span class=\"hljs-number\">33<\/span> <span class=\"hljs-comment\">\/* 29 weitere, vom Server zuf\u00e4llig generierte Bytes *\/<\/span>]);\r\n<span class=\"hljs-keyword\">let<\/span> key = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">Uint8Array<\/span>(<span class=\"hljs-comment\">\/* \u2026 die Schl\u00fcsselkennung \u2026  *\/<\/span>);\r\n\r\n<span class=\"hljs-keyword\">let<\/span> allowCredentials = [{\r\n  <span class=\"hljs-attr\">type<\/span>: <span class=\"hljs-string\">\"public-key\"<\/span>,\r\n  <span class=\"hljs-attr\">id<\/span>: key,\r\n  <span class=\"hljs-attr\">transports<\/span>: [<span class=\"hljs-string\">\"usb\"<\/span>]\r\n}];\r\n\r\n<span class=\"hljs-keyword\">let<\/span> publicKey = {challenge, allowCredentials};\r\n\r\nnavigator.credentials.get({publicKey})\r\n  .then(decodeAssertion);<\/code><\/pre>\n<p>Auch hierbei warten alle angeschlossenen USB U2F-Token auf die Interaktion des Nutzers. Wenn der Nutzer ein Token ber\u00fchrt, wird dieser versuchen, entweder die gespeicherte Schl\u00fcsselkennung mit der angegebenen ID zu finden oder diese mit dem internen, geheimen Schl\u00fcssel zu entschl\u00fcsseln. Ist dies erfolgreich, wird eine Signatur zur\u00fcckgeschickt. Andernfalls wird der Authentifizierungsvorgang abgebrochen und muss von der Webseite wiederholt werden.<\/p>\n<p>Nach der Dekodierung werden die Signatur und die Schl\u00fcsselkennung, mit der signiert wurde, an das Backend gesendet. Wenn der mit der Schl\u00fcsselkennung gespeicherte \u00f6ffentliche Schl\u00fcssel in der Lage ist, die gegebene Signatur \u00fcber die bereitgestellte Challenge zu verifizieren, wird der Nutzer erfolgreich angemeldet.<\/p>\n<p><b>Ein-Faktor-Authentifizierung<\/b><\/p>\n<p>Web Authentication definiert auch Mechanismen, mit denen man sich ohne Benutzername und Passwort nur mit einem einzelnen, sicheren Token einloggen kann &#8211; wie z.B. die vertrauensw\u00fcrdige Ausf\u00fchrungsumgebung auf Ihrem Smartphone. In diesem Modus best\u00e4tigt Ihr Token, dass Sie diesen nicht nur besitzen, sondern auch, dass Sie als Person den Token entsperrt haben und zwar mit einem Passcode (etwas, das Sie kennen) und\/oder mit biometrischen Daten (quasi etwas, das Sie sind).<\/p>\n<p>Nach vorheriger Anmeldung auf einer Webseite k\u00f6nnte diese Ihnen dann erlauben, eine nahtlose Authentifizierung bei einer Webanwendung auf Ihrem Desktop durchzuf\u00fchren &#8211; und zwar ganz einfach, indem Sie auf eine Eingabeaufforderung antworten, die auf Ihrem Smartphone angezeigt wird.<\/p>\n<p>Die momentan eingesetzten FIDO U2F-Token sind noch nicht ausgereift genug, um dies zu erm\u00f6glichen; die n\u00e4chste Generation von Token allerdings schon, sodass Webentwickler mit diesen FIDO 2.0-Token \u00fcber die Web Authentifizierung interagieren k\u00f6nnen werden.<\/p>\n<p><b>WebAuthn &#8211; bald in Ihrem Firefox<\/b><\/p>\n<p>Dies war eine sehr kurze Einf\u00fchrung in die Welt der Web-Authentifizierung und sie verzichtet bewusst auf spezifische Details wie <a href=\"https:\/\/tools.ietf.org\/html\/rfc7049\" target=\"_blank\" rel=\"noopener\">CBOR-Encoding<\/a> und <a href=\"https:\/\/tools.ietf.org\/html\/rfc8152#section-7\" target=\"_blank\" rel=\"noopener\">COSE-Key-Formate<\/a> sowie weitere Parameter, die an die\u00a0<code>.create()<\/code>und <i><code>.get()<\/code>&#8211;<\/i>Funktionen \u00fcbergeben werden k\u00f6nnen.<\/p>\n<p>Wir m\u00f6chten Entwickler dazu ermutigen, mit WebAuthn zu experimentieren und es Nutzern zu erm\u00f6glichen, ihre Anmeldungen mit zwei Faktoren abzusichern, sobald die API verf\u00fcgbar ist. Uns sind zum Zeitpunkt der Erstellung noch keine WebAuthn-U2F Polyfill-Bibliotheken bekannt, aber wir hoffen, dass sie bald verf\u00fcgbar sein werden. Sollte Ihnen bereits etwas Vielversprechendes \u00fcber den Weg gelaufen sein, schreiben Sie uns gerne einen Kommentar.<\/p>\n<p>Standardisierte Zwei-Faktor-Authentifizierung ins Web zu bringen, stellt f\u00fcr uns einen bedeutenden Meilenstein dar. Public-Key-Kryptographie sch\u00fctzt unsere Daten, wenn sie \u00fcber das TLS-Protokoll im Internet unterwegs sind &#8211; und jetzt k\u00f6nnen wir damit auch noch das Phishing viel, viel schwerer machen. Probieren Sie WebAuthn doch am besten gleich in Firefox Nightly aus!<\/p>\n<p><a href=\"http:\/\/blog.mozilla.org\/press-de\/files\/2018\/01\/20180125_WebAuthn_API.jpg\"><img decoding=\"async\" loading=\"lazy\" class=\"size-full wp-image-2398 aligncenter\" src=\"http:\/\/blog.mozilla.org\/press-de\/files\/2018\/01\/20180125_WebAuthn_API.jpg\" alt=\"\" width=\"500\" height=\"411\" srcset=\"https:\/\/blog.mozilla.org\/press-de\/files\/2018\/01\/20180125_WebAuthn_API.jpg 500w, https:\/\/blog.mozilla.org\/press-de\/files\/2018\/01\/20180125_WebAuthn_API-252x207.jpg 252w\" sizes=\"(max-width: 500px) 100vw, 500px\" \/><\/a><b>Ein letzter Hinweis zum Testen<\/b><\/p>\n<p>Die WebAuthn API ist ein leistungsstarkes Feature. Daher kann es nur in einem <a href=\"https:\/\/developer.mozilla.org\/de\/docs\/Web\/Security\/Secure_Contexts\" target=\"_blank\" rel=\"noopener\">Secure Context<\/a> verwendet werden und wenn es in einem Frame aufgerufen wird, nur dann, wenn alle Frames vom gleichen Ursprung (<i>Origin<\/i>) wie das \u00fcbergeordnete Dokument stammen. Das bedeutet, dass Sie wahrscheinlich auf Sicherheitsfehler sto\u00dfen werden, wenn Sie auf einigen popul\u00e4ren Test-Websites (wie z.B. jsfiddle.net) damit experimentieren.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Um eine h\u00f6here Sicherheit f\u00fcr die Anmeldung zu gew\u00e4hrleisten, setzen Webseiten eine Zwei-Faktor-Authentifizierung (2FA) ein, wobei derzeit h\u00e4ufig eine Smartphone-App oder Textnachrichten verwendet werden. Diese Mechanismen erschweren das Phishing, k\u00f6nnen &hellip; <a class=\"go\" href=\"https:\/\/blog.mozilla.org\/press-de\/2018\/01\/25\/wie-hardware-token-basierte-zwei-faktor-authentifizierung-mit-der-webauthn-api-funktioniert\/\">Mehr lesen<\/a><\/p>\n","protected":false},"author":495,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[30],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.mozilla.org\/press-de\/wp-json\/wp\/v2\/posts\/2397"}],"collection":[{"href":"https:\/\/blog.mozilla.org\/press-de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mozilla.org\/press-de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mozilla.org\/press-de\/wp-json\/wp\/v2\/users\/495"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mozilla.org\/press-de\/wp-json\/wp\/v2\/comments?post=2397"}],"version-history":[{"count":0,"href":"https:\/\/blog.mozilla.org\/press-de\/wp-json\/wp\/v2\/posts\/2397\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.mozilla.org\/press-de\/wp-json\/wp\/v2\/media?parent=2397"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mozilla.org\/press-de\/wp-json\/wp\/v2\/categories?post=2397"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mozilla.org\/press-de\/wp-json\/wp\/v2\/tags?post=2397"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}