Код: Выделить всё
import base64
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives import serialization
private_key_pem = """
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDCpA0jK8IgLtV+
b/X3t+cmt9r3owRyD
Ywbm6Kbsvj/pXNYaI47toIk=
-----END PRIVATE KEY-----
"""
data = b"""GET
/v1/contas/aa/aa
agencia=3995&conta=75557
eyJhbGciOiJSUzUxMiJ9.ew0KIsDQoiYXVkIjogImh0dHBzOi8vb3BlbmFwaS1heHdheS5hcGkuc
1728392567000
2024-10-08T10:02:00-00:00
SHA256"""
private_key = serialization.load_pem_private_key(
private_key_pem.encode('utf-8'),
password=None,
backend=default_backend()
)
signature = private_key.sign(
data,
padding.PKCS1v15(),
hashes.SHA256()
)
signature_b64 = base64.b64encode(signature).decode('utf-8')
signature_b64 = signature_b64.rstrip('=\n').replace('+', '-').replace('/', '_')
print(signature_b64)
Эта функция, приведенная выше, создает подпись с использованием закрытого ключа и работает без сбоев. используя Python.
Но мне нужно передать эту функцию в мою базу данных psotgresql, используя plpython3u, поэтому я скопировал ее следующим образом:
Код: Выделить всё
DROP FUNCTION IF EXISTS public.teste;
CREATE OR REPLACE FUNCTION public.teste()
RETURNS TEXT AS $$
import base64
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives import serialization
private_key_pem = '''-----BEGIN PRIVATE KEY-----
mt9r3owRyDOej0p9qDP0kO0v3eQsKSKmMnV1/WDo0r6Wo/cjsMs4mFC9O
nqvy26/1xE1+mHBoC/+rvhoEn59kzL
Ywbm6Kbsvj/pXNYaI47toIk=
-----END PRIVATE KEY-----'''
data = """GET
/v1/contas/aa/aa
agencia=aa&conta=aa
eyJhbGciOiJSUzUxMiJ9.ew0KInZlciI6ICIxLjAiLA0KImlzcyI6Ih5LmFwaS5wcmViYW5jby5jb20uYnIvYXV0aC9zZXJ2ZXIvdjEuMS90b2tlbiIsDQKGn2JWQ
1728392567000
2024-10-08T10:02:00-00:00
SHA256"""
private_key = serialization.load_pem_private_key(
private_key_pem.encode('utf-8'),
password=None,
backend=default_backend()
)
signature = private_key.sign(
data,
padding.PKCS1v15(),
hashes.SHA256()
)
signature_b64 = base64.b64encode(signature).decode('utf-8')
signature_b64 = signature_b64.rstrip('=\n').replace('+', '-').replace('/', '_')
plpy.notice(signature_b64)
$$ LANGUAGE plpython3u;функции абсолютно одинаковые, но при запуске функции в базе данных Я получаю сообщение об ошибке:
Ошибка SQL [38000]: ОШИБКА: ValueError: («Не удалось десериализовать ключевые данные. Возможно, данные имеют неверный формат, предоставленный пароль может быть неверным, он может быть зашифрован с помощью неподдерживаемого алгоритма или может иметь неподдерживаемый тип ключа (например, кривые EC с явными параметрами).', [])
Онде: Traceback (последний вызов последний):
Функция PL/Python "teste", строка 44, в
private_key =serialization.load_pem_private_key(
Функция PL/Python "teste"
Я не могу понять, почему возникает ошибка, поскольку данные и функции абсолютно одинаковы
Подробнее здесь: https://stackoverflow.com/questions/790 ... -core-data