Criptografia

💡

Recurso disponível apenas para contas Professional do RD Station Conversas.

💡

Apenas alguns endpoints bem específicos requerem criptografia.

Alguns recursos de API requerem uma camada adicional de proteção para tráfego dos dados a fim de garantir confidencialidade e conformidade a exigências legais (e.g. LGPD) e boas práticas de desenvolvimento de sistemas.

Para tanto, é necessário gerar uma chave secreta única, que permitirá criptografar e descriptografar dados de maneira eficiente e segura através da API.

  1. Certifique-se que sua empresa detêm uma conta Profissional;
  2. Ao entrar no RD Station Conversas, abra o menu Apps e Integrações e, em seguida, clique na opção API;
  3. Na página que abrir, clique em Gerar Chave para criar uma chave pública e privada;
  4. Com as chaves em mãos, você poderá utilizar o pacote node-jose para importá-las e criptografar/descriptografar dados transportados pela API.
⚠️

Cada chave é exclusiva para cada conta e não deve ser compartilhada. Armazene-a em um local seguro.

Exemplo de Chaves

Exemplo de chaves pública/privada geradas:

{
  "kty": "RSA",
  "kid": "Y2B0HtjgG_oPW-BTPdtiok4U0IWLIpSs2XN1YtaU-7A",
  "use": "enc",
  "alg": "RSA-OAEP-256",
  "e": "AQAB",
  "n": "0E4-JdrGPOS5nIM1X68u4xSQDu2FgQAbxnPAl7OZht2PyW_trsrgBPzJWDxbdUtYQIKJHRNo2AGu_VFKicbRKtypaBg7HQ9aY41g8pX1Z1Ze-8PSyy-CwhrwNnXCwckVjknn2-Pfd3C3h0YjQS87b2VfeJFIpiS6CtCrCFOue00MoBoJg1872jITqGcIUNgfI90N_Zclp0qFhvqYTsgn__V5QZOYhYLnpqipemU-GgGVZPEDv2chBDHcTUZyS4WGW3s0F2Huon6U2mrKL5ElQC3ACD6zEYhDUnhw4rJ1waCw_FIopEeHbsO6e22L3hPSzrq3iUCVcAhRcJV9tG8bFQ",
  "d": "KwONJ8n2V4qvnVcmxVxqZS_Q05ROliXMln0-jtTiZgwIbgMz5H02JzF_7j2AcUcesSuDXsKsSraGSP7pUmwAs0YfoUQnqMeL1bTTCSTYKP-X24tDUvu7l5NyePx2PAfm8JvoSerTMVnQPBnKm-JB9q3LOh1eEBjTZfpS5wRIqmMOPqfk7_W_YA2yGw7X-YHi0AhwHUxcJxQNiws4e7HPzEhdpFS0-80-OoDyFDNcqYjeofF3upqFg_Cpn2OdIo3dO_N_DCL7dxTl2uvjIeHxSGtIsOIQw-IwyApPw5jTbNTJ3c4cBmHiWO09XjXYVcuoKBhGQZs3bI-27PT1qfNdnQ",
  "p": "8Gu_Qs9PO2U0iMlgGV-qMxU-IVEKHxMKTqIZV1oF5q-fTbw9EmDZG41Y4rPJ71bOF5G3vBTEPiefY10rLZskDzkkCrj4xECSytvT2w079wmoRgTCPEb0ZQaaVg3-i-IPZsS5w4VKL8us2SL3uOYx35q6jj_KiTfVIzGsOii1Q9c",
  "q": "3c2_ZuSXAQwTsOEqZs-MT3wk1UxGU0wKtMhz2S445DkMCWt0DAuJno1cx7gITvQg7lhlRHy4fKB9QZFUStVwR_puaQfPOpLyQn9Xd63q9cI17gH_El0IHjFTX46a7JW7RZcbNRUKiEthXmU-cczFhOKwO0KV3XYrIb99hXjnOvM",
  "dp": "Yj3lHcvQuJiWav6-wh-RUOZxSPPwitog8BjU-hjTKHzDP-SXoBbrIJMVqy2EasSx2ne0-KoTtsJCIzxDFJO8nGvhCnCjVq58TWCepXg29K-Bj3sKU886tr2H-3okdcyeNoRU1Ex3ECjOLLxZNbj60EBN0yrF_GRQN91oXyubRmk",
  "dq": "c4evopB-dvUrbH5b76E7nEs1hERufQSmrvOaJA2HZJiyRFXL5Fo-HG_VW9Hnwfg3Du7MEJhGH-QYWgawuSnjihpPWDXRItlXhnt9u8DDGa9HF-nCSnZavB9FJgjJeWGkYeMLMOL80XEyDlD97ZiTaVwKH1PXa7sZTELJxrPq_TE",
  "qi": "uc0Plt_DEpdXUe-thNiok3JPl5oeCaiQJkUTYoKcyWIygRBEkzdZFm9PyJOMOMlV29eO85WmZiSXDFC8-qQ3uZs9hGb21rpRaZY3Qhhbv1TzuH_AxVvuH_s0iAoUTpK-TDAe3mAkvnjvATI_Dk_s-pBJV7gx1e_FdBbk4wCRlt0"
}

