Есть ли способ проверить подписанный дайджест в Postgres?
Была выполнена следующая команда, и содержимое content_file, signature_file и id_rsa.pub (или pem) вставлено в базу данных 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
1 ответ
Согласно предложению Крейга, я решил использовать 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 самой сложной частью была установка необходимых пакетов Python (в моем случае, среда Docker). Вот соответствующая выдержка из 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