Я пытаюсь зашифровать данные 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"}
.Я не уверен, что это является причиной ошибки или нет.
Мой вопрос здесь
- Кажется, что
psycopg2
преобразует мой результат JSON в текст в одинарных кавычках вместодвойная кавычка по умолчанию.Итак, как я могу заставить двойные кавычки, как обычно? - Если он становится в двойных кавычках, а ошибка по-прежнему возникает, как я могу зашифровать базу данных 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