2017-06-07 51 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以下:

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

+0

pgcrypto支持消化驗證與OpenPGP的消息,但我不知道它提供了一個簡單的RSA摘要驗證。從'plpythonu'或'plperlu'加載一個庫或其他東西?或者用C擴展包裝適當的OpenSSL調用? –

+0

@CraigRinger我對使用不受信任的庫猶豫不決。 C擴展是一個選項,儘管每個發行版都會編譯它的開銷。如果我使用gpg --sign而不是openssl dgst -sign,pgcrypto會提供我正在尋找的功能嗎? – jzacharuk

+0

我認爲是這樣,但我沒有看到它的任何功能。也許你可以修補它來添加驗證支持,併爲未來的版本提交核心修補程序。至於「不可信」這隻意味着他們可以做任何事情,比如C擴展,所以你必須小心你寫的東西,並且它們不適合非超級用戶編寫任意代碼。就像C擴展一樣,但是沒有重新編譯每個版本。在這種情況下,我可能會讓plperlu或plpythonu成爲我的第一站。 –

回答

0

按照克雷格的建議,我結束了使用plpythonu來解決這個問題。

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 
相關問題