** 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.
Schauen Sie sich zunächst den Beispielcode an, um zu sehen, wie einfach es ist. (Zusammenfassung des Beispielcodes)
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)
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.
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.
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
.
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.
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.
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.
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.
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