Руководство по шифрованию RSA в Node.js с примерами кода.
Node.js поставляется с модулем «crypto», который помогает вам создавать пары открытого и закрытого ключей для использования криптографии с открытым ключом.
Объяснение криптографии с открытым ключом:
Это отличная статья, с которой я столкнулся, которая хорошо объясняет это:
(Пожалуйста, прочитайте эту статью, так как я не освещаю это в посте)
Для меня это развалилось на самом деле из-за реализации, поскольку созданные ключи были в памяти и эфемерны. Я пишу это с примерами кода, которые вы можете запустить:
- Создайте пару открытый/закрытый ключ
- Экспортируйте его и запишите в свою файловую систему (в виде файлов public.pem и private.pem)
- Создайте некоторые образцы данных для шифрования (это наш секрет, который мы не хотим, чтобы кто-либо знал)
- Шифрование указанных данных, сохранение их в файл, чтобы мы могли видеть, как они выглядят.
- Расшифровка этих зашифрованных данных, чтобы получить наши исходные секретные данные
Вот репозиторий Github:
Вам не нужно npm i
, так как нет никаких зависимостей, а модуль crypto
поставляется с node.
- Чтобы создать данные для шифрования, выполните эту команду
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.