Как и в моем предыдущем посте о настройке 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 легко
- Единственное, что вам нужно, это сообщение для шифрования/расшифровки и соль/хеш.
- Функции шифрования/расшифровки могут «переводить» информацию, используя результат шифрования с исходной солью.
Надеюсь, что это помогло, дайте мне знать, если у вас есть какие-либо вопросы!