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.
- 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');
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();