Verwenden Sie ein Kryptografiemodul, das OpenSSL in Python verarbeitet

Einführung

** Kryptographie ** ist ein Python-Modul, das OpenSSL umschließt. Mit High-Level- und Low-Level-Schnittstellen können Sie mit OpenSSL alles erledigen, was Sie wollen. https://cryptography.io/en/latest/

Wenn man sich den Code für die Verschlüsselung mit öffentlichen Schlüsseln in Python ansieht, scheint es viele Fälle zu geben, in denen der Befehl openssl vom Unterprozessmodul aufgerufen wird. Das ist kein Problem, aber es kostet jedes Mal viel, sich zu teilen, sodass es schneller ist, Module zu verwenden, wenn große Mengen verarbeitet werden.

Auch wenn es ein Wrapper ist, ist es schön und schön, dass alles, was vom Benutzer geschrieben wird, Python-Code ist. Es ist nur eine persönliche Note.

Zuerst aus dem Beispielcode

Schauen Sie sich zunächst den Beispielcode an, um zu sehen, wie einfach es ist. (Zusammenfassung des Beispielcodes)

Privat Schlüssel

Erstellen

generate_privkey.py


from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import rsa, ec, ed25519

def generate_privkey(key_type = ''):
    if key_type == 'ec' or key_type == 'ecdsa':
        privkey = ec.generate_private_key(
            ec.SECP256R1(),
            default_backend()
        )
    elif key_type == 'ed25519':
        privkey = ed25519.Ed25519PrivateKey.generate()
    else:
        privkey = rsa.generate_private_key(
            public_exponent=65537,
            key_size=2048,
            backend=default_backend()
        )
    return privkey

Wie es gemacht wird, hängt vom Algorithmus des privaten Schlüssels ab. (Das generierte Schlüsselobjekt hat nicht dieselbe Basisklasse, daher wird mypy wütend)

Lesen

load_privkey.py


from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization

def load_privkey(filename):
    with open(filename, 'rb') as fpr:
        privkey = serialization.load_pem_private_key(
            fpr.read(),
            password=None,
            backend=default_backend()
        )
    return privkey

Die Funktion ändert sich je nach Dateiformat. In den meisten Fällen denke ich, dass es im PEM-Format ist (das Format, das mit ----- BEGIN .... ----- beginnt).

Sie müssen den Schlüsselalgorithmus nicht kennen.

Schreiben

save_privkey.py


from cryptography.hazmat.primitives import serialization

def save_privkey(filename, privkey):
    serialized_key = privkey.private_bytes(
            serialization.Encoding.PEM,
            serialization.PrivateFormat.PKCS8,
            serialization.NoEncryption()
    )
    with open(filename, 'wb') as fpw:
        fpw.write(serialized_key)

Serialisieren Sie den privaten Schlüssel in ein Byte-Array. Rufen Sie die Methode "private_bytes" des Schlüsselobjekts auf und geben Sie das Format usw. an.

Wie beim Lesen müssen Sie den Schlüsselalgorithmus nicht kennen.

Öffentlicher Schlüssel

Holen Sie sich und schreiben Sie

save_pubkey.py


from cryptography.hazmat.primitives import serialization

def save_pubkey(filename, privkey):
    pubkey = privkey.public_key()
    serialized_key = pubkey.public_bytes(
            serialization.Encoding.PEM,
            serialization.PublicFormat.SubjectPublicKeyInfo
    )
    with open(filename, 'wb') as fpw:
        fpw.write(serialized_key)

Holen Sie sich den öffentlichen Schlüssel vom privaten Schlüssel. Der Rest wird auf die gleiche Weise wie der private Schlüssel serialisiert. Die Methode ist public_bytes.

Elektronisches Zertifikat

CSR erstellen

Erstellen Sie eine CSR (Certificate Signing Request). Der zum Signieren verwendete private Schlüssel "privkey" gibt das im vorherigen Abschnitt erstellte Schlüsselobjekt an.

make_csr.py


from cryptography import x509
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes

def make_csr(privkey):
    builder = x509.CertificateSigningRequestBuilder()
    builder = builder.subject_name(
        x509.Name([
            x509.NameAttribute(x509.NameOID.COMMON_NAME, 'example.com'),
        ])
    )
    builder = builder.add_extension(
        x509.SubjectAlternativeName([
            x509.DNSName('www.example.com'),
            x509.DNSName('test.example.com')
            ]
        ),
        critical=False
    )
    return builder.sign(privkey, hashes.SHA256(), default_backend())

Es ist einfach mit Builder zu machen.

Punkte, die bei der Verwendung zu beachten sind

Wie wär es damit. Ich denke, Sie können es leicht verständlich schreiben.

Hier sind einige Punkte zu beachten, wenn Sie versuchen, es zu verwenden.

“hazmat”

Die Kryptographie besteht aus zwei Komponenten. Eines ist eine Gruppe von Modulen direkt unter "Kryptographie" wie "Kryptographie.x509" und "Kryptographie.fernet".

Das andere ist eine Reihe von Modulen unter "cryptography.hazmat". "Hazmat" ist eine Abkürzung für "gefährliche Materialien" und "gefährlich" bedeutet "gefährlich". ** Die Module unter Hazmat bedeuten gefährlich **.

Oben im Hazmat-Handbuch,

This is a “Hazardous Materials” module. You should ONLY use it if you’re 100% absolutely sure that you know what you’re doing because this module is full of land mines, dragons, and dinosaurs with laser guns.

ist was es liest. Wenn Sie den letzten Teil mit Google-Übersetzung übersetzen,

Dieses Modul ist voll von Minen, Drachen und Dinosauriern mit Laserkanonen. Verwenden Sie es daher nur, wenn Sie sich ganz sicher sind, was Sie tun.

