Як реалізувати шифрування та дешифрування PGP в Azure за допомогою Function Apps

Зміст
1) Мета
2) Попередні вимоги
3) Генерація ключів
4) Функція шифрування
5) Функція дешифрування
6) Результат

pic

1. Мета
Налаштувати та налаштувати шифрування та дешифрування PGP для файлів для безпечної передачі за допомогою Azure Function App. Код написано за допомогою Nodejs.

A) Шифрування — Файли будуть зашифровані за допомогою публічного ключа та підписані за допомогою приватного ключа.
B) Дешифрування — Підпис файлу буде перевірятися за допомогою публічного ключа та дешифрований за допомогою приватного ключа.

2. Попередні вимоги
Докладний процес створення функціонального додатку в Azure, встановлення необхідних бібліотек OPENPGP для вашого NodeJS проекту та їх деплой в функціональний додаток надається нижче —

A) У порталі Azure створіть функціональний додаток, який знаходиться в плані «споживання» (consumption).
Створення першої функції в порталі Azure | Microsoft Learn

B) Відкрийте VS Code і увійдіть до Azure —
Посилання для завантаження: Visual Studio Code — Редагування коду. Переосмислене
Необхідні розширення: Azure, Azure functions

C) Відкрийте VS Code та свій проект. У вашому проекті встановіть модуль OpenPGP в терміналі —
“npm install — save openpgp”

D) Після встановлення — Це збереже OpenPGP у вашому файлі залежностей

pic

E) Розгорніть локальний проект у новоствореному функціональному додатку (код зазначено нижче)

pic

3. Генерація ключів
PGP шифрування потребує генерації приватного та публічного ключа, і для мети демонстрації можна використати наступне посилання для генерації ключів —

  1. Перейдіть за посиланням для генерації ключів —
    Створити PGP ключі онлайн
  2. Заповніть усі дані та запам'ятайте пароль
  3. Натисніть «Generate», і це надасть вам обидва ключі. Запишіть обидва ключі для демонстраційної мети.

4. Функція шифрування

Ініціалізуйте та збережіть публічний ключ (publicKeyArmored) та вміст файлу (plaintext), який потрібно зашифрувати з тіла запиту. Прочитайте публічний ключ за допомогою модуля openpgp. Використовуйте функцію openpgp.encrypt() для шифрування plaintext.

Функція openpgp.encrypt використовує 4 параметри — message, encryptionKeys, signingKeys, format

const openpgp = require('openpgp');  
module.exports = async function (context, req) {  
 // Функція для шифрування повідомлення  
 async function encryptMessage(publicKey, privateKey, message) {  
 const publicKeyObj = await openpgp.readKey({ armoredKey: publicKey });  
 const privateKeyObj = await openpgp.readPrivateKey({ armoredKey: privateKey });  
 const encryptedMessage = await openpgp.encrypt({  
 message: await openpgp.createMessage({ text: message }),  
 encryptionKeys: publicKeyObj,  
 signingKeys: privateKeyObj,  
 format: 'armored'  
 });  
 return encryptedMessage;  
 }  
 const publicKeyArmored = req.body.publicKey; // Публічний ключ отримувача  
 const encryptmsg = req.body.data; // Текст, який потрібно зашифрувати  
 const privateKeyArmored = req.body.privateKey;  
 try {  
 const encryptedMSG = await encryptMessage(publicKeyArmored, privateKeyArmored, encryptmsg);  
 context.res = {  
 body: { encryptedText: encryptedMSG }  
 };  
 context.done();  
 } catch (error) {  
 console.error('Помилка:', error);  
 }  
};

Розгорніть цей код у функціональному додатку Azure та використовуйте його з необхідним тригером.
Примітка: Переконайтеся, що передаєте всі необхідні параметри під час виклику функціонального додатку.

5. Функція дешифрування

Ініціалізуйте та збережіть публічний ключ, приватний ключ та зашифрований файл, який потрібно дешифрувати з тіла запиту. Прочитайте публічний і приватний ключі за допомогою модуля openpgp.
Використовуйте функцію openpgp.decrypt() для дешифрування файлу.

Функція openpgp.decrypt використовує 3 параметри — message, decryptionKeys, verificationKeys.

Замість попередньої функції шифрування, використовуйте наступну функцію дешифрування:

// Функція для дешифрування повідомлення  
 async function decryptMessage(privateKey, publicKey, encryptedMessage) {  
 // Прочитати зашифрований приватний ключ, публічний ключ та зашифроване повідомлення  
 const privateKeyObj = await openpgp.readPrivateKey({ armoredKey: privateKey });  
 const publicKeyObj = await openpgp.readKey({ armoredKey: publicKey });  
 const messageObj = await openpgp.readMessage({ armoredMessage: encryptedMessage });  
 // Дешифрувати повідомлення  
 const { data: decryptedMessage } = await openpgp.decrypt({  
 message: messageObj,  
 decryptionKeys: privateKeyObj, // Використовувати приватний ключ тут  
 verificationKeys: publicKeyObj  
 });  
 try{  
 await decryptedMessage[0].verified;  
 console.log('Підпис є дійсним');  
 } catch (error) {  
 console.log('Підпис НЕ ДІЙСНИЙ!');  
 decryptedMessage = 'Підпис НЕ ДІЙСНИЙ!';  
 }  
 return decryptedMessage;  
 }

Розгорніть цей код у функціональному додатку Azure та використовуйте його з необхідним тригером.
Примітка: Переконайтеся, що передаєте всі необхідні параметри під час виклику функціонального додатку.

6. Результат

A) Тест «Hello world» 😎

pic

B) Використовуючи тригер Azure Logic app «коли блоб додається або змінюється» —

pic

pic

pic

Дякую за читання! Сподіваюся, це допомогло ✌

Перекладено з: How to Implement PGP Encryption and Decryption in Azure using Function Apps

Leave a Reply

Your email address will not be published. Required fields are marked *