Шифровать данные в PostgreSQL и дешифровать данные в Python - PullRequest
0 голосов
/ 01 мая 2018

В моей базе данных есть данные, которые мне нужно зашифровать. Затем я буду загружать базу данных в CSV-файлы. У меня есть программа на Python, которая может расшифровать определенные столбцы в CSV-файле. Проблема в том, что я не получаю свои данные из программы python.

Функция sql:

CREATE OR REPLACE FUNCTION AESEncrypt (data TEXT,pass TEXT)
RETURNS TEXT AS $crypted$
declare
  crypted TEXT;
  key BYTEA;
  iv BYTEA;
BEGIN
  key := digest(convert_to(pass, 'utf-8'), 'sha256');
  iv := digest(convert_to(CONCAT(data , 'salt'), 'utf-8'), 'md5');
  crypted := encode(encrypt_iv(convert_to(data, 'utf-8'), key, iv, 'aes'), 'base64');
  RETURN crypted;
END;
$crypted$ LANGUAGE plpgsql;

Python программа:

import csv
import time
import base64
from hashlib import sha256, md5

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend

password = 'Password'
inputFile = 'test.txt'
outputFile = 'out.txt'
delimiter = ';'
columns = [0]

backend = default_backend()
key = sha256(password.encode('utf-8')).digest()
iv = md5((password + 'salt').encode('utf-8')).digest()
cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend)

def encrypt(input):
    input = bytes(input, 'utf-8')
    #Padding
    length = 16 - (len(input) % 16)
    input += bytes([length])*length
    #Encrypt
    encryptor = cipher.encryptor()
    return base64.b64encode(encryptor.update(input) + encryptor.finalize()).decode("utf-8")

def decrypt(input):
    input = base64.b64decode(input)
    decryptor = cipher.decryptor()
    data = decryptor.update(input) + decryptor.finalize()
    data = data[:-data[-1]] #Remove padding
    print(data)
    return data.decode('utf-8')

def main():
    start_time = time.time()

    with open(inputFile, 'r') as csvfileIn:
        with open(outputFile, 'w', newline='') as csvfileOut:
            spamreader = csv.reader(csvfileIn, delimiter=delimiter)
            spamwriter = csv.writer(csvfileOut, delimiter=delimiter)
            firstRow = True
            for row in spamreader:
                if not firstRow:
                    for pos in columns:
                        row[pos] = decrypt(row[pos])
                firstRow = False
                spamwriter.writerow(row)

    print("--- %s seconds ---" % (time.time() - start_time))

main()

Если я зашифрую файл с помощью функции шифрования, написанной в программе python, то получу правильный результат, если расшифрую его.

Если бы я назвал функцию sql AESEncrypt('data', 'Password'), он возвращает строку base64 Ojq6RKg7NgDx8YFdLzfVhQ== Но после расшифровки я получаю пустую строку как результат, а не строку data. Если я посмотрю на состояние печати перед этапом декодирования utf-8 в функции дешифрования, он выведет на консоль следующую команду b'', так что похоже, что с заполнением может быть что-то не так. Если я буду печатать до того, как уберу отступ, я получу b'\x85\x90sz\x0cQS\x9bs\xeefvA\xc63-'. Если я зашифрую длинное предложение, то я фактически увижу части текста в байтовых выходах выше. Кто-нибудь знает, что я сделал не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...