Створюємо безпечний IP месенджер з допомогою Virgil і Twilio за 30 хвилин


Привіт!
Ми вже показували вам код, за допомогою якого можна легко і просто реалізувати end-to-end шифрування. Давайте підемо далі і, використовуючи сервіси Virgil Security, розробимо безпечний IP месенджер. Реалізація безпечного IP месенджера з вбудованою функцією шифрування – завдання далеко не тривіальна. У цій статті ми хочемо розповісти як, використовуючи Virgil API і Тwilio IP Messaging API, зробити цей процес набагато простіше.

Частина 1: підготовча

Перш ніж приступати до реалізації нашого месенджера необхідно виконати кілька попередніх дій:

  1. Створити обліковий запис Twilio. Twilio — компанія, що надає в якості сервісу засоби комунікації. З допомогою Twilio завдання розробки IP месенджера сильно спрощується. Проте в цій статті наша мета набагато більш амбітна. Нагадуємо, що нам потрібен безпечний(не плутайте з анонімним) IP месенджер з функцією end-to-end шифрування. Тому нам потрібно…

  2. Створити обліковий запис Virgil Security. Аккаунт відкриває можливість зареєструвати додаток і отримати VIRGIL_ACCESS_TOKEN — секретний ключ, що дозволяє користуватися сервісами Virgil Security.
Після виконання перерахованих вище кроків ви станете щасливим володарем наступного набору параметрів:
  1. TWILIO_ACCOUNT_SID — ідентифікатор вашого аккаунта Twilio (доступний у вашому записі).

  2. TWILIO_API_KEY — секретний ключ, використовуваний для аутентифікації(згенерувати його можна тут).
  3. TWILIO_API_SECRET — додаткова секретна інформація, необхідна для аутентифікації(створюється тут).
  4. TWILIO_IPM_SERVICE_SID — примірник служби Twilio, в якому зберігаються всі дані про вашому додатку(створити можна посилання).
  5. VIRGIL_ACCESS_TOKEN — унікальний маркер, що дозволяє отримати доступ до Virgil Security API. Кожен запит до API повинен містити VIRGIL_ACCESS_TOKEN. Отримати його можна після створення Virgil програми тут.
  6. VIRGIL_APP_PRIVATE_KEY — секретний ключ вашого Virgil програми. Використовується для створення validation token для аутентифікації публічних ключів користувачів у разі, якщо використання Identity Service небажано. Секретний ключ генерується на вашому комп'ютері на сторінці вашого додатка після входу на сайт Virgil.
  7. VIRGIL_APP_PRIVATE_KEY_PASSWORD — всі секретні ключі зберігаються в зашифрованому вигляді, пароль для шифрування необхідний при кожному використанні ключа.

Частина 2: основна

Відправка і отримання повідомлень в Twilio IP месенджері відбувається за допомогою каналів. Кожен канал являє собою окремий чат, в якому одночасно може перебувати необмежене число співрозмовників. Взявши за основу Twilio IP месенджер, покажемо ключові моменти реалізації функції шифрування повідомлень.

