Como criptografar uma senha usando AdvPL

No artigo de hoje, vou demonstrar duas formas de criptografar senhas em AdvPL.

Já vi em muitos clientes que atendi, senhas chumbadas em fontes, e como isso é perigoso para hackers e para a segurança da empresa.

Então decidi redigir esse artigo, para vocês terem uma noção do que fazer em questão de segurança.

Por exemplo, vamos supor que eu crie um fonte que faça login automaticamente no Protheus para fazer algum procedimento via RPCSetEnv.

O usuário que estou usando é o “Daniel” e a senha é “teste@123”. A lógica então seria mais ou menos essa abaixo:

  1. Encontrar o resultado da criptografia de “teste@123”
  2. Pegar esse texto criptografado (vamos supor que deu “AAAAAAAA”), e colocar em um parâmetro ou algum arquivo texto
  3. No nosso comando RPCSetEnv iremos usar o comando para descriptografar, buscando desse parâmetro ou desse arquivo texto

Nesse artigo, vou mostrar 2 exemplos, um usando a função clássica Embaralha(), e nela como não tem uma criptografia, o que nós fizemos foi adicionar junto com a criptografia um texto (como a data atual). Já o segundo exemplo, utiliza AES para criptografar. O resultado esta no print abaixo:

Exemplo de criptografia

E abaixo o código fonte desenvolvido:

//Bibliotecas
#Include "TOTVS.ch"

/*/{Protheus.doc} User Function zSenha
Exemplo de como criptografar uma senha usando AdvPL
@type  Function
@author Atilio
@since 04/06/2021
@version version
@obs Links de apoio
    Embaralha: https://tdn.totvs.com/display/tec/Embaralha
    AESEncrypt: https://tdn.totvs.com/display/tec/AESEncrypt
    AESDecrypt: https://tdn.totvs.com/display/tec/AESDecrypt
/*/

User Function zSenha()
    Local aArea := GetArea()
    Local cSenhaTst := "teste@123"
    Local cEncrip := ""
    Local cDescrip := ""
    Local aEncrip
    Local aDescrip

    //Usando a embaralha
    cEncrip := Embaralha(dToS(Date()) + cSenhaTst, 0) //Exemplo Criptografando
    cDescrip := SubStr(Embaralha(cEncrip, 1), 9) //Exemplo Descriptografando

    //Usando AES
    aEncrip := AESEncrypt(2, cSenhaTst) //Exemplo Criptografando
    aDescrip := AESDecrypt(2, aEncrip[2], aEncrip[3], aEncrip[4]) //Exemplo Descriptografando

    MsgInfo("Abaixo o resultado dos testes:<br>" + ;
        "Senha: <strong>" + cSenhaTst + "</strong><br>" + ;
        "<ul>" +;
        "<li>Embaralha - criptografando: " + cEncrip + "</li>" +;
        "<li>Embaralha - descriptografando: " + cDescrip + "</li>" +;
        "<li>AES - criptografando: " + aEncrip[2] + "</li>" +;
        "<li>AES - descriptografando: " + aDescrip[2] + "</li>" +;
        "</ul>",;
    "Exemplo de Criptografia e Descriptografia de Senha")

    RestArea(aArea)    
Return

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

7 Responses

  1. Efraim Raizer disse:

    Muito útil, obrigado.
    Curto bastante seus posts e a constância nas publicações.
    Sabe alguma forma de colocar ‘*’ em um GET para que a senha ao ser digitada não fique visível?
    Valeu e parabéns.
    Efraim.

  2. Thyago P Romeiro disse:

    Boa tarde. No caso como a função AESEncrypt retorna um array que será utilizado para descriptografar no futuro, você salva cada retorno em um campo? Ou concantena separando por | (pipe) por exemplo?

  3. Wagner Soares disse:

    Daniel, parabéns pelo trabalho.
    Sobre a exibição da senha num get podemos usar o PASSWORD ou o lPassword, sabe como podemos fazer com um campo de tabela do protheus, para que ao digitar siga o mesmo processo? Não achei nenhuma documentação sobre uma picture pra isso.

Deixe uma resposta para Thyago P RomeiroCancelar resposta

Terminal de Informação