Как и в моем предыдущем посте о настройке nodemailer, мне стыдно признаться, что просмотр документации по криптографии напугал меня и помешал мне использовать его невероятные дары. Только когда я столкнулся с проблемой кодирования, я был вынужден действительно понять, насколько легко на самом деле настроить. В этом посте я продемонстрирую, что нам нужно для настройки шифрования на сервере, чтобы мы могли шифровать и расшифровывать информацию, когда она нам может понадобиться.

Отказ от ответственности: в этом посте предполагается, что вы уже настроили свой интерфейс и сервер с помощью node/express. Если вы хотите настроить приложение CRUD с полным стеком, ознакомьтесь с предыдущим постом Как создать приложение стека MEAN.

Зависимости

Для начала вам нужно будет установить криптопакет, если вы еще этого не сделали:

npm install --save crypto

Шифрование и дешифрование

После того, как ваш пакет будет установлен, вам нужно будет потребовать его на своем сервере, например:

const crypto = require('crypto');

Здорово! Теперь, когда вам требуется крипто, нам нужно создать наши функции шифрования и дешифрования на нашем сервере:

//server.js
const encrypt = (messageToEncrypt, salt) => {
  let cipher = crypto.createCipher('aes-256-ctr', salt);
  let crypted = cipher.update(message, 'utf8', 'hex');
  crypted += cipher.final('hex');
  return crypted;
}
const decrypt = (messageToDecrypt, salt) => {
  let decipher = crypto.createDecipher('aes-256-ctr', salt);
  let dec = decipher.update(message, 'hex', 'utf8');
  dec += decipher.final('utf8');
  return dec
}

Кажется, что это слишком много информации для распаковки, но на самом деле все намного проще, чем может показаться. Сначала давайте начнем с того, что делает функция crypto.createCipher и что происходит с ее забавным параметром. TLDR документации, функция использует algorithm (на основе релизов openSSL) и password для возврата шифра. Этот пароль может быть любым, что мы захотим, поэтому, если вы хотите вставить свою собственную соль, вы можете это сделать! Далее у нас есть функция cipher.update. Как следует из названия, cipher.update просто обновляет шифр переданными данными. В нашем случае это данные message, которые мы хотим закодировать. Затем мы передаем 'utf8', чтобы помочь закодировать сообщение. Наконец, нам нужно сообщить нашей функции обновления, каким должен быть наш окончательный формат.

Наконец, мы вызываем функцию final для остановки функции обновления. Передавая строку hex, мы сообщаем нашей функции, что результат должен возвращать строку.

Теперь, если мы посмотрим на нашу функцию decrypt, станет ясно, что мы выполняем аналогичные операции с теми же значениями, чтобы обратить (или расшифровать) процесс.

Практические примеры

Это все прекрасно и щегольски, но если этим нельзя воспользоваться, какой нам в этом прок? Это отличный момент. Вот где я хотел бы снова соединить нас с проблемой кодирования, которую я написал. Суть этого заключалась в том, что люди должны иметь возможность шифровать и расшифровывать сообщения, которые НЕ ХРАНЯТСЯ в базе данных, просто передавая сообщение и соль для шифрования или зашифрованное сообщение и соль для расшифровки.

//server.js
app.post('/api/encrypt/:id', (req, res, next) => {
  let { message } = req.body;
  let salt = req.params.id
  let encrypted = encrypt(message, salt);
  if (!encrypted) {
    res.status(404);
    res.json({
      error: 'information is invalid'
    });
  } else {
    res.send(encrypted);
  }
});
app.get('/api/encrypt/:id', (req, res, next) => {
  let salt = req.params.id;
  let messageToDecrypt = req.query.message;
  let decrypted = decrypt(messageToDecrypt, salt);
  if (!decrypted) {
    res.status(404);
    res.json({
      error: 'information is invalid'
    });
  } else {
    res.send(decrypted);
  }
});

И вот оно!

Краткое резюме:

  • Шифрование и дешифрование с помощью Crypto легко
  • Единственное, что вам нужно, это сообщение для шифрования/расшифровки и соль/хеш.
  • Функции шифрования/расшифровки могут «переводить» информацию, используя результат шифрования с исходной солью.

Надеюсь, что это помогло, дайте мне знать, если у вас есть какие-либо вопросы!