を、私はこれを解決するために、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
pgcryptoのは、OpenPGPのメッセージで検証をダイジェストサポートしていますが、私はそれは、単純なRSAダイジェストを提供していますかわかりません検証者。 'plpythonu'や' plperlu'などからライブラリを読み込みますか?または、適切なOpenSSLコールをC拡張でラップしますか? –
@CraigRinger私は信頼できないライブラリを使用することを躊躇しています。 Cエクステンションはオプションですが、リリースごとにコンパイルするオーバーヘッドがあります。 pgcryptoは、openssl dgst -signではなくgpg --signを使用していた場合、私が探している機能を提供しますか? – jzacharuk
私はそう思っていましたが、私はそれについて何の機能も見ません。おそらく、それを修正して検証サポートを追加し、将来のバージョンのためのパッチをコアに提出するかもしれません。 C拡張のように何かできることを意味する「信頼できない」としては、あなたが書くものを慎重に扱わなければならず、非スーパーユーザは任意のコードを書くことができません。各リリースで再コンパイルしてください。私はおそらくplperluまたはplpythonuこのような状況で私の最初のストップを作るだろう。 –