Skip to main content

Card Hash Key

O card_hash representa uma versão criptografada das dados card_holder_name, card_number, card_expiration_date e card_cvv.

Nesta seção você vai aprender mais sobre como o hash é criado, e quais algoritmos utilizar.

O card_hash consiste de uma string gerada a partir dos dados do cartão de crédito. Essa string é encriptada por RSA usando uma chave pública que deve ser requisitada ao servidor da Marlim a cada novo card_hash gerado. Essa chave é invalidada e destruída assim que o servidor lê as informações contidas no card_hash, e por isso só pode ser utilizada uma única vez. Ela também é temporária, expirando 30 minutos após ter sido gerada.

1. Gerando uma nova chave​

Abaixo, um exemplo da rota que deverá ser utilizada para obtenção de uma chave pública de encriptação dos dados do cartão de seu cliente:

Request
curl -X GET -G "https://api.isaac.marlim.co/v1/card_hash_key" \
-H "Content-Type: application/json" \
-H "api_key: api_key_value" \
Response200
{
"public_key_id": "fc417fdc29d7ba484ecb4ba9e40966a1",
"public_key": "-----BEGIN RSA PUBLIC KEY-----\nMIICCgKCAgEAmxxkyU71w+0bmVc4wN7ORc6lq6Xd9+jOlOwzgaXX12qLhTABZCb/\n0YgwXPAvfzmgRBgdxVnOiWHSDgWD/8usQ87MG679tj3sc+g6JujLgKaVhue7ET38\nplElx4f20zHb+so8S1hnrtN0N8ZhgMmsMlEq6j70kHXnFMa3lEkK2tmr/QKYergw\nwzETGb7SG/kKlNydNZ/QTafCpRrCNd4kO8R6GMuufoLxPsA5WdK7e3yE2tVSpddv\nQtUawDWHIWEDTNjgBL2hx4DK06FiVzz2QvY4za6DBjuOQvSw+i5jfIYysXS/lpcy\n5e5qkKMfpLfalqTtRAz4ou6ITuoweqpWnjQuqwa2odm26+V0wEPjfHWsDeptZDOR\nvGmHfVcl8UbOj0tuJNhpsqfEYGwCcVJ2TwKsF9Ux7wHv7qptk5FV4tcvdLmxH2r4\nUlNa0l+5dtA8AbKEHt5f+OhGNVgqZxgMwLVoKgW46Jx/LHznBDQEyCE6Zr6oDyBF\nxYlp3AsAzE9nfXIb435V03lqJfNc4DitxiW3+jcrgnoRoVUd3+7awC+wiyOwmgis\n3pQuSSreeYv6XtOZ/AX8RQGf3YqSLAZrT/LH6gzl32ldzCwP2XA3UrVFbMFpvhuL\nVsfAwjPlyGvX7ra6Op17l/nqq/jHqdgkuBK5I5eXJNJq4bgnZEXtF2sCAwEAAQ==\n-----END RSA PUBLIC KEY-----\n",
"created_at": 1668978045960,
"expires_at": 1668979845960
}
PropriedadeSignificado
public_key_idId retornado e que será utilizado para compor o card_hash, logo, é importante que você o reserve.
public_keyChave pública utilizada para criptografar os dados do cartão.
created_atUnixTimestamp da criação da chave.
expires_atUnixTimestamp de expiração da chave.

2. Encriptando os dados do cartão​

Agora você vai ter que criar uma QueryString com valores URLEncoded para os parâmetros do cartão de crédito. Vamos pegar os seguintes dados abaixo como exemplo:

Dados do cartão

"card_number": "4901720080344448",
"card_holder_name": "Luke Skywalker",
"card_expiration_date": "1122",
"card_cvv": "123",

A QueryString ficará composta na seguinte forma:

Querystring Data
card_number=4901720080344448&card_holder_name=Luke%20Skywalker&card_expiration_date=1122&card_cvv=123

Agora você vai fazer uma criptografia pública com RSA e o padding PKCS1Padding usando a public_key que você recebeu na request passando a QueryString construída.

Após criptografar esses dados você deve converter o resultado para base64. Como resultado você terá:

