Desencriptação - Chave Simétrica - Tabela para Planilha

PostgreSQL no Raspberry Pi com FreeBSD 13

Planilha recuperada.ods aberta no OpenOffice Calc
Planilha recuperada.ods aberta no OpenOffice Calc

Em Encriptação - Chave Simétrica - Planilha para Tabela foi visto como armazenar com segurança numa tabela do PostgreSQL, com as informações encriptadas usando uma chave simétrica PGP lida em um arquivo de configuração, os dados das contas de vários sites contidos numa planilha. Agora vamos ver como recuperar as informações armazenadas na tabela e recriar a planilha contendo estas informações.

A tabela usada é idêntica a criada na página Encriptação - Chave Simétrica - psql, e as definições para conexão com o servidor de banco de dados estão mostradas em Módulo Python libpostgres.

Planilha OpenDocument

Os dados das contas lidos na tabela do banco de dados são escritos na planilha recuperada.ods, no formato especificado pelo Open Document Format for Office Applications (ODF), podendo ser abertas pelo Apache OpenOffice Calc, como mostrado na imagem acima, ou por outras planilhas que trabalham com este formato.

Parâmetros da conexão

Os parâmetros da conexão com o servidor de banco de dados são lidos da seção especificada no arquivo de configuração database.ini, mostrado abaixo:

[pguser]
user=pguser
host=raspberry.pi
database=pgbase
password=pguserpwd
port=5432
[halley]
user=halley
host=raspberry.pi
database=pgbase
password=halleypwd
port=5432

Chave de encriptação/desencriptação

A chave simétrica PGP para encriptação/desencriptação dos dados é lida da seção especificada no arquivo de configuração password.ini, mostrado abaixo:

[pguser]
psw = 'Minh4Senh@Fort3'
[halley]
psw = 'Minh4Outr@Senh@Fort3'

Programa

Abaixo está mostrado o programa que lê os dados da tabela sites no servidor de banco de dados PostgreSQL e cria a planilha recuperada.ods.

#!/usr/bin/env ipython
# -*- coding: utf-8 -*-
"""Criptografia pelo Usuário - Chave Simétrica - Tabela para Planilha.

Programa para:

1. Ler uma tabela do PostgreSQL contendo dados das contas de vários sites
   encriptados usando uma chave simétrica PGP lida de um arquivo de
   configuração;

2. Criar uma planilha OpenDocument contendo os dados lidos;

3. Mostrar os dados lidos na tabela.
"""

from pyexcel_io.io import save_data
import textwrap
import psycopg2
import libpostgres

# Nome da seção de onde os dados de conexão e a senha
# simétrica PGP serão obtidos nos arquivos de configuração
SECAO = 'halley'

# Comando SQL para ler as linhas do usuário na tabela
SQLSEL = textwrap.dedent("""\
    SELECT titulo,
    PGP_SYM_DECRYPT(url::bytea,     %(psw)s) as url,
    PGP_SYM_DECRYPT(usuario::bytea, %(psw)s) as usuario,
    PGP_SYM_DECRYPT(senha::bytea,   %(psw)s) as senha,
    PGP_SYM_DECRYPT(notas::bytea,   %(psw)s) as notas
    FROM sites
    WHERE login = %(login)s;""")


def ler(conn, login, psw):
    """Ler as linhas da tabela.

    Args:
        conn: objeto de conexão com o servidor de banco de dados.
        login: login do usuário no servidor de banco de dados.
        psw: chave simétrica PGP usada para desencriptar os dados.

    Returns:
        Lista de linhas da planilha, onde cada linha é uma sublista.

    """
    dados = [['titulo', 'url', 'usuario', 'senha', 'notas']]
    try:
        cur = conn.cursor()
        cur.execute(SQLSEL, { 'psw': psw, 'login': login})
        linhas = cur.fetchall()
        for linha in linhas:
            dados.append(list(linha))
            print(list(linha))

        print(dados)
    except (Exception, psycopg2.DatabaseError) as e:
        print(e)

    return dados


if __name__ == '__main__':
    # Ler a senha simétrica PGP para encriptar
    # os dados no arquivo de configuração
    params = libpostgres.config(SECAO, 'password.ini')
    psw = (params["psw"])
    # Obter os parâmetros da conexão no arquivo de configuração
    parametros = libpostgres.config(SECAO)
    login = parametros["user"]
    # Conectar com o servidor de banco de dados
    conn = libpostgres.conectar(parametros)
    # Ler os dados da tabela e criar a planilha
    linhas = ler(conn, login, psw)
    planilha = {"Sheet1": linhas}
    print(planilha)
    save_data("recuperada.ods", planilha)
    # Fechar a conexão com o servidor de banco de dados
    conn.close()

Abaixo está mostrada a saída produzida pelo programa:

Conectado ao PostgreSQL
['Google', 'https://www.google.com.br/', 'usuario_google', 'senha_google', 'Site de busca, e-mail,...']
['Priberam', 'https://dicionario.priberam.org/', '', '', 'Dicionário de Português Contemporâneo']
['ProtonMail', 'https://mail.protonmail.com/l', 'usuario_proton', 'senha_proton', 'E-mail']
['Wikipédia', 'https://pt.wikipedia.org/', 'usuario_wikipedia', 'senha_wikipedia', 'Enciclopédia livre']
['Yahoo', 'https://br.yahoo.com/', 'usuario_yahoo', 'senha_yahoo', 'Site de busca, e-mail, finanças, …']
[['titulo', 'url', 'usuario', 'senha', 'notas'], ['Google', 'https://www.google.com.br/', 'usuario_google', 'senha_google', 'Site de busca, e-mail,...'], ['Priberam', 'https://dicionario.priberam.org/', '', '', 'Dicionário de Português Contemporâneo'], ['ProtonMail', 'https://mail.protonmail.com/l', 'usuario_proton', 'senha_proton', 'E-mail'], ['Wikipédia', 'https://pt.wikipedia.org/', 'usuario_wikipedia', 'senha_wikipedia', 'Enciclopédia livre'], ['Yahoo', 'https://br.yahoo.com/', 'usuario_yahoo', 'senha_yahoo', 'Site de busca, e-mail, finanças, …']]
{'Sheet1': [['titulo', 'url', 'usuario', 'senha', 'notas'], ['Google', 'https://www.google.com.br/', 'usuario_google', 'senha_google', 'Site de busca, e-mail,...'], ['Priberam', 'https://dicionario.priberam.org/', '', '', 'Dicionário de Português Contemporâneo'], ['ProtonMail', 'https://mail.protonmail.com/l', 'usuario_proton', 'senha_proton', 'E-mail'], ['Wikipédia', 'https://pt.wikipedia.org/', 'usuario_wikipedia', 'senha_wikipedia', 'Enciclopédia livre'], ['Yahoo', 'https://br.yahoo.com/', 'usuario_yahoo', 'senha_yahoo', 'Site de busca, e-mail, finanças, …']]}

Referências

* * *