PHP ist openssl_sign erzeugt unterschiedliche Signatur als SSCrypto Zeichen
Ich Schreibe eine OS X-client-eine software, die in PHP geschrieben ist. Diese software verwendet eine einfache RPC-Schnittstelle zu empfangen und Befehle ausführen. Der RPC-client zu unterzeichnen sind die Befehle, die er sendet, um sicherzustellen, dass kein MITM ändern können, einer von Ihnen.
Jedoch, wie der server war nicht die Annahme der Unterschriften, die ich gesendet von meinem OS-X-client, ich begann die Untersuchung und fand heraus, dass der PHP-openssl_sign Funktion generiert eine unterschiedliche Signatur für einen bestimmten privaten Schlüssel/Daten-Kombination als die in Objective-C SSCrypto Rahmen (das ist nur ein wrapper um die openssl-lib):
SSCrypto *crypto = [[SSCrypto alloc] initWithPrivateKey:self.localPrivKey];
NSData *shaed = [self sha1:@"hello"];
[crypto setClearTextWithData:shaed];
NSData *data = [crypto sign];
erzeugt eine Signatur wie CtbkSxvqNZ+mAN
...
Den PHP-code
openssl_sign("hello", $signature, $privateKey);
erzeugt eine Signatur wie 6u0d2qjFiMbZ+
...
(Für mein gewissen Schlüssel, natürlich. base64-codiert)
Ich bin mir nicht ganz sicher, warum dies passiert ist und ich erfolglos experimentiert mit unterschiedlichen hash-algorithmen. Wie die PHP-Dokumentation gibt SHA1 standardmäßig verwendet wird.
Also, warum diese beiden Funktionen erzeugen unterschiedliche Signaturen und wie kann ich meine Objective-C-Teil zu erzeugen, eine Signatur, die PHPs openssl_verify akzeptieren?
Anmerkung: ich habe überprüft, dass der Schlüssel und die Daten sind richtig!!!!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Okay, es dauerte schon ein paar Stunden. Hier ist, was passiert:
Beim Aufruf der
openssl_sign
Funktion, PHP intern verwendet die GD-API bereitgestellt wird, die vom openssl lib. EVP ist eine "high-level" - API auf die zugrunde liegenden Funktionen wieRSA_private_encrypt
. Also, wenn Sie rufenbase64_encode(openssl_sign('hello', $signature, $privKey))
ähnlich ist, etwas zu tun, wie dies in der Befehlszeile mithilfe der openssl-binary:und NICHT
Ich weiß nicht, warum dies erzeugt eine andere Ausgabe , aber das tut es. Wenn jemand eine Idee hat, warum unterscheiden Sie sich: bitte teilen!
Aber, als ich mit dem SSCrypto Rahmen, den ich schrieb das signieren (und verifizieren) - Funktion mit EVP fordert (Auszug):
Und voila: ich bekomme die gleichen Signaturen, wie ich von PHP. Oh, und fürs Protokoll: PHP verwendet den PKCS-padding.
Danke Jungs für den Hinweis mich in die richtige Richtung!
openssl_sign()
gibt einen booleschen Wert true bei Erfolg false bei Misserfolg) nicht die Signatur, sobase64_encode(openssl_sign('hello', $signature, $privKey))
würde nur codieren, dass boolean.Ihre code-snippet, das war eine große Hilfe, ich hatte das gleiche problem, und ich kam mit der folgenden Methode basiert auf Ihre Linien, wenn das hilft jemanden mit dem gleichen Problem.
}
Sieht es für mich aus wie dein PHP ist die Unterzeichnung
"hello"
, während Ihr Objective-C ist die Unterzeichnungsha1("hello")
. Das ist die Art, wie ich die Dokumentation Lesen, die PHPopenssl_sign
ist mitsha1
standardmäßig in der internen mechanik der Unterzeichnung, im Gegensatz zu der Anwendungsha1
um die Daten vor der Unterzeichnung.iaQ+f1PJi
... Hinweis: Die Unterschriften, die generiert werden, mit SSCrypto (Objective-C) übereinstimmen mit denen, die ich erzeugen kann, die mit openssl direkt auf der Kommandozeile.openssl_verify()
immer noch nicht auf die neue Signatur? Auch (basierend auf dem Beispiel-code mitSSCrypto
) sind Sie mit so etwas wie[signedData encodeBase64]
?openssl_verify()
immer noch nicht (Rückgabe 0). Ich benutze nur[signedData encodeBase64]
für den Menschen lesbare Ausgabe (z.B.NSLog()
), überall sonst verwende ichNSData
oderNSString
. Ich denke, das problem ist auf der PHP-Seite als SSCrypto erzeugt gültige Signaturen, die mit dem normalen openssl binary.Nicht, dass es behebt, aber Ihre Nutzung des rsautl scheint falsch zu sein. Sie sollten wahrscheinlich nicht verwenden, rsautl -Zeichen anstelle von rsautl -verschlüsseln