Es ist eine laute Geschichte, aber Sie können sie sich als [^ at_your_own_risk] vorstellen, die dieselbe Bedeutung wie "Auf eigenes Risiko" hat, da es sich um ein Modul handelt, das die Verschlüsselung übernimmt und nicht garantiert werden kann, dass es ausreichend sicher ist. Ich denke, es ist eine schöne Geschichte, es "Dinosaurier" zu nennen oder das Modul zu benennen.

[^ at_your_own_risk]: Seien Sie vorsichtiger, da Sie sich mit Kryptografie befassen.

Bindung

Wie eingangs erwähnt, ist Kryptografie ein Wrapper, daher verwende ich die OpenSSL-Bibliothek (libssl.so) im Inneren. Der Befehl openssl selbst verwendet diese Bibliothek ebenfalls. Wenn Sie also den Befehl openssl verwenden können, ist diese Bibliothek enthalten und funktioniert einwandfrei.

Die Verwendung einer Kombination dieser kompilierten Sprachen aus einer Skriptsprache wird als Bindung bezeichnet. Sie müssen sich keine Sorgen machen, wenn Sie Kryptografie mit pip bereitstellen, aber wenn Sie sie auf spezielle Weise [^ lambda] oder in einer speziellen Umgebung bereitstellen, können Probleme auftreten. In diesem Fall denke ich, dass es ziemlich schwierig ist, es nur mit Python-Kenntnissen zu lösen. Es ist möglicherweise besser, den Befehl "openssl" aufzurufen, als nach einer Lösung zu suchen.

[^ lambda]: Wenn Sie dies beispielsweise manuell für die Verwendung mit Lambda unter AWS tun.

Betriebsumgebung

Dies hängt auch mit der Bindung zusammen, funktioniert jedoch nicht in Umgebungen, in denen OpenSSL nicht funktioniert. Außerdem können Sie mit pip nur in den folgenden Umgebungen installieren:

Wenn nicht oben, können Sie es auch selbst erstellen (https://cryptography.io/en/latest/installation/#build-on-linux). Auf den ersten Blick scheint es nicht so störend zu sein, aber ich frage mich, ob der Bindungsbereich problematisch ist.

Zusammenfassung

Wenn Sie den Beispielcode lesen, werden Sie feststellen, dass es nicht so schwierig ist. Ich denke, es ist für Pythonista einfacher, damit umzugehen, besonders weil es hier und da pythonische Abstraktionen gibt.

Wenn Sie eine Betriebsumgebung haben, probieren Sie es einfach aus.

Recommended Posts

Verwenden Sie ein Kryptografiemodul, das OpenSSL in Python verarbeitet
Verwendung von SQLite in Python
Wie man MySQL mit Python benutzt
Verwendung von ChemSpider in Python
Verwendung von PubChem mit Python
Umgang mit Japanisch mit Python
[Einführung in Python] Wie verwende ich eine Klasse in Python?
Einfache Möglichkeit, Wikipedia mit Python zu verwenden
Modul zum Generieren des Wortes N-Gramm in Python
Verwendung von __slots__ in der Python-Klasse
Verwendung regulärer Ausdrücke in Python
Verwendung ist und == in Python
Verwenden Sie config.ini mit Python
Verwenden Sie Datumsangaben in Python
Verwendung der Python-Bildbibliothek in der Python3-Serie
Verwenden Sie Valgrind mit Python
Zusammenfassung der Verwendung von MNIST mit Python
Markdown mit Python behandeln
So fügen Sie Python ein Modul hinzu, das Sie in Julialang eingefügt haben
Wie man tkinter mit Python in Pyenv benutzt
Verwenden Sie den Profiler in Python
Wie man mit dem Datum / Uhrzeit-Typ in Pythons SQLite3 umgeht
Verwenden Sie os.getenv, um Umgebungsvariablen in Python abzurufen
[Für Anfänger] Wie man den Befehl say mit Python benutzt!
Verwendung von Raspeye Relay Module Python
Ich habe versucht zusammenzufassen, wie man Pandas von Python benutzt
Verwendung des in Lobe in Python erlernten Modells
Ich möchte R-Datensatz mit Python verwenden
Umgang mit JSON in Ruby, Python, JavaScript, PHP
Mal sehen, wie def in Python verwendet wird
Behandeln Sie Umgebungsdaten in Python
Verwenden Sie den let-Ausdruck in Python
Verwenden Sie das Messprotokoll mit Python
python3: Verwendung der Flasche (2)
Verwenden Sie die Rückruffunktion in Python
Verwenden Sie den Parameterspeicher in Python
[Python] Verwendung von Liste 1
Melden Sie sich auf der Website in Python an
Verwenden Sie den HTTP-Cache in Python
Behandeln Sie Umgebungsvariablen in Python
Wie benutzt man Python Argparse?
Verwenden Sie Random Forest mit Python
Verwenden Sie Spyder von Python IDE
Python: Wie man pydub benutzt
[Python] Verwendung von checkio
Sprechen mit Python [Text zu Sprache]
Wie man in Python entwickelt
[Python] Verwendung von input ()
Wie benutzt man Python Lambda?
[Python] Verwendung von virtualenv
python3: Verwendung der Flasche (3)
python3: Wie man eine Flasche benutzt
Behandeln Sie komplexe Zahlen in Python
Post an Slack in Python
Verwendung von Python-Bytes
Verwendung der Methode __call__ in der Python-Klasse
[Einführung in die Udemy Python3 + -Anwendung] 36. Verwendung von In und Not
Vergleich der Verwendung von Funktionen höherer Ordnung in Python 2 und 3