Как правильно реализовать аутентификацию HMAC для полезной нагрузки Web-API? - PullRequest
0 голосов
/ 14 мая 2019

Я хочу создать HMAC authentication для полезной нагрузки API.Я использую Node.js и crypto для этого.Поскольку я новичок в Node.js и впервые работаю с HMAC, я придумал следующее.

Я хочу убедиться, что это правильный способ сделать это.Если бы я мог улучшить этот код, то я был бы признателен за предложения.

Код:

import * as crypto from "crypto";

const ENCRYPTION_KEY = crypto.randomBytes(32); // Must be 256 bytes (32 characters)
const IV_LENGTH = 16; // For AES, this is always 16
const ALGORITHM = "aes-256-cbc";
const ENCODING = "hex";

function encrypt(text) {
  let iv = crypto.randomBytes(IV_LENGTH);
  let cipher = crypto.createCipheriv(
    ALGORITHM,
    Buffer.from(ENCRYPTION_KEY),
    iv
  );
  let encrypted = cipher.update(text);

  encrypted = Buffer.concat([encrypted, cipher.final()]);

  return iv.toString(ENCODING) + ":" + encrypted.toString(ENCODING);
}

function decrypt(text) {
  let textParts = text.split(":");
  let iv = Buffer.from(textParts.shift(), ENCODING);
  let encryptedText = Buffer.from(textParts.join(":"), ENCODING);
  let decipher = crypto.createDecipheriv(
    ALGORITHM,
    Buffer.from(ENCRYPTION_KEY),
    iv
  );
  let decrypted = decipher.update(encryptedText);

  decrypted = Buffer.concat([decrypted, decipher.final()]);

  return decrypted.toString();
}

const sampleJson = {
  data: [
    {
      type: "articles",
      id: "1",
      attributes: {
        title: "JSON:API paints my bike shed!",
        body: "The shortest article. Ever.",
        created: "2015-05-22T14:56:29.000Z",
        updated: "2015-05-22T14:56:28.000Z"
      },
      relationships: {
        author: {
          data: { id: "42", type: "people" }
        }
      }
    }
  ],
  included: [
    {
      type: "people",
      id: "42",
      attributes: {
        name: "John",
        age: 80,
        gender: "male"
      }
    }
  ]
};

var sampleJsonInString = JSON.stringify(sampleJson);

var encrypted = encrypt(sampleJsonInString);
console.log("Encrypted!! \n" + encrypted);

var decrypted = decrypt(encrypted);
console.log("Decrypted!! \n" + decrypted);

Вывод:

Зашифровано !!

80a71c05e7f05f7410f52abcc687f9ce:779ffcc3607d3413695eee8f8bd218f2da864257c08c112d0bc39c601a19e655d14784fe04239cd2d45a80c10c23ea02ffa21d78d9712c09400b6f57caf3cd1eacd1714433531c52a033312d79dc89acba9c941f009653a2313d2981ea75f7818ec21e4fede2e795b078b8e89c7721efb8dbbf4acb72bd960b71fe06d431f417f8a1b5896d9e07cb9606cde06ac03f141dde8724fb070310e8583c096587ce0e97489b91257b3e11a23b9282b3ca17a0b12773dc534c072154708966d10bfaff7d8295dd386e78d725c85949ecaf6ba1939d645462d4f3183d32ab564e3fc05d1002f4fd189e7d6137d5350814395a1333c66f46d2d576a8e2d02b1c727185f47bf984b73d7b8e1a7b4b485bff86408f15c5f50757d4d859ea5af4e6a718a9ded65bc9db54ef30c57d0cb72b54392cb8992c0d729e0d309db01bd3204906d6e7c890b39203d1b0d2e5163dbf6484153fbf3a6adf6ecef8c6e5231ee05b4070df5c684401f899f642584f71a8b6ed4d48

Расшифровано !!

{"data":[{"type":"articles","id":"1","attributes":{"title":"JSON:API paints my bike shed!","body":"The shortest article. Ever.","created":"2015-05-22T14:56:29.000Z"
,"updated":"2015-05-22T14:56:28.000Z"},"relationships":{"author":{"data":{"id":"42
","type":"people"}}}}],"included":[{"type":"people","id":"42","attributes":{"name"
:"John","age":80,"gender":"male"}}]}
...