Aqui temos algumas funções primitivas genéricas Pretty Good Privacy (PGP) apresentadas como chamadas de API em execução em um servidor Node HTTPS:.
Essas funções não são específicas, como pode ser usado para dizer, implementar um plug-in de mensagens de e-mail, mas são destinadas especificamente para um registro de usuário e aplicativo de autorização de logon que chama as funções genéricas para suportar seu processo maior.
Os conceitos e códigos mostrados aqui são facilmente adaptáveis e são compartilhados em https://github.com/Bob-Wright/openPGP_functions_on_Node_API_Server .
PGP é uma implementação de um esquema de criptografia de chave pública (PKC) geralmente baseado no método de criptografia RSA .
O PGP geralmente é empregado para assinar e criptografar mensagens de e-mail que são verificadas e descriptografadas pelo destinatário. Outro grande uso é criptografar arquivos e unidades para proteger seu conteúdo.
Observe que as características do PKC/PGP tornam a identidade dos participantes em tal troca ou transação identificável entre si. Na verdade, nosso caso de uso é baseado nesse aspecto do esquema.
Aqui está um artigo sobre esquemas PKC que fornece algumas boas explicações sobre os conceitos e métodos envolvidos: https://hackernoon.com/public-key-cryptography-simply-explained-e932e3093046 .
O PGP como técnica ou método de criptografia está disponível há algum tempo e foi codificado ou programado em um bom número de linguagens e plataformas diferentes.
A implementação bastante recente do JavaScript openPGPjs que usamos é escrita em Nodejs como uma API assíncrona e pode ser encontrada neste repositório: https://github.com/openpgpjs/openpgpjs .
Fornecemos uma interface para as funções do openPGPjs por meio de uma estrutura de API do Express Nodejs que usa envios de formulário POST do chamador.
A seguir está o código do cabeçalho em nosso programa de API Nodejs server.js . Esta seção de código mostra os módulos necessários para inclusão.
Após este código de título, inserimos aqui vários pontos de entrada da API para as várias funções que fornecemos.
Após listar essas várias funções de API, temos esta breve seção final de código que configura e executa o servidor HTTPS: para as funções de API.
Nossa API lida com uma série de objetos no decorrer de suas atividades, sendo que alguns desses objetos são armazenados em tabelas de um banco de dados e um é gerado a partir do conteúdo de outra tabela de dados.
Mais sobre o uso da tabela de dados mais tarde, mas enquanto isso, este bloco de código a seguir é para um módulo Node usersdb_conn.js que nos conecta ao banco de dados mySQL de nossos usuários que temos em uso geral nas funções da API.
Agora que descrevemos nosso shell de API geral, podemos ver as funções que ele apresenta aos nossos usuários.
Praticamente toda função PGP emprega um ou mais dos três objetos importantes em suas determinações e operações.
O primeiro desses objetos é o objeto do usuário que, no nosso caso, é gerado a partir de dados sobre o usuário que extraímos de um banco de dados com o endereço de e-mail do usuário fornecido por meio da mensagem POST.
O conteúdo deste banco de dados do usuário foi previamente preenchido por outra parte do nosso processo de registro.
Aqui, na listagem abaixo, podemos ver a solicitação POST usada para invocar a função de gerador de chaves, bem como uma função para obter o tipo de chave e o tamanho do bit de chave de um arquivo de configuração e a função que usamos para extrair os valores de dados específicos do usuário da tabela do banco de dados.
Nesta próxima seção de listagem abaixo, vemos a invocação da função de geração de chave openPGP usando os valores de nome, sobrenome, frase secreta e dados de e-mail que obtivemos logo acima. Depois que as chaves são geradas nesta versão de demonstração, também gravamos cada uma delas em um arquivo apropriado.
As duas funções a seguir verificam a existência dos registros de chave pública e privada nas tabelas de dados de chave pública e privada. Usamos essas informações para decidir se estamos inserindo uma nova chave ou substituindo/atualizando uma chave já existente, conforme mostrado na listagem abaixo desta.
A função aqui a seguir exibe uma página de mensagem de sucesso de banner salutar para o navegador do usuário que enviou o POST de API de geração de chaves de demonstração.
O código da página de exibição do banner de sucesso da keygenWebpage que acabamos de examinar acima é a última função usada na seção POST do gerador de chaves da API.
Para que essas funções individuais cumpram a tarefa pretendida de gerar um par de chaves do usuário, precisamos de um método para enfileirar essas funções para executar em uma ordem adequada à tarefa com cada função, por sua vez, fornecendo sua contribuição para a lista de tarefas .
Portanto, o código principal para a chamada de API do gerador de chaves que discutimos é executado como parte dessa função de modelo “performAsyncFunctions”, que é um controlador de função assíncrona que executa cada função sequencialmente, aguardando a conclusão de cada função antes de passar para a próxima.
Depois que essa chamada de API do gerador de chaves for executada, teremos todos os três objetos geralmente usados para criptografar ou descriptografar e assinar ou verificar mensagens de texto disponíveis para nosso uso.
Temos uma página de menu HTML simples chamada sendPost.html mostrada aqui abaixo da configuração para demonstrar ou executar as chamadas disponíveis em nossa API.
Este é o seu formulário HTML básico que envia uma solicitação POST para o nosso servidor API e as três entradas para criar um par de chaves são implementadas com este código mostrado a seguir.
Por fim, para nossa demonstração, exibimos uma exibição de página de banner sinalizando a conclusão do processo de geração de chaves. Essa conclusão resulta em três objetos principais para uso do esquema PGP. Uma é a do objeto de usuário com seus atributos de nome , sobrenome , senha e endereço de e-mail .
Nosso gerador de chaves criou dois novos objetos adicionais para nosso uso, um objeto de chave pública e um objeto de chave privada .
O log do console é usado para exibir nossos resultados e progresso para várias funções, e este é um exemplo de log do console da execução da demonstração do gerador de chaves.
Existem quatro operações de interesse que usamos em nossa implementação de API. Essas operações são para criptografar uma mensagem , assinar uma mensagem , descriptografar uma mensagem e verificar uma mensagem .
É possível criptografar e assinar ou descriptografar e verificar uma mensagem, então isso nos dá uma tabela de seis funções gerais além do gerador de chaves.
A criptografia de mensagem usa a chave pública do remetente, enquanto a descriptografia de mensagem usa a chave privada e a senha do destinatário, portanto, essas operações complementares usam chaves complementares.
A assinatura da mensagem usa a chave privada e a senha do signatário, enquanto a verificação usa a chave pública de maneira complementar semelhante.
Criptografar ou descriptografar uma mensagem são as duas funções mais comuns do PGP. Vejamos como eles são implementados em nossa API.
Este código mostrado abaixo é o início de nossa chamada de API Encrypt.
Como pode ser visto, a primeira coisa que fazemos é obter o endereço de e-mail do remetente ou do criptografador da mensagem POST, seguida da mensagem em texto simples que desejamos criptografar junto com a chave pública do criptografador, que em nossa demonstração é extraída de um tabela de banco de dados com base no e-mail que fornecemos em nossa chamada de API.
Assim que tivermos a mensagem de texto simples que queremos criptografar junto com a chave pública do remetente, podemos continuar a criptografar a mensagem usando uma função openPGP conforme mostrado aqui a seguir.
Para nossa demonstração, encerramos a chamada da API gravando o arquivo criptografado no disco.
Todas essas funções acima e usadas em nossa chamada de API Encrypt são executadas na ordem conforme indicado pela função assíncrona “performEncryptAsyncFunctions” de fechamento com sua sequência enfileirada de funções esperadas listadas acima.
A demonstração não apresenta uma mensagem de conclusão para nosso usuário de API para esta chamada, mas apresenta um arquivo de log para nosso terminal de servidor, conforme mostrado abaixo.
Assim que tivermos uma mensagem de texto criptografada em nossa posse, podemos querer ler seu texto simples ou conteúdo não criptografado. É claro que isso envolve o processo de descriptografia que é realizado pelo código a seguir.
Começamos analisando a mensagem POST para o endereço de e-mail do usuário, seguido por uma função para ler nossa mensagem criptografada de um arquivo.
A descriptografia em nosso caso de uso requer uma chave privada e uma senha , e extraímos a senha de nosso banco de dados de usuários conforme mostrado aqui.
Nosso esquema PGP fornece um nível adicional de proteção por um processo conhecido como “ blindagem ” da chave que envolve criptografá-la com essa senha.
Além dessas duas funções anteriores, temos uma função adicional para obter a chave privada de seu banco de dados.
Com esses objetos, podemos descriptografar a mensagem e salvar o texto simples em um arquivo usando as duas primeiras funções da lista abaixo.
Mais uma vez, conforme mostrado acima, usamos nossa construção “performAsyncFunctions” para executar sequencialmente cada função na lista de espera.
Como foi feito com a chamada da API Encrypt, a interação fornecida por essa chamada da API Decrypt consiste em texto exibido no terminal do console, conforme mostrado neste log de exemplo abaixo.
Além das três funções principais de geração de chave , criptografia de mensagem e descriptografia de mensagem, o código também atende a quatro outras funções de API que são assinar e verificar junto com as chamadas de API criptografar e assinar e descriptografar e verificar .
O código e os resultados do log do terminal para essas APIs estão incluídos no repositório GitHub em https://github.com/Bob-Wright/openPGP_functions_on_Node_API_Server
O código para executar este programa Node como um serviço no Linux (Ubuntu20) também está incluído no repositório GitHub.
Este código é escrito mais como uma demonstração e um exemplo de API NodeJS do que como qualquer utilitário pronto para produção. Espero que sirva bem a esse propósito, pois você vê que o escrevi como meu próprio exemplo de demonstração.
Deve ser facilmente adaptável aos seus próprios fins. Comentários ou sugestões são bem-vindos.
Publicado também aqui