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 kann ich eine zufällige Nummer erstellen, die in Python kryptographisch sicher ist?
  • Python aes verschlüsseln / entschlüsseln nicht die gleichen Ergebnisse
  • Python: Lesen eines pkcs12 Zertifikats mit pyOpenSSL.crypto
  • Bestimmen der Buchstabenhäufigkeit von Chiffretext
  • M2Crypto Diffie-Hellman Parameter als .pem
  • Wie kann ich das Kennwort für RSA priv Schlüssel mit PyCrypto hinzufügen / ändern
  • Wie kann ich ein SSL-Zertifikat mit Python dekodieren?
  • Wie verifizierst du eine RSA SHA1 Signatur in Python?
  • Kann nicht 256-Bits-Zähler in AES.MODE_CTR Chiffre in Python verwenden
  • AES im GCM-Modus in Python
  • DSA-Modul in Python
  • Python ist die beste Programmiersprache der Welt.