Montando um MAC ou HMAC (Hash)

Neste post eu vou montar de uma maneira bem simples como criar um MAC (Message Authentication Code).
No ColdFusion existe a função Hash que gera uma chave de segurança e é super simples de usar.

Ele converte o tamanho de uma variável do tipo string em uma string de tamanho fixo que pode ser usada como "fingerprint" ou identificação unica para a string original.

Sintax: Hash(string [, algorithm [, encoding ]])

Apenas o primeiro parâmetro é necessário, por padrão o parâmetro "algoritnm" é o MD5 e no terceiro parâmetro você pode usar por exemplo o "UTF-8", mas apenas se for necessário porque na maioria das vezes esse parâmetro não é usado.

Então vamos lá... Vou montar abaixo as linhas que vão gerar o hash.

<cfset variables.timestamp = "1406572727952" />
<cfset variables.usuario_ID = "12345678910" />
<cfset variables.values = "#variables.timestamp##variables.usuario_ID#" />

Nas variáveis acima estou usando o timestamp em milisegundos, o id do usuário e estou juntando os dois numa variável que será usada para gerar o hash.

<cfset variables.secret = "teste_123" />

Agora na variável acima eu estou criando uma senha secreta que será adicionada a minha variável values na hora da montagem do hash.

<cfset variables.mac = Lcase(Hash("#variables.values##variables.secret#", "MD5")) />

Finalmente nosso Hash foi criado sem problema algum.

No código abaixo eu montei um exemplo usando um formulário para testes. Estou comparando um MAC recebido com um gerado para comparar se eles são válidos.

<!--- Fontes de consulta: 

http://httpd.apache.org/docs/2.2/misc/password_encryptions.html

https://groups.google.com/forum/#!topic/railo/xKZaNOiymOw

http://www.bennadel.com/blog/2428-change-in-coldfusion-date-gettime-method-in-coldfusion-10.htm

http://stackoverflow.com/questions/1614196/how-can-i-get-an-md5-hash-in-coldfusion

http://wiki.its.iastate.edu/plugins/viewsource/viewpagesrc.action?pageId=1914

Converte milisegundos em data
http://www.cflib.org/index.cfm?event=page.udfbyid&udfid=1211

--->
<cfparam name="form.timestamp" type="any" default="" />
<cfparam name="form.usuario" type="any" default="" />
<cfparam name="form.MACRec" type="any" default="" />

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Untitled Document</title>
        <style>
.cor {background-color:#FC9;}
</style>
    </head>
    
    <body>
    <cfoutput>
        <div id="divFrm" style="width:100%;">
        <form name="frmMAC" id="frmMAC" action="teste_MD5.cfm" method="post">
        <table align="left" border="0" celspace="0" celpadding="2">
            <tr><td>TimeStamp:</td><td><input type="text" name="timestamp" id="timestamp" value="#form.timestamp#" /></td></tr>
                <tr><td>Usuário:</td><td><input type="text" name="usuario" id="usuario" value="#form.usuario#" /></td></tr>
                <tr><td>MAC:</td><td><input type="text" name="MACRec" id="MACRec" value="#form.MACRec#" /></td></tr>
                <tr><td colspan="2" align="center"><input type="submit" name="enviar" id="enviar" value="Enviar" /></td></tr>
            </table>
        </form>
        </div>
        </cfoutput>
        
        <cfif IsDefined("form.MACRec") AND form.MACRec NEQ "">
        <div id="resultado" style="width:100%;">
<cfif form.timestamp EQ "">
            Você deve informar o valor do timestamp.
                
                <cfexit />
            <cfelseif form.usuario EQ "">
            Você deve informar o usuário.
                
                <cfexit />
            <cfelse>
            <cfset variables.values = "#form.timestamp##form.usuario#" />
                <cfset variables.secret = "teste_123" />
                
                <cfset variables.mac = Lcase(Hash("#variables.values##variables.secret#", "MD5")) />
                
                <cfset variables.Datetimestamp = dateAdd("s", form.timestamp/1000, "january 1 1970 00:00:00") />
                
                <cfset variables.Diferenca = DateDiff("s",variables.Datetimestamp,GetHTTPTimeString(Now())) />
                
                <cfoutput>
                <table align="left" border="1" celspace="0" celpadding="2">
                        <tr class="cor"><td>TimeStamp:</td><td>#form.timestamp#</td></tr>
                        <tr><td>Usuário:</td><td>#form.usuario#</td></tr>
                        <tr class="cor"><td><b>MAC Recebido:</b></td><td><b>#LCase(form.MACRec)#</b></td></tr>
                        <tr><td><b>MAC Gerado:</b></td><td><b>#variables.mac#</b></td></tr>
                        <tr><td>Data do TimeStamp Informado:</td><td>#DateFormat(variables.Datetimestamp,"dd/mm/yyyy")# #TimeFormat(variables.Datetimestamp,"HH:mm:ss.lll")#</td></tr>
                        <tr><td>Diferença entre as datas em segundos:</td><td>#variables.Diferenca#</td></tr>
                    </table>
                </cfoutput>
</cfif>
            </div>
        </cfif>
    </body>
</html>

Comentários

Postagens mais visitadas deste blog

Criando uma Variável em ColdFusion e em ASP

Definindo Valores Padrões para Variáveis

O que é ColdFusion? Para que serve?