2017-06-07 1 views
1

次のコマンドが実行され、content_file、signature_file、およびid_rsa.pub(またはpem)の内容がPostgresデータベースに挿入されます。Postgres内で署名されたダイジェストを検証する方法はありますか?

openssl dgst -sign id_rsa content_file > signature_file

署名はPostgresの内のコンテンツ/公開鍵に対応することを確認する方法はありますか?

私はpgcrypto関数を見てきましたが、唯一の関連関数は秘密鍵を必要とするpgp_pub_decryptのようです。

基本的に私は、Postgresの中で次のことを実行するために探しています:クレイグの提案を1として

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

+0

pgcryptoのは、OpenPGPのメッセージで検証をダイジェストサポートしていますが、私はそれは、単純なRSAダイジェストを提供していますかわかりません検証者。 'plpythonu'や' plperlu'などからライブラリを読み込みますか?または、適切なOpenSSLコールをC拡張でラップしますか? –

+0

@CraigRinger私は信頼できないライブラリを使用することを躊躇しています。 Cエクステンションはオプションですが、リリースごとにコンパイルするオーバーヘッドがあります。 pgcryptoは、openssl dgst -signではなくgpg --signを使用していた場合、私が探している機能を提供しますか? – jzacharuk

+0

私はそう思っていましたが、私はそれについて何の機能も見ません。おそらく、それを修正して検証サポートを追加し、将来のバージョンのためのパッチをコアに提出するかもしれません。 C拡張のように何かできることを意味する「信頼できない」としては、あなたが書くものを慎重に扱わなければならず、非スーパーユーザは任意のコードを書くことができません。各リリースで再コンパイルしてください。私はおそらくplperluまたはplpythonuこのような状況で私の最初のストップを作るだろう。 –

答えて

0

を、私はこれを解決するために、plpythonuというを使用して終了。 Pythonの知識の私の欠如と

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; 

、本の最も難しい部分は、実際に必要なPythonパッケージ(私の場合はドッカー環境)を設定されました。ここで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 

-- 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 
関連する問題