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:
- Encontrar o resultado da criptografia de “teste@123”
- Pegar esse texto criptografado (vamos supor que deu “AAAAAAAA”), e colocar em um parâmetro ou algum arquivo texto
- 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:
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.
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.
Opa, obrigado pelo feedback Efraim.
No caso para fazer um MSGET dessa maneira, adicione a palavra PASSWORD logo após PIXEL, segue um exemplo: https://terminaldeinformacao.com/2016/03/15/tela-de-autenticacao-customizada-protheus/
Ou se você usa TGET, mude o atributo lPassword para .T., por exemplo, oGet:lPassword := .T. – https://tdn.totvs.com/display/tec/TGet%3AlPassword
Grande abraço.
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?
Bom dia Thyago, tudo bem?
Você pode salvar em um campo, tudo separado, ou tudo junto concatenado com pipes como você citou.
Caso não queira salvar em campos, você pode salvar em alguma pasta dentro da Protheus Data com MemoWrite / FWFileWriter, e depois ler com MemoRead / FWFileReader.
Abraços.
Obrigado Daniel. Abraço!
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.
Bom dia Wagner.
Obrigado pelo feedback e comentário.
Utilize a máscara “@*” (arroba asterisco, sem as aspas).
Fiz um teste hoje pela manhã em uma tela em MVC e funcionou perfeitamente.