Wir verwenden eine Java-Bibliothek namens license3j
für die Lizenzverwaltung. Die Bibliothek verwendet asymmetrische Verschlüsselung und stützt sich auf Bouncycastle. Wir erstellen eine Lizenzdatei mit einem einfachen Befehl gpg
und überprüfen die Lizenz in unserer Software mit unserem öffentlichen Schlüssel. Bis jetzt hat alles gut funktioniert. ABER: In 1.000 generierten Lizenzen gibt es einen sehr kleinen Bruchteil, der nicht korrekt verifiziert werden kann, obwohl sie tatsächlich gültig sind (ungefähr 5/1000).Signaturlänge nicht korrekt beim Aufruf von PGPOnePassSignature.verify
Was passiert in diesem Fall: Wenn die Lizenz in com.verhas.licensor.License.setLicenseEncoded(InputStream)
überprüft werden soll, die org.bouncycastle.openpgp.PGPOnePassSignature.verify(PGPSignature)
wirft die folgende Ausnahme:
org.bouncycastle.openpgp.PGPRuntimeOperationException: unable to verify signature: Signature length not correct: got 511 but was expecting 512
Sounds ziemlich dunkel zu mir, nur grundlegende Kenntnisse der Kryptographie mit. Stundenlang googeln, gab mir den Hinweis, dass es etwas über "führende Nullen" gibt. Also wurde in dem gegebenen Beispiel offensichtlich eine führende Null entfernt (wo?), Und die Längen der zu vergleichenden Signaturdaten stimmen nicht überein. Macht Sinn.
Jetzt habe ich keine Ahnung, wo das Problem liegen könnte. Ist es während Erstellung der Lizenzdatei? Im Wesentlichen machen wir nur folgendes:
Welches wird uns die Lizenzdatei geben.
Oder tritt der Fehler während Überprüfung auf? Muss ich irgendeine Bouncycastle-Konfiguration ändern, um das führende Nullenproblem korrekt zu beheben? Ihr FAQ gibt einige Hinweise, aber die License3j
source verwendet offensichtlich nie eine Cipher
Instanz, so dass ich total verloren bin, wie man dies in die gegebene API integriert.
Ich bin mir bewusst, dass dies ein ganz besonderes Problem mit einer Bibliothek ist, die offensichtlich nicht sehr gut bekannt ist. Daher schätze ich jede kleine Rückmeldung oder Eingabe.
Danke Magnus, das hat wirklich geholfen, das Problem zu verstehen! Haben Sie Vorschläge, wie ich dieses Problem mit überschaubarem Aufwand lösen könnte? Beim Durchschreiten der BC-Quelle wird kein Punkt angezeigt, an dem ich mich einhaken könnte. Gibt es Alternativen, die ich nutzen könnte? – qqilihq
Leider scheint es nicht trivial zu sein, es in Bouncycastle zu reparieren, Sie könnten versuchen, einen Fehler in ihrem Issue Tracker auszulösen, aber ich bin nicht sicher, wie viel Erfolg Sie haben werden. Ein Hacky-Workout könnte sein, jede Lizenz zu überprüfen und neu zu generieren, wenn sie fehlschlägt. – Magnus
Eigentlich hatte ich auch die Idee, die Lizenzen neu zu generieren, aber unser Server, auf dem die Lizenzen generiert werden, läuft nicht in einer Java-Umgebung. Es wäre eine riesige Pita, eine JRE nur für die Überprüfung der Lizenzen einzurichten. Ich werde versuchen, ein Problem bei BC darüber anzusprechen. Eine weitere Frage: Gibt es neben BC weitere Krypto-Bibliotheken, oder kann die Überprüfung einer GPG-Signatur heutzutage auch mit Klassen aus der Java-API durchgeführt werden? Immerhin gibt es z.B. eine Klasse 'java.security.Signature'. Die Überprüfungsschritte scheinen überhaupt nicht zu kompliziert zu sein, daher würde ich auch erwägen, diese Funktionalität neu zu schreiben. – qqilihq