Насамперед зазначимо, що використання сервісів Virgil Security можливо практично з будь-якої платформи та на будь-якій мові програмування. Для розробників доступний широкий набір SDKC#, C/C++, Objective-C, Python, Java), полегшують роботу з Virgil Services. Однак їх використання неможливе без VIRGIL_ACCESS_TOKEN. Оскільки ми вже отримали VIRGIL_ACCESS_TOKEN на попередньому етапі, переходимо безпосередньо до розробки.
Наш месенджер буде мати клієнт-серверну структуру. Але все найцікавіше(шифрування, відправлення і розшифрування повідомлень) відбувається на стороні клієнта, на ній ми й зосередимо більшу частину нашої уваги.

  1. Підключаємо JavaScript SDK для Twilio і Virgil API:

    <script src="https://cdn.virgilsecurity.com/packages/javascript/sdk/1.4.6/virgil-sdk.min.js" 
    integrity="sha256-6gsCF73jFoEAcdAmVE8n+LCtUgzQ7j6svoCQxVxvmZ8=" 
    crossorigin="anonymous"></script>
    
    <script src="https://media.twiliocdn.com/sdk/js/common/v0.1/twilio-common.min.js"></script>
    <script src="https://media.twiliocdn.com/sdk/rtc/js/ip-messaging/v0.10/twilio-ip-messaging.min.js"></script>
    

  2. Ініціалізуємо роботу з сервісами(токени для роботи з API отримуємо від сервера):

    // Ініціалізація Twilio
    var accessManager = new Twilio.AccessManager('%TWILIO_TOKEN%');
    var messagingClient = new Twilio.IPMessaging.Client(accessManager);
    // Ініціалізація Virgil
    var virgil = new VirgilSDK("%VIRGIL_ACCESS_TOKEN%");
    

  3. За допомогою Virgil SDK створимо пару ключів для нового користувача Аліса:

    var keyPair = virgil.crypto.generateKeyPair();
    

    І отримаємо наступне:
    ----- BEGIN PUBLIC KEY-----
    MFswFQYHKoZIzj0CAQYKKwYBBAGXVQEFaqncaaqo8ohmbryclmcfq38lwmvv4cau
    jyX6vWn8kJrR0RRfFQAAAAAAAAAAAAAAaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    -----END PUBLIC KEY-----
    
    -----BEGIN EC PRIVATE KEY-----
    MHkCAQEEIFB+lOUvbb4WX+e3zLkAcYpvZR3qpQI8Ru/tcnciCMkIoAwGCisGAQQB
    l1UBBQGhRANCAAQO8ohmBRyclmcfQ38Lwmvv4caujyx6vwn8kjrr0rrffqaaaaaa
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    -----END EC PRIVATE KEY-----
    

  4. Для того щоб інші учасники листування могли відправляти Алісі зашифровані повідомлення, її публічний ключ повинен бути розміщений у сховищі ключів Virgil Keys Service. Процес публікації ключа вимагає спеціального validation token, запобігає створення непідтверджених ключів. Отримати validation token можна з допомогою нашого сервісу перевірки особистості Identity Service, або згенерувавши його самостійно(на стороні сервера), використовуючи VIRGIL_APP_PRIVATE_KEY:

    VirgilSDK.utils.generateValidationToken(
    'Alice', // значення ідентифікатора
    'username', // тип ідентифікатора (будь-яка рядок)
    VIRGIL_APP_PRIVATE_KEY
    );
    

    Отримавши validation token завантажимо публічний ключ користувача у сховищі:

    var options = {
    public_key: keyPair.publicKey,
    private_key: keyPair.privateKey,
    identity: {
    type: 'username',
    value: 'Alice',
    validation_token: '%VALIDATION_TOKEN%'
    }
    };
    
    virgil.cards.create(options).then(function (card){
    myCard = card;
    console.log(card);
    });
    

    Після виконання описаних вище кроків у сховище ключів Virgil Keys Service буде створена спеціальна структура даних, доступна будь-якому користувачеві вашого додатки, звана Virgil Card і включає наступні поля:

    Приклад створеної структури даних Virgil Card:
    { 
    "id":"3e5a5d8b-e0b9-4be6-aa6b-66e3374c05b3",
    "authorized_by":"com.virgilsecurity.twilio-ip-messaging-demo",
    "hash":"QiWtZjZyIQhqZK7+3nZmIEWFBU+qI64EzSuqBcY+E7ZtKPwd4ZyU6gdfU/VzbTn6dHtfahCzHasN...",
    "created_at":"2016-05-03T14:34:08+0000",
    "public_key":{ 
    "id":"359abe31-3344-453a-a292-fd98a83e500a",
    "public_key":"----- BEGIN PUBLIC KEY-----\nMFswFQYHKoZIzj0CAQYKKwYBBAGXVQEfaqncaaq...",
    "created_at":"2016-05-03T14:34:08+0000"
    },
    "identity":{ 
    "id":"965ea277-ab78-442c-93fe-6bf1d70aeb4b",
    "type":"username",
    "value":"Alice",
    "created_at":"2016-05-03T14:34:08+0000"
    }
    }
    

  5. Тепер користувач Аліса готовий до безпечного спілкування. Створимо для цього канал 'general':

    // Створюємо новий канал
    twilioClient.createChannel({ friendlyName: 'general' }).then(function(channel) {
    generalChannel = channel;
    });
    

  6. Будь-хто здатен зайти в канал 'general' і відправити Алісі зашифроване повідомлення. Для цього знаходимо у сховищі Virgil Keys Service публічний ключ Аліси і зашифровуємо з його допомогою секретне повідомлення:

    // Отримуємо список учасників каналу
    Promise.all(generalChannel.getMembers().map(function(member) {
    // Шукаємо Virgil Card всіх учасників листування
    return virgil.cards.search({ value: member.identity, type: 'username' })
    .then(function(cards){
    return { 
    recipientId: cards[0].id 
    publicKey: cards[0].public_key.public_key
    };
    });
    }).then(function(одержувачі) {
    var message = $('#chat-input').val();
    var encryptedMessage = virgil.crypto.encryptStringToBase64(message, recipients);
    
    generalChannel.sendMessage(encryptedMessage); 
    console.log(encryptedMessage);
    });
    

    Зашифроване повідомлення має наступний вигляд:MIIDBQIBADCCAv4GCSqGSIb3DQEHA6CCau8wgglragecmyicvdccavocaqkgjgqkmdg3yjgwymmtmznjyi00mti1lwi4ytgtyte
    3OTEwM2Y3ZjRkMBUGByqGSM49AgEGCisgaqqbl1ubbqeeggeumiibeaibadbbmbugbyqgsm49agegcisgaqqbl1ubbqedqgaecd
    8fhKqYlZxvcmmodg7Z3PNhE1LXLJqobouecrfzarmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaybgcogyxxagucm
    A0GCWCGSAFlAwQCAgUAMEEwDQYJYIZIAwudbaicbqaemeajmavx7s+52BpI5hYyFOc0noIc+qdFFrQanNAtNGBAX/Pxeg5yJ2iA
    JijyZ8ut9zBRMB0GCWCGSAFlAwQBKgQQ81bklcnoyu/QTatCigSzoAQwHnAcbXk0daExIIS+sr6aIvVuF/o6j+1Rs5bvq2WVN41
    k/Oir5x7KZTSR7v3nx+fTMIIBWgIBAqAmBCRmNzM4YTUwNi1hMDywltq1mdgtytjkys04njy1njzlyzg0odmwfqyhkozizj0caq
    YKKwYBBAGXVQEFAQSCARQwggEQAgEAMFswfqyhkozizj0caqykkwybbagxvqefaqncaarj5c3hsyui2sf14k60dz5mv5yd/AsVA
    zPfsmlreGTC2gAAAAAAAAAAAAAAAAAAAaaaaaaaaaaaaaaaaaaaaaaambggbyibjhecbqiwdqyjyiziawudbaicbqawqtanbglg
    hkgBZQMEAgIFAAQwhu7WM1rff9RYsQ+dmfX9Os3Irwm4cm5bIvUlcGXlCfmEsrjtytg5mgjyltxbytl9mfewhqyjyiziawudbae
    qBBCfKdP/gZnkVwJvv4Hdf2eWBDC3czBjV/yPGeGTqBIilHSsrqwK7lVMTBuKR+mR3eNdh+yBIAcOk4rveSUbDuWagDIwJgYJKo
    ZIhvcNAQcBMBkGCWCGSAFlAwQBLgQMfjkcvk3ugxdorcyumtchhusm4yfbacmsnimadaeos7qn7omnsfu1

    При цьому не варто забувати, що незважаючи на те, що мова в цій статті йде про текстові повідомлення, таким же чином ви зможете шифрувати будь-які двійкові дані: зображення, аудіо або відео.

  7. Щоб розшифрувати адресоване їй повідомлення, Аліса повинна скористатися приватним ключем, який зберігається тільки у неї:

    // Прослуховуємо канал і отримуємо нове повідомлення
    generalChannel.on('messageAdded', function(message) {
    
    // Розшифровуємо повідомлення, використовуючи Card Id і секретний ключ
    var decryptedMessage = virgil.crypto.decryptStringFromBase64(
    message.body, 
    myCard.id 
    keyPair.privateKey
    );
    
    console.log(message.author + ': '+ decryptedMessage);
    });
    

    І отримає текст повідомленняBob: Привіт, Алісо!

Частина 3: заключна

Як бачите, створити IP месенджер з вбудованою функцією end-to-end шифрування досить просто. Зрозуміло, ваш месенджер може бути написаний будь-якою мовою програмування і для будь-якої платформи, при цьому реалізація шифрування завжди залишиться такою ж простою.

Переглянути демо версію мессенжера з можливістю створювати нові канали і шифрувати повідомлення можна посилання.

Вихідний код демо версії Virgil+Twilio IP мессенжера можна знайти на GitHub.

Всі наші тьюторіали по роботі з Virgil Security під різними мовами програмування доступні тут.

UPD
За проханнями трудящих перерахуємо кілька варіантів використання описаного месенджера:
  1. Вбудовування системи миттєвих повідомлення у ваше власне застосування. Це дозволить користувачам спілкуватися без залучення стороннього додатка.

  2. Додавання месенджера на веб сайт для прямого спілкування зі службою продажів або тех. підтримкою.

  3. Додавання месенджера в будь-який інструмент, що використовується організацією(наприклад система документообігу). Це дозволить уникнути необхідності використовувати додаткові інструменти для спілкування всередині компанії.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.