2017-06-07 1 views
1

Der folgende Befehl wurde ausgeführt und der Inhalt von content_file, signature_file und id_rsa.pub (oder pem) wird in eine Postgres-Datenbank eingefügt.Gibt es eine Möglichkeit, einen signierten Digest in Postgres zu verifizieren?

openssl dgst -sign id_rsa content_file > signature_file

Gibt es eine Möglichkeit zu überprüfen, ob die Signatur mit dem Inhalt/öffentlichen Schlüssel innerhalb Postgres entspricht?

Ich habe mir die pgcrypto Funktionen angeschaut, aber die einzige relevante Funktion scheint pgp_pub_decrypt zu sein, die den geheimen Schlüssel benötigt.

Grundsätzlich Ich suche folgend in Postgres auszuführen:,

openssl dgst -verify .\id_rsa.pem -signature .\signature_file .\content_file

+0

pgcrypto unterstützt mit OpenPGP-Nachrichten Validierung verdauen, aber ich bin nicht sicher, dass es ein einfaches rsa bietet Digest Prüfer. Laden Sie eine Bibliothek von 'plpythonu' oder' plperlu' oder etwas? Oder wickeln Sie die entsprechenden OpenSSL-Aufrufe in eine C-Erweiterung ein? –

+0

@CraigRinger Ich zögere, die nicht vertrauenswürdigen Bibliotheken zu verwenden. Die C-Erweiterung ist eine Option, allerdings mit dem Aufwand, sie für jedes Release zu kompilieren. Würde pgcrypto die Funktionalität bieten, nach der ich suche, wenn ich gpg --sign anstelle von openssl dgst -sign verwende? – jzacharuk

+0

Ich dachte schon, aber ich sehe keine Funktionen dafür. Vielleicht könnten Sie es patchen, um Verifizierungsunterstützung hinzuzufügen und einen Patch für zukünftige Versionen an den Core zu senden. Was "nicht vertrauenswürdig" angeht, bedeutet das nur, dass sie alles tun können, wie eine C-Erweiterung. Sie müssen also vorsichtig sein, was Sie schreiben, und sie sind nicht für Nicht-Superuser verfügbar, um beliebigen Code zu schreiben. Genauso wie C-Erweiterungen, aber ohne Kompiliere es mit jedem Release neu. Ich würde wahrscheinlich plperlu oder plpythonu meinen ersten Halt in dieser Situation machen. –

Antwort

0

Laut Craig Vorschlag endete ich dies mit plpythonu bis zu lösen.

CREATE OR REPLACE FUNCTION api.verify(
    p_data text, 
    p_signature text, 
    p_publickey text 
) 
    RETURNS boolean AS 
$$ 
    try: 
    import rsa 

    pubkey = rsa.PublicKey.load_pkcs1(p_publickey) 
    signature = bytearray.fromhex(p_signature) 
    verified = rsa.verify(p_data, signature, pubkey) 

    return verified 
    except: 
    return False 

$$ LANGUAGE plpythonu VOLATILE 
    SECURITY DEFINER; 

Mit meinem Mangel an Python Wissen, der schwierigste Teil dieser einstellt tatsächlich die erforderlichen Python-Pakete (Docker Umgebung, in meinem Fall) auf. Hier ist der relevante Auszug aus dem Dockerfile:

FROM postgres:9.6 

# Install necessary python packages to work with postgres 
RUN apt-get update \ 
&& apt-get install -y --no-install-recommends \ 
    "postgresql-plpython-$PG_MAJOR" \ 
&& apt-get install -y python-pip python-dev 

# Install python rsa module for signature verification 
RUN pip install rsa 

Die Funktion gegeben daran gearbeitet, die folgenden Parameter:

-- Generate private key. Provide secure passphrase when prompted. 
openssl genrsa -aes256 -out private.pem 4096 

--Export public KEY 
openssl rsa -in private.pem -RSAPublicKey_out -out public.pem 

--Sign data. Provide secure passphrase when prompted. 
--Remove first line (RSA-SHA256(data.txt)=) when passing into database verify function. 
openssl dgst -hex -sign private.pem data.txt > signature.txt 
Verwandte Themen