O MySQL/MariaDB nos provê uma série de funções interessantes para promover a criptografia e a compressão de dados. Isto vem muito a calhar se a linguagem de programação utilizada não dispõe destas funcionalidades. E digo mais, se nossa aplicação faz uso intenso de procedures embarcadas no backend, então, temos um arsenal de funções de uso simples e de vasta implementação.
É importante frisar que caso seja necessário armazenar alguma string proveniente de uma função criptográfica ou de compressão, esta string, deve obrigatoriamente, ser armazenada nos tipos de dados BINARY, VARBINARY ou BLOB’s. Assim, evita-se qualquer contratempo quando da reversão do resultado, isto é, reverter a string criptografada em seu valor original. Gosto muito de usar o VARBINARY. Mas como dizem meus colegas: “André, você não tem que gostar de nada!”…
Outra coisa a ser levada é consideração é o fato de os algoritmos de criptografia MD5 e SHA-1, muito utilizados em aplicações WEB, estão para lá de manjados e podem, facilmente, serem descobertos (revertidos). Portanto, se estamos pensando em segurança, considere utilizar as outras funções que o MySQL/MariaDB coloca a sua disposição.
E o que é algoritmo? Imagine-o como uma receita, que diz quais são os ingredientes a serem misturados, em qual ordem e quantidade devem ser misturados/adicionados, como preparar e qual tempo de preparo. Veja mais em http://pt.wikipedia.org/wiki/Algoritmo
Para rodar os exemplos abaixo utilize qualquer cliente MySQL/MariaDB, tais como: mysql, query-browser, workbench, sqlIOG, etc.
Criptografia
Algoritmo AES (Advanced Encryption Standard)
Certamente é o algoritmo e função de criptografia mais seguro disponível no MySQL/MariaDB. Normalmente, ele utiliza 128bits de nível de criptografia. No entanto, é possível através de alteração do fonte do MySQL/MariaDB conseguir níveis maiores. Caso isto seja necessário em sua aplicação, posso ajudar-lhes neste sentido
Criptografar: AES_ENCRYPT(, )
Descriptografar: AES_ENCRYPT(, )
Exemplo:
mysql> SET @meusegredo = AES_ENCRYPT(‘minha_senha_forte_123′,’a0f1d0’); /* Move resultado da criptografia p/ variável @meusegredo */
mysql> SELECT @meusegredo; /* mostra como ficou a string ‘minha_senha_forte_123’ criptografada */
Resultado => ¨rMœVñåþÓCbF&¶ŒLÌÁ%p4Ñ’Ú¹ôÁHïô
mysql> SELECT AES_DECRYPT(@meusegredo,’a0f1d1′); /* Vamos tentar decryptografar como a chave de embaralhamento errada */
Resultado => NULL => Não funcionou…
mysql> SELECT AES_DECRYPT(@meusegredo,’a0f1d0′); /* já com a chave de embaralhamento correta */
Resultado => minha_senha_forte_123 funciona! 1e2531a1189fb34814109099d2eddae6
Como uma função, o AES_ENCRYPT e/ou AES_DECRYPT pode ser utilizado em comandos/declarações SQL válidas, tais como: SET, SELECT, UPDATE, INSERT, DELETE, REPLACE, etc.
MD5 (Message-Digest Algorithm 5)
Desenvolvido pela RSA Data Security Inc, e descrito na RFC 1321, é muito utilizado em verificação de integridade de pacotes em protocolos P2P (peer-to-peer), e, em segurança de “logins”. Ele transforma os dados em um hash (conjunto de bits) de 128bits. O grande problema do MD-5 é que ele é unidirecional. Não se consegue reverter seu hash na string que lhe originou. Não importa o tamanho da string convertida em MD-5, seu tamanho sempre será 32 caracteres hexadecimais, portanto, pode ser guardado em um CHAR, VARCHAR, ou TEXT.
mysql> SELECT MD5(‘minha_senha_forte_123_em_sua_versao_muito_muito_muito_longa_2010_e_assim_vai’);
Resultado => 1e2531a1189fb34814109099d2eddae6 => string hexadecimal com 32 caracteres
mysql> SELECT MD5(‘123’);
Resultado => 202cb962ac59075b964b07152d234b70 => string hexadecimal com 32 caracteres
mysql> SET @chave_secreta = MD5(‘minha_senha_forte_123_em_sua_versao_muito_muito_muito_longa_2010_e_assim_vai’);
mysql> SELECT @chave_secreta = MD5(‘minha_senha_forte_123_em_sua_versao_muito_muito_muito_longa_2010_e_assim_vai’);
Resultado => 1 = Verdadeiro => logo chave_secreta é igual a string convertida pela MD-5