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 Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

2 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.

Deixe uma resposta