Python JSON-шифрование получило ошибку, а psycopg2 преобразует данные JSON в одинарные кавычки - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь зашифровать данные JSON, хранящиеся в базе данных.У меня есть открытый ключ, который используется для шифрования, а также хранится в таблице в базе данных.Это мой код:

import psycopg2
import . . . .
.
.
#get json data from database
def getJson():
    sql = '''
    SELECT  json_data from table1;
    '''
    cursor.execute(sql)
    result = [row[0] for row in cursor.fetchall()]

    return result

# get public key to encrypt
def getPubKey():
    sql = '''
    select public_key from table2 
    where col1 = 'xxx'
    and col2 = 'yyy'
    limit 20;
    '''
    cursor.execute(sql)
    rsa_pub = cursor.fetchone()[0]
    return rsa_pub

def encrypt_rsa(_rsa_pub, plaintext):
    key_txt = _rsa_pub.encode()
    public_key = serialization.load_pem_public_key(key_txt, default_backend())

    # encrypt plaintext
    pad = padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),
                   algorithm=hashes.SHA256(),
                   label=None)
    return public_key.encrypt(plaintext, pad)


def run():
    message = getJson()
    pk = getPubKey()
    for x in message:
        json.dumps(x)
        enc = encrypt_rsa(pk , x)
        enc = base64.b64encode(enc).decode()
        print(enc)

Я адаптировал функцию encrypt_rsa () из Документ Google .И я получил эту ошибку:

TypeError: initializer for ctype 'unsigned char *' must be a cdata pointer, not dict

Поэтому я попытался напечатать запрашиваемые мной данные json, которые оказались в одинарных кавычках: {'data':'abc'}, что странно, поскольку в формате JSON должен использоваться двойной типцитаты.Поэтому я попробовал запрос в pSQL и получил данные в двойных кавычках {"data":"abc"}.Я не уверен, что это является причиной ошибки или нет.

Мой вопрос здесь

  1. Кажется, что psycopg2 преобразует мой результат JSON в текст в одинарных кавычках вместодвойная кавычка по умолчанию.Итак, как я могу заставить двойные кавычки, как обычно?
  2. Если он становится в двойных кавычках, а ошибка по-прежнему возникает, как я могу зашифровать базу данных JSON тем, что я пробовал в своем коде?

Трассировка:

Traceback (most recent call last):
  File "encrypt.py", line 78, in <module>
   run()
  File "encrypt.py", line 70, in run
   enc = encrypt_rsa(pk , x)
 File "encrypt.py", line 56, in encrypt_rsa
   return public_key.encrypt(plaintext, pad)
 File "/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/rsa.py", line 446, in encrypt
   return _enc_dec_rsa(self._backend, self, plaintext, padding)
 File "/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/rsa.py", line 68, in _enc_dec_rsa
   return _enc_dec_rsa_pkey_ctx(backend, key, data, padding_enum, padding)
 File "/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/rsa.py", line 123, in _enc_dec_rsa_pkey_ctx
   res = crypt(pkey_ctx, buf, outlen, data, len(data))
TypeError: initializer for ctype 'unsigned char *' must be a cdata pointer, not dict
...