Руководство по шифрованию RSA в Node.js с примерами кода.

Node.js поставляется с модулем «crypto», который помогает вам создавать пары открытого и закрытого ключей для использования криптографии с открытым ключом.

Объяснение криптографии с открытым ключом:

Это отличная статья, с которой я столкнулся, которая хорошо объясняет это:



(Пожалуйста, прочитайте эту статью, так как я не освещаю это в посте)

Для меня это развалилось на самом деле из-за реализации, поскольку созданные ключи были в памяти и эфемерны. Я пишу это с примерами кода, которые вы можете запустить:

  1. Создайте пару открытый/закрытый ключ
  2. Экспортируйте его и запишите в свою файловую систему (в виде файлов public.pem и private.pem)
  3. Создайте некоторые образцы данных для шифрования (это наш секрет, который мы не хотим, чтобы кто-либо знал)
  4. Шифрование указанных данных, сохранение их в файл, чтобы мы могли видеть, как они выглядят.
  5. Расшифровка этих зашифрованных данных, чтобы получить наши исходные секретные данные

Вот репозиторий Github:



Вам не нужно npm i, так как нет никаких зависимостей, а модуль crypto поставляется с node.

  1. Чтобы создать данные для шифрования, выполните эту команду
npm run create-data

Теперь у вас должен быть файл с именем data_to_encrypt.txt в корне проекта. Это произвольные данные, созданные с помощью модуля шифрования Node.js. Если вам интересно, посмотрите здесь: https://github.com/nkhil/node-crypto/blob/master/src/rsa/create-data-to-encrypt.js

Итак, теперь у нас есть секретные данные для шифрования 🎉

Чтобы зашифровать его, нам нужно сначала создать нашу пару открытого и закрытого ключей. В реальном мире мы бы предоставили наш открытый ключ публично, и любой мог бы использовать открытый ключ для шифрования данных, отправить их нам, и только мы смогли бы прочитать эти данные (используя наш закрытый ключ, который только мы будет).

Примечание. В этом небольшом комиксе объясняется, что такое открытые и закрытые ключи:



Создание нашей пары открытый-закрытый ключ

Вот как мы создадим нашу пару открытого и закрытого ключей, экспортируем ее и запишем в файл.

2. Чтобы создать пару открытый/закрытый ключ, вы можете запустить:

npm run create-keys

Обратите внимание, что мы записываем его в корень проекта и называем private.pem и public.pem.

Шифрование некоторых данных

Вот как мы будем шифровать данные в файле с именем data_to_encrypt.txt, который мы создали на шаге 1 (я пронумеровал только команды, которые вы будете использовать).

3. Чтобы зашифровать данные в data_to_encrypt.txt (который мы создали на шаге 1 выше), используйте

npm run encrypt-data

Как только вы запустите этот ^, у вас должен быть файл с именем encrypted_data.txt в корне вашего проекта. Не стесняйтесь открывать этот файл, это искаженная версия наших данных.

Расшифровать данные

Вот код для расшифровки данных

Ваши расшифрованные данные должны совпадать с содержимым файла data_to_encrypt.txt.

Поздравляем, вы только что использовали шифрование RSA для шифрования некоторых данных с помощью открытого ключа, а затем использовали прилагаемый закрытый ключ для расшифровки и чтения этой информации.

Некоторые примечания

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

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

Я видел, как закрытые ключи надежно хранятся с помощью решения для хранения, такого как корзины AWS S3 (или корзины хранилища GCP), и делают так, чтобы только приложения с соответствующей ролью IAM могли получить доступ к файлам в корзине. Этим созданием ресурсов обычно управляет Terraform, но мы не будем вдаваться в подробности.

Следует отметить, что существует ограничение на размер данных, которые вы можете зашифровать с помощью шифрования RSA. Когда я пытаюсь зашифровать 128-байтовую строку, я получаю следующую ошибку:

Error: error:0409A06E:rsa routines:RSA_padding_add_PKCS1_OAEP_mgf1:data too large for key size

Взгляните на эту дискуссию о переполнении стека для получения дополнительной информации.

Больше контента на plainenglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Получите эксклюзивный доступ к возможностям написания и советам в нашем сообществе Discord.