Ist es möglich, einen Anmeldeprozess zu erstellen, der einen öffentlichen / privaten Schlüssel über einen Webbrowser benötigt? Der öffentliche Schlüssel würde auf dem Server gespeichert und der private Schlüssel würde vom Benutzer behalten (und verschlüsselt).
Ich möchte grundsätzlich etwas tun, was dem von SSH ähnlich ist, aber über das Internet. Vielleicht eine benutzerdefinierte Methode der HTTP-Authentifizierung (anders als "Digest").
Ich weiß, dass es nicht möglich ist, dies mit einem Aktien-Browser zu tun, also sind Erweiterungen, um diese Arbeit zu machen, akzeptabel (Chrome / Firefox).
Die Schlüssel würden idealerweise auf einem USB-Stick verschlüsselt werden. Wenn der USB-Stick nicht angeschlossen ist, ist eine Anmeldung nicht möglich (nicht im Browser zwischenspeichern).
Dies würde intern verwendet werden.
Bearbeiten: Ich würde nach Client-Zertifikaten suchen, aber wie speichere ich diese Zertifikate auf einem USB-Stick? Gibt es außerdem Informationen zur Authentifizierung eines Benutzers mit PHP?
Dies ist die Client-Authentifizierung über Zertifikate.
Ihr Server sollte so konfiguriert sein, dass er ein Clientzertifikat erfordert und auch mit einem Truststore konfiguriert wird.
Alle Browser unterstützen dies.
Sie müssen nur den Client-Keystore mit dem privaten Schlüssel und dem Zertifikat in den Zertifikate-Satz des Computers importieren.
Für Windows ist es in Internetoptionen
Ich bezweifle, dass Sie dies mit einer Webanwendung erreichen können. Der Browser ist vom Betriebssystem aus sandboxed, und Sie könnten die Webanwendung nicht erkennen, dass ein USB-Laufwerk vorhanden ist. Außerdem können Sie mit der Webanwendung keine Daten davon lesen. Sie brauchen also den Browser, um das für Sie zu tun, und sie sind nicht so konzipiert, dass sie so funktionieren.
Wenn Sie ein Client-Zertifikat in den Browser laden, wird es in den Zertifikatsspeicher geladen. Diese unterscheiden sich je nach Browser und Betriebssystem. Auf OSX gehen sie in KeyChain. Unter Windows werden einige in den OS-Keystore gehen und einige werden in den Keystore des Browsers gehen (Firefox funktioniert meiner Meinung nach so). Aber keiner von ihnen erlaubt es Ihnen, einen externen Schlüsselspeicher zu definieren und dann den Schlüssel zu verschlüsseln und zu entschlüsseln, den Sie schützen wollen, während er von diesem Laufwerk liest und schreibt.
Was Sie tun, wäre nur möglich, wenn Sie Ihre eigene Desktop-Anwendung (im Wesentlichen Ihren eigenen Browser) geschrieben haben, die dies für Sie getan hat.
Es ist möglich, dass Sie dies mit einer Adobe AIR-Anwendung tun können. Adobe AIR unterstützt das Lesen und Schreiben von einem USB-Laufwerk und unterstützt verschlüsselte Datenbanken (128-Bit-AES / CBC-Verschlüsselung mit SQLite), in denen Sie die zu schützenden Daten speichern können, und zwar plattformübergreifend.
Bei jeder dieser Lösungen werden Sie wahrscheinlich bei Bedarf angehalten, um sicherzustellen, dass der USB-Schlüssel eingesteckt ist. Das ist wahrscheinlich schwer zu tun. Wie würden Sie den Benutzer daran hindern, einfach die Dateien vom USB-Stick auf die Festplatte zu kopieren und dann den Schlüssel von dort zu verwenden, so dass sie den USB-Schlüssel nicht benötigen?
Um zu dieser Steuerungsebene zu gelangen, müssen Sie sich vielleicht eine wirklich native Lösung ansehen. C ++, Objective-C oder Java. Java wird der einzige sein, der Ihnen eine plattformübergreifende Lösung bietet.
Wenn der USB-Schlüssel eine Annehmlichkeit für den Endbenutzer im Gegensatz zu einer Anforderung darstellt, dann wäre Adobe AIR eine solide Lösung. Wenn nicht, dann ist es an der Zeit, Ihre Fähigkeiten zur Desktop-Softwareentwicklung aufzufrischen.
Hier ist, wie ich webbasierte Anmeldung mit RSA öffentlichen / privaten Schlüssel in PHP gemacht habe:
Die Registrierung ist sehr einfach.
Aber Login ist auf diese Weise gemacht:
nonce1 = pass2( pass1( string ) )
nonce2 = pass1( pass2( string ) )
und das Ergebnis wird mit dem öffentlichen Schlüssel des Benutzers verschlüsselt: nonce2encrypted = encryptPubKeyRSA( userPubKey, nonce2 )
P.S. Die Zeichenfolge wird mit zwei Passwörtern verschlüsselt, um einen Brute-Force-Angriff zu erschweren.
Das Anmeldeformular enthält drei versteckte Eingaben: nonce1
, nonce2encrypted
und nonce2
ohne Wert.
Dann wird der Benutzer aufgefordert, seinen privaten Schlüssel in ein Textfeld einzugeben, das sich außerhalb von <form>
tag befindet (um sicher zu sein, dass es nicht an den Server gesendet wird) , ein Javascript entschlüsselt nonce2encrypted
und setzt den entschlüsselten Wert auf nonce2
. Dann wird das Textfeld mit dem privaten Schlüssel aus html mit Javascript entfernt, nur um sicherzustellen, dass es nicht irgendwo im Browser gespeichert oder an den Server gesendet wird.
Der Server empfängt nonce1
und nonce2
und entschlüsselt sie mit diesen beiden Passwörtern. Wenn die entschlüsselten Werte identisch sind, erhält der Benutzer ein Cookie und ist angemeldet.
P.S. Dieser Cookie enthält auch einige verschlüsselte Daten, z. B. Benutzer-IP. Dies erlaubt niemandem, der diesen Cookie gestohlen hat, sich von einer anderen IP aus anzumelden.
Sie können diese Methode in Aktion anzeigen ( Projekt auf GitHub )
Die Antwort auf Ihre Frage lautet: "Heute nicht möglich."
Die Technologie gibt es heute in Form von Zertifikaten, die bereits in allen Browsern unterstützt werden. Aber um zu bekommen, was Sie wollen, müssen die Browser zulassen, dass Zertifikate im "Passwortmanager" Teil ihrer Benutzeroberfläche hinzugefügt und verwaltet werden. Die Leute möchten sie zwischen Geräten usw. synchronisieren.
Außerdem würden Websites ähnliche Änderungen benötigen, damit Benutzer die auf der Website gespeicherten öffentlichen Schlüssel verwalten können, anstatt ihr Kennwort zu verwalten.
Der Vorteil dieser Art von System besteht darin, dass Sie Ihr Passwort (privater Schlüssel) niemals wirklich an die Website senden müssen, auf der Sie sich anmelden. Aber ansonsten haben Sie immer noch alle Verwaltungsaktivitäten, die Sie heute mit Passwörtern haben.
Client-Zertifikate sind die Antwort. Die meisten / Alle Browser importieren diese Client-Zertifikate als PKCS # 12 (.p12, .pfk).
Sie können ein vorhandenes x509-Zertifikat in eine PKCS # 12-Datei mit dem öffentlichen Schlüssel (.crt), dem privaten Schlüssel (.key) und dem CA-Zertifikat (.crt) konvertieren. Sie können dies mit OpenSSL mit dem folgenden Befehl tun:
%Vor%Wenn Sie Ihre Zertifikate selbst signieren, müssen Sie sicherstellen, dass sich die Zertifikatsserien von anderen Zertifikaten unterscheiden. Wenn sie die gleichen sind, können Fehler auftreten, die versuchen, die .p12-Datei zu importieren (also achten Sie auf -set_serial in Openssl-Beispielen).
Leider ist die einzige plattformübergreifende Möglichkeit, Zertifikate mobil / entfernbar zu machen, die Verwendung einer Smartcard (mit PKCS # 11).
Unter Mac OS X greifen Safari und Chrome ihre Zertifikate über den Schlüsselbund zu. Sie können einen benutzerdefinierten Schlüsselbund auf einem USB-Stick erstellen (Datei -> Neuer Schlüsselbund). Nachdem Sie den Schlüsselbund erstellt haben, können Sie einfach Ihre .p12-Datei in Ihren Schlüsselbund ziehen. Das Beste daran ist, dass Sie den Zugriff darauf kontrollieren können, welche Anwendung Zugriff auf die Zertifikate hat, und Sie können den Schlüsselbund selbst nach einer gewissen Inaktivität sperren lassen.
Bei Safari funktioniert das wunderbar. Wenn Sie das Flash-Laufwerk trennen, wird das Zertifikat nach einigen Sekunden nicht mehr gesendet. Wenn Sie es wieder anschließen, nimmt es es sofort auf. Wenn Sie das Zertifikat mit "Keychain Access" sperren, werden Sie nach dem Passwort gefragt. Es verhindert, dass Sie das Flash-Laufwerk während der Verwendung ordnungsgemäß auswerfen, aber nach einer Minute gibt Safari die Sperre frei.
Chrome ist knifflig. Es speichert das Zertifikat für einige Minuten. Wenn Sie den Schlüsselbund sperren, wird weiterhin die zwischengespeicherte Version verwendet. Wenn Sie versuchen, das Flash-Laufwerk ordnungsgemäß zu deaktivieren, wird Chrome Ihnen mitteilen, dass Sie es verwenden, bis Sie es schließen. Wenn Sie das Flash-Laufwerk einstecken, während Chrome läuft, wird es nicht aufgenommen.
So scheint es, dass Safari der einzige Browser ist, der dies unterstützt. Firefox und Opera haben beide ihre eigenen Schlüsselspeicher.
Wenn Sie Ihren benutzerdefinierten Schlüsselbund auf dem Flash-Laufwerk verstecken möchten, können Sie einen unsichtbaren Ordner erstellen, indem Sie ihm einen Punkt voranstellen (wie "./.keys"). Wenn Sie Ihren Schlüsselbund erstellen, können Sie den unsichtbaren Ordner im Dialogfenster anzeigen, indem Sie Befehl + Umschalt + "." Drücken.
Tags und Links php security ssl ssl-certificate