PKI-Verifikation über Java und Python

Ich versuche, ein PKI-Verifikationsschema zu implementieren, wo ein Nachrichtenstring mit einem privaten Schlüssel auf dem Server signiert wird, wird die Signatur auf dem Client zusammen mit dem Nachrichtenstring gespeichert. Der Client überprüft dann die Signatur mit einem öffentlichen Schlüssel.

Die Einschränkungen meiner Umgebung sind, der Server ist Google App Engine und der Client ist ein Java-Programm. Ich habe mit Java-only und Python-only-Lösungen der PKI-Verifikation gespielt und habe sie zur Arbeit gebracht, aber wenn man eine Operation in Python und einem anderen in Java macht, stellt sich das Problem vor, hauptsächlich aufgrund von Key-Dateiformat-Einschränkungen und meinem begrenzten Verständnis der Kryptographie-Terminologie .

Eine der größten Einschränkungen ist die Krypto-Unterstützung in GAE. Die einzige unterstützte Bibliothek ist PyCrypto und diese Bibliothek kann keine öffentlichen / privaten Schlüssel lesen, die in PEM-, DER- oder X509-Formaten gespeichert sind. Soweit ich konnte, nur M2Crypto unterstützt das Lesen aus diesen Dateien, aber es kann nicht innerhalb von GAE verwendet werden, weil es ein Wrapper um openssl ist, also nicht eine reine Python-Lösung. Auch wenn ich einen Weg finden könnte, die öffentlichen / privaten Schlüssel aus PEM / DER / X509 in das Format zu übersetzen, das PyCrypto versteht, das wird für mich funktionieren. Aber ich konnte keinen Weg finden, es zu tun. Irgendwelche Ideen dort?

Ich fand eine mögliche Lösung in Form von tlslite. Tlslite konnte einen privaten Schlüssel aus der PEM-Datei lesen und eine Signatur erstellen. Hier ist der Code.

from tlslite.utils.cryptomath import bytesToBase64 from tlslite.utils.keyfactory import parsePEMKey s = open('private.pem').read() key = parsePEMKey(s) doc = 'Sample text' bytes = array('B') bytes.fromstring(doc) print bytesToBase64(key.sign(bytes)) 

Der entsprechende Java-Code, den ich zur Überprüfung der Signatur verwendet habe, ist.

 String signAlgo = "SHA1WithRSAEncryption"; // read public key from public.der byte[] encodedKey = new byte[294]; // shortcut hardcoding getAssets().open("public.der").read(encodedKey); // create public key object X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(encodedKey); KeyFactory kf = KeyFactory.getInstance("RSA"); PublicKey pk = kf.generatePublic(publicKeySpec); // read signature (created by python code above) byte[] encodedSig = new byte[345]; getAssets().open("signature.txt").read(encodedSig); byte[] decodedSig = Base64.decodeBase64(encodedSig); // Do verification Signature verifyalg = Signature.getInstance(signAlgo); verifyalg.initVerify(pk); verifyalg.update(message.getBytes()); Log.d(TAG, "Verif : "+verifyalg.verify(decodedSig)); 

Die Überprüfung fällt aus.

Ich vermutete, wenn die tlslite verwendet verschiedene Algorithmus für Signatur-Erstellung als das, was der Java-Code erwartet.

Also habe ich versucht, das herauszufinden.

Auf Pythonseite

 print key.getSigningAlgorithm() 

gab mir

 pkcs1-sha1 

Auf Java-Seite habe ich versucht, alle unterstützten Algorithmen mit diesem Code zu finden:

 Set<String> algos = java.security.Security.getAlgorithms("Signature"); for(String algo : algos) { Log.d(TAG, algo); } 

Das hat mich gegeben

 MD4WithRSAEncryption RSASSA-PSS SHA1withDSA SHA1withRSA/ISO9796-2 1.2.840.113549.1.1.10 SHA512withRSA/PSS MD5withRSA/ISO9796-2 DSA SHA512WithRSAEncryption SHA224withRSA/PSS NONEWITHDSA SHA256withRSA/PSS SHA224WithRSAEncryption SHA256WithRSAEncryption SHA1withRSA/PSS SHA1WithRSAEncryption SHA384withRSA/PSS SHA384WithRSAEncryption MD5WithRSAEncryption 

Ich habe alle SHA1-Werte auf der Java-Seite ausprobiert. Aber keiner hat geholfen, die von tlslite erzeugte Signatur mit pkcs1-sha1 algo zu verifizieren. Jede Idee über diese Mapping?

2 Solutions collect form web for “PKI-Verifikation über Java und Python”

Dies sind verschiedene Operationen. In Python müssen Sie hashAndSign . Die Voreinstellung ist SHA1-Hash.

Keyczar sollte auf App Engine gut funktionieren und ist sowohl in Java als auch in Python-Aromen erhältlich.

  • Wie verschlüsseln Sie Text mit einem Passwort in Python?
  • Fehler beim Installieren des Python Cryptography-Pakets mit PIP und setup.py
  • Parse RSA Schlüsselpaar aus String in Python
  • Wie kann ich eine zufällige Nummer erstellen, die in Python kryptographisch sicher ist?
  • Entschlüsseln Sie eine AES-verschlüsselte Nachricht (verschlüsselt in Python) in Java
  • Welche Plattformen bieten SystemRandom?
  • AES im GCM-Modus in Python
  • Wie bekomme ich die Digest-Darstellung von CryptoJS.HmacSHA256 in JS
  • Wie man einen RSA öffentlichen Schlüssel im PEM + PKCS # 1 Format liest
  • ASCII Vigenere Chiffre nicht entschlüsseln
  • Crypto / X509 Zertifikat, das Bibliotheken für Python analysiert
  • Python ist die beste Programmiersprache der Welt.