Hash criado a partir de RSA e PKCS1Padding
Q2FyZCBOb3RlOiA0OTAxNzIwMDgwMzQ0NDQ4CkNhcmQgSG9sZGVyIE5hbWU6IEx1a2UgU2t5c2F3a2VyCkNhcmQgRXhwaXJhdGlvbiBEYXRlOiAxMTIyCkNhcmQgQ1ZWOiAxMjM=

Agora com o public_key_id vindo da request inicial, e os dados criptografados convertidos para base64, seu card_hash deverá ser formatado da seguinte maneira: card_hash = public_key_id + "_" + encrypted_string_base64, com o resultado na seguinte forma:

O HASH final do Cartão (card_hash)
fc417fdc29d7ba484ecb4ba9e40966a1_Q2FyZCBOb3RlOiA0OTAxNzIwMDgwMzQ0NDQ4CkNhcmQgSG9sZGVyIE5hbWU6IEx1a2UgU2t5c2F3a2VyCkNhcmQgRXhwaXJhdGlvbiBEYXRlOiAxMTIyCkNhcmQgQ1ZWOiAxMjM=
Nota

Fique atento ao UNDERLINE entre o public_key_id e o encrypted_string_base64.
Acima citamos o formato utilizando ASPAS durante a concatenação somente para ilustração.

3. Criando uma transação​

Com o HASH em mãos, crie uma transação na Marlim, utlizando a string gerada no parâmetro card_hash, seguindo o exemplo abaixo:

Request
curl -X POST "https://api.isaac.marlim.co/v1/transactions" \
-H "Content-Type: application/json" \
-H "api_key: api_key_value" \
-d '{
"net_value": 1000000,
"amount": 1039501,
"installments": "1",
"type": "remittance",
"item_id": "#123456789",
"card_hash": "fc417fdc29d7ba484ecb4ba9e40966a1_Q2FyZCBOb3RlOiA0OTAxNzIwMDgwMzQ0NDQ4CkNhcmQgSG9sZGVyIE5hbWU6IEx1a2UgU2t5c2F3a2VyCkNhcmQgRXhwaXJhdGlvbiBEYXRlOiAxMTIyCkNhcmQgQ1ZWOiAxMjM=",
"customer[name]": "Luke Skywalker",
"customer[email]": "luke@jedimaster.sw",
"customer[document_number]": "00099988877",
"customer[phone_number]": "+18007770133",
"customer[address][zipcode]": "95351",
"customer[address][country]": "us",
"customer[address][state]": "CA",
"customer[address][city]": "Modesto",
"customer[address][neighborhood]": "East Modesto",
"customer[address][street]": "Sunset Ave",
"customer[address][number]": "713",
"soft_descriptor": "Star Wars"
}'

4. Exemplo em NODE​

Uma forma de criar o HASH é utilizando a biblioteca crypto do NodeJS.
Abaixo um exemplo de como criar o card_hash utilizando essa biblioteca:

Usando a Biblioteca Crypto do NodeJS

const crypto = require("crypto");

// 1 - Crie uma função auxiliadora
const encryptCardHash = (card_data, public_key_id, public_key) => {

const esc = encodeURIComponent;
const queryString = Object.keys(card_data).map(key => `${esc(key)}=${esc(card_data[key]).trim()}`).join('&');

const encryptBuffer = crypto.publicEncrypt({
key: public_key,
padding: crypto.constants.RSA_PKCS1_PADDING,
passphrase: public_key_id
}, Buffer.from(queryString))

const encryptedString = encryptBuffer.toString('base64');

return `${public_key_id}_${encryptedString}`;

}

// 2 - Passe os dados do cartão, a public_key_id e a public_key para a função
const card_hash = encryptCardHash({
card_number: "4901720080344448",
card_holder_name: "Luke Skywalker",
card_expiration_date: "1122",
card_cvv: "123",
}, "fc417fdc29d7ba484ecb4ba9e40966a1", JSON.parse("-----BEGIN RSA PUBLIC KEY ... END RSA PUBLIC KEY-----"))

// 3 - O resultado deve ser algo similar ao valor abaixo
card_hash: "fc417fdc29d7ba484ecb4ba9e40966a1_Q2FyZCBOb3RlOiA0OTAxNzIwMDgwMzQ0NDQ4CkNhcmQgSG9sZGVyIE5hbWU6IEx1a2UgU2t5c2F3a2VyCkNhcmQgRXhwaXJhdGlvbiBEYXRlOiAxMTIyCkNhcmQgQ1ZWOiAxMjM="