Por que o pgp_sym_encrypt do PostgreSQL retorna uma saída diferente, apesar de invocado para a mesma entrada?

2

Estou obtendo resultados diferentes enquanto executo o comando pgp_sym_encrypt do PostgreSQL com o mesmo texto simples e senha de entrada. Ao descriptografar esses resultados diferentes com a mesma frase-senha, recebo o texto simples correto de volta.

Eu gostaria de entender por que a função criptografar sempre dá um resultado diferente para o mesmo texto sem formatação com a mesma frase secreta?

Mesmo problema com texto simples, chave exclusiva e chave de sessão também.

Eu criei restrições exclusivas na mesma coluna onde estou obtendo resultados de criptografia diferentes, portanto, ele permite adicionar novos registros para o mesmo texto várias vezes.

Exemplo:

pgp_sym_encrypt('12345','key1')

Se eu executar o comando acima duas vezes, então terei uma saída diferente e quando descriptografar as saídas diferentes, recuperarei o mesmo texto simples.

    
por Ashish Patel 07.07.2017 / 12:45

1 resposta

2

Criptografia OpenPGP

No OpenPGP, a mensagem não é diretamente criptografada com a frase secreta. Em vez disso, uma chave de sessão aleatória é gerada como chave para a criptografia simétrica da mensagem.

Esta chave de sessão agora é criptografada usando a frase secreta. Ao aplicar essa abordagem de duas etapas, é possível criptografar a mensagem uma vez, mas permitir a descriptografia usando diferentes chaves privadas ou senhas adicionando uma cópia criptografada da chave de sessão uma vez. Para entender melhor como as mensagens do OpenPGP são construídas, dê uma olhada em RFC 4880, OpenPGP e a saída de gpg --list-packets e pgpdump para a mensagem criptografada (ambos imprimem informações nos pacotes OpenPGP).

Além disso, cada mensagem é preenchida com alguns bytes aleatórios, resultando também em mensagens completamente diferentes. Por fim, a mensagem criptografada armazena o registro de data e hora da criptografia, que obviamente será diferente, a menos que você criptografe duas vezes exatamente no mesmo segundo.

Ter uma saída diferente ao criptografar a mesma mensagem duas vezes pode ser muito importante: as informações de que duas mensagens realmente são a mesma mensagem geralmente já são um problema. Por ter teclas de sessão aleatórias e preenchimento, um invasor não pode fazer nenhuma suposição sobre o conteúdo da mensagem, pois ele recebe várias mensagens.

Restrição Única na Saída Criptografada

Se você precisar ter uma restrição exclusiva na mensagem, calcule uma soma de hash criptográfico (por exemplo, SHA-256) na mensagem e armazene-a adicionalmente (e calcule a restrição exclusiva na soma de hash, em vez da criptografada mensagem).

    
por 07.07.2017 / 13:37