Criptografia

ℹ️

Recurso disponível para contas Pro e Advanced 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. Ao entrar no RD Station Conversas, abra o menu Apps e Integrações e, em seguida, clique na opção API;
  2. Na página que abrir, clique em Gerar Chave para criar uma chave pública e privada;
  3. 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');

async function main() {
  const payload = {
    data: 'dados sensíveis aqui',
  };
  const publicPrivateKey = {
    kty: 'RSA',
    kid: 'kw5qpULIcBxsSNx-ibPhh0sYcfQFCF0MykIscMuxXe4',
    use: 'enc',
    alg: 'RSA-OAEP-256',
    e: 'AQAB',
    n: 'rVeF7EHv732aGcU5nlstFtdCBiKSS7iliEonlOQXfyF9yu4VRltVcBKJJEzivF0FBjtBju5v7lCPSD3TmXO76KO3Mr3qWwF1PhMDQRbjoNKudWBQD1H0asqquF79HoMa2bJPivn8ziw87PZQDzWScPmdxJ8lxRQEZWt_1TE_sWDv0Q4TRZM8wjV43KcuCoiIbauv3MROBo4KmUrxPHVzkgLS86GykFwBFKK1W2ToPRqgFrY29_YySrBvFd8u7IUC-P-ICm0re04-DFgIC4hxZ2lQH0BK8LN5IouwJhTVKG1kUNP2B9mYCipOhDI1Yg5HnQ7Hn7P0i-FHeMIO35AIJQ',
    d: 'Fh76wMVDZOk-_rXsHfjdvrH2w4iq6c3lFgj8lyQqmXdBMeIDRgjG1PgQl1jWgJpQV1S9j4t_LkcKmfoF5GngG5a0_N0-qKF9gE_11NsibnYkfGcvoFzhl7VIZyH8JGYvyYNXYlF3wSnlFopyehZom1FHoH182PMugnDfDepsieqyZpeNOqntB8Usu07kUHJ26J2r8zSrALAOQlqC_zn_xjrvtzKxQSe0dasRmWuRPv54JLGreOzxfSPz9el2GWOITX5XhBNqH49sOCugHfW5dSKUiqS2ahDVhTTDkl4efOeBNYRSg2mBdlIlg3IVt1Et8CE3v6g4Uu0hdmfNWW2Uiw',
    p: '63RzAD-ByjirFB_RQb80zlNoVC-6ar6AAC7cDR9To_1FRw-Y7skGRXDbdBKMwYxzLuKjt29UeCVzgsjd2JEcl_GWdHvVjY6qd7RG7c_5h22Hh0X_1FW_MR4MO-f_9uvl7ogaw13WK6W7b1XcKEa2SZ-OITUpU3eZD4FxZG7Yyu8',
    q: 'vHeawiXKMtViR7SRP19eF7P644nhXsNsZSjUUbfQ1Y7fT19M3yXfZPFu2PQVFsV6Hv9WnSUrdLDNaSEVWvvPs_Rd-vMhWigJFSjrB_i-RNgDAWRsjdguKSG0pPP4h0ZmnOrSNGbTWwL4V79vnsdqoBZKjVIKMZDBevfvOppBLis',
    dp: 'F1hqdqHVWpmXzN0CwIQW1kZK194Lm73bryj2RI7QmjfogI05WqOv7X6tI6sbLa2hVgq-tNdjBq6f712_MVPiA-a-RjppCCoXGNtVFQtD8HuZrn3wSbtew535FI-CP5dQKwBvtuM88wLxvK5Er_Gi7VXWn9BHkrEPCgyJk62x7R0',
    dq: 'Z0sqP8RUeN3ouqIlhVUwjc8v76uvIK_85cil7Y_QXmuqyqbRy-_G611DwpasREnBb-HER-aKVa9dNYRTXwVqRhfltlew7OfKapV9k2XqanL12rp-oJNeYV6-0jWA_itArDorMVs19ci_8d_TPnPPZaQyAhh3y8ipskrXDAhlNvc',
    qi: '5EpsEs7JnAH0XPHi8EI7l4hfswMzFvSxVdDseDPHzxEQ7llewTEoyJV92xMgIL2u0EzD2b3Cjlf7IcOpN-l5j3MJmizj80rLAp3wl_NNkRw3-xd9zDyw9GkBxetynrSAAvy3h-a9YSeNEXcVBLlHM0a2GWmxMy_yuyMKQvLbypo',
  };

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

  console.log(decryptedPayload);
}

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 jsonResult = JSON.parse(stringResult);

  return jsonResult;
}

main();