Exemplo de Código JavaScript

Exemplo de código em JavaScript para fazer a importação da chave, criptografar e descriptografar dados usando o pacote node-jose:

const jose = require('node-jose');

const payload = 'dados sensíveis aqui';

const publicPrivateKey = {
  kty: 'RSA',
  kid: 'Y2B0HtjgG_oPW-BTPdtiok4U0IWLIpSs2XN1YtaU-7A',
  use: 'enc',
  alg: 'RSA-OAEP-256',
  e: 'AQAB',
  n: '0E4-JdrGPOS5nIM1X68u4xSQDu2FgQAbxnPAl7OZht2PyW_trsrgBPzJWDxbdUtYQIKJHRNo2AGu_VFKicbRKtypaBg7HQ9aY41g8pX1Z1Ze-8PSyy-CwhrwNnXCwckVjknn2-Pfd3C3h0YjQS87b2VfeJFIpiS6CtCrCFOue00MoBoJg1872jITqGcIUNgfI90N_Zclp0qFhvqYTsgn__V5QZOYhYLnpqipemU-GgGVZPEDv2chBDHcTUZyS4WGW3s0F2Huon6U2mrKL5ElQC3ACD6zEYhDUnhw4rJ1waCw_FIopEeHbsO6e22L3hPSzrq3iUCVcAhRcJV9tG8bFQ',
  d: 'KwONJ8n2V4qvnVcmxVxqZS_Q05ROliXMln0-jtTiZgwIbgMz5H02JzF_7j2AcUcesSuDXsKsSraGSP7pUmwAs0YfoUQnqMeL1bTTCSTzEhdpFS0-80-OoDyFDNcqYjeofF3upqFg_Cpn2OdIo3dO_N_DCL7dxTl2uvjIeHxSGtIsOIQw-IwyApPw5jTbNTJ3c4cBmHiWO09XjXYVcuoKBhGQZs3bI-27PT1qfNdnQ',
  p: '8Gu_Qs9PO2U0iMlgGV-qMxU-IVEKHxMKTqIZV1oF5q-fTbw9EmDZG41Y4rPJ71bOF5G3vBTEPiefY10rLZskDzkkCrj4xECSytvT2w079wmoRgTCPEb0ZQaaVg3-i-IPZsS5w4VKL8us2SL3uOYx35q6jj_KiTfVIzGsOii1Q9c',
  q: '3c2_ZuSXAQwTsOEqZs-MT3wk1UxGU0wKtMhz2S445DkMCWt0DAuJno1cx7gITvQg7lhlRHy4fKB9QZFUStVwR_puaQfPOpLyQn9Xd63q9cI17gH_El0IHjFTX46a7JW7RZcbNRUKiEthXmU-cczFhOKwO0KV3XYrIb99hXjnOvM',
  dp: 'Yj3lHcvQuJiWav6-wh-RUOZxSPPwitog8BjU-hjTKHzDP-SXoBbrIJMVqy2EasSx2ne0-KoTtsJCIzxDFJO8nGvhCnCjVq58TWCepXg29K-Bj3sKU886tr2H-3okdcyeNoRU1Ex3ECjOLLxZNbj60EBN0yrF_GRQN91oXyubRmk',
  dq: 'c4evopB-dvUrbH5b76E7nEs1hERufQSmrvOaJA2HZJiyRFXL5Fo-HG_VW9Hnwfg3Du7MEJhGH-QYWgawuSnjihpPWDXRItlXhnt9u8DDGa9HF-nCSnZavB9FJgjJeWGkYeMLMOL80XEyDlD97ZiTaVwKH1PXa7sZTELJxrPq_TE',
  qi: 'uc0Plt_DEpdXUe-thNiok3JPl5oeCaiQJkUTYoKcyWIygRBEkzdZFm9PyJOMOMlV29eO85WmZiSXDFC8-qQ3uZs9hGb21rpRaZY3Qhhbv1TzuH_AxVvuH_s0iAoUTpK-TDAe3mAkvnjvATI_Dk_s-pBJV7gx1e_FdBbk4wCRlt0',
};

const jwkKey = await jose.JWK.asKey(jwkKey, 'json');
const encryptedPayload = await encrypt(jwkKey, payload);
const decryptedPayload = await decrypt(importedKey, encryptedPayload);

async function encrypt(key, payload) {
  const jsonPayload = JSON.stringify(payload);
  const jwe = await jose.JWE
    .createEncrypt({ format: 'compact' }, key)
    .update(jsonPayload)
    .final();

  return jwe;
}

async function decrypt(key, encryptedPayload) {
  const result = await jose.JWE
    .createDecrypt(key)
    .decrypt(encryptedPayload);
  const stringResult = result.plaintext.toString();
  const payload = JSON.parse(stringResult);

  return payload;
}