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.
- Certifique-se que sua empresa detêm uma conta Profissional;
- Ao entrar no RD Station Conversas, abra o menu Apps e Integrações e, em seguida, clique na opção API;
- Na página que abrir, clique em Gerar Chave para criar uma chave pública e privada;
- 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;
}