2016-05-12 3 views
0

Alles, was ich tun möchte, ist einen öffentlichen Schlüssel verwenden, um ein Token zu verschlüsseln, so dass es am anderen Ende mit dem privaten Schlüssel entschlüsselt werden kann.Wie verwende ich eine öffentliche/private KeyPair, um ein SSO-Token zu verschlüsseln?

verwendete ich den folgenden Befehl ein Schlüsselpaar zu erstellen, aber ich bin jetzt nicht sicher, wie der öffentliche Schlüssel in meinem Code zu laden, um das Token zu verschlüsseln:

$ ssh-keygen -t rsa -b 4096 

Welche Java-Bibliotheken verwende ich den Schlüssel laden und damit einen String verschlüsseln? Zusammen mit einem Codebeispiel würde mich auch jedes Lesematerial für mehr Verständnis und Klarheit interessieren.

Antwort

2

Ich fand ein gutes Beispiel in Java (und vielen anderen Sprachen) der Verschlüsselung eines SSO-Tokens in der uservoice/developer Dokumentation. I pasted the Java code auf Pastebin (hoffe uservoice stört es nicht!), Da es ein wenig zu lang ist, hier einzufügen.


Auf eine andere Anmerkung ... Ich würde vorschlagen, dass Sie sich JWT Tokens und OAuth für die Autorisierung ansehen.

Ich schlage vor, jose4j zu verwenden, wenn Ihr Token ein JWT ist und Sie es nicht wirklich verschlüsseln wollen, aber nur unterzeichnen Sie es!

Token müssen in bestimmten Architekturen nicht wirklich verschlüsselt werden, da sie nur unsensible Informationen größtenteils offen legen (auf was Sie zugreifen können, wann und für wie lange) ... Sicherheit liegt nicht in der Herstellung es schwer zu lesen der Token, aber bei der Herstellung sehr schwer Zugang zu der Token in erster Linie zu bekommen! Sobald ein Angreifer Zugriff auf ein Token erhält, können Sie nicht viel tun, da der Angreifer mehr daran interessiert ist, das Token zu verwenden (was er tun kann, wenn es keinen weiteren Schutz in Bezug auf das Zugriffsgerät gibt), sich als jemand auszugeben das Token enthält (was nichts sein kann, wie wir sehen werden).

JWTs kann easily read von jedermann sein, da sie einfach transportieren nur URL-codiert zu machen sind ... aber sie werden müssen unterzeichnet vertraut werden, da sie oft nicht einmal in der Autorisierungs-Server (sie don gespeichert 't müssen, da nur der Server es signiert haben kann, wenn die Signatur gültig ist) ... und auf der Transportschicht geschützt ist, indem nur HTTPS-Verbindungen verwendet werden, um sie zu senden, natürlich.

Um einen öffentlichen/privaten RSA-Schlüssel in reinem Java zu laden, lesen Sie die Antwort auf this question.

Um die Unterschrift eines JWT zu signieren und zu überprüfen, klicken Sie im Wiki von jose4j auf this page.

Wenn Sie Ihr Token vollständig geheim bleiben wollen, dann verwenden Sie ein undurchsichtigen Token, die keine Informationen an alle von selbst enthält, aber Punkte die tatsächlichen Angaben der Token darstellen soll, die nur Der Server, auf den sie generiert wird, kann darauf zugreifen, sodass Ihre Informationen niemals direkt angezeigt werden. Opak-Token sind normalerweise nur eine lange UUID.

Wenn Sie mehr über Tokens und Autorisierung/Authentifizierung wissen möchten, empfehle ich einen Blick auf die Nordic APIs Blog, die eine Menge Artikel und Links zu großen Open Source-Ressourcen enthält, die Sie verwenden können.

Haftungsausschluss: Ich arbeite für eine Firma, die Nordic-APIs sponsert.

+0

Es ist vielleicht erwähnenswert, dass JWTs auch mit öffentlichen/privaten Schlüsseln verschlüsselt/entschlüsselt werden können. Dies bietet jedoch keinen Integritätsschutz oder eine Herkunftsauthentifizierung, da jeder mit dem öffentlichen Schlüssel verschlüsseln kann. Du würdest wahrscheinlich auch unterschreiben wollen. Dieses Beispiel auf derselben jose4j-Seite zeigt einen signierten und verschlüsselten (verschachtelten) JWT: https://bitbucket.org/b_c/jose4j/wiki/JWT%20Examples#markdown-header-producing-and-consuming-a-nested- signed-and-encrypted-jwt - es verwendet EC-Schlüssel und Algorithmen, aber ähnlich kann auch mit RSA gearbeitet werden. –

Verwandte Themen