Ключ користувача лежить не у файлі, а в застосунку: Дія або Приват24. Людина сканує QR, підтверджує дію на телефоні — і ви отримуєте той самий CAdES-підпис, що й від файлового ключа. Ані пароля, ані файла.
Обидва надавачі підключаються одним параметром до тих самих віджетів
sign і auth:
const signer = await embed('sign', { providers: ['file', 'diia', 'smartid'] });
Склад і порядок задаєте ви. Хочете лише Дію — передайте ['diia'], і
перемикача взагалі не буде.
Головне: документ нікуди не йде
До надавача передається тільки геш — 32 байти. Сам файл не покидає пристрій користувача навіть у хмарному режимі: віджет рахує відбиток у себе в iframe і надсилає лише його.
документ ──▶ [ваш браузер: WASM-ядро] ──▶ геш (32 байти) ──▶ надавач
│ │
└──── лишається у вас ◀──── підпис ◀──────────────────────────┘
Тому хмарний підпис не змінює вашої моделі приватності: сервіс, який ви підключаєте, не бачить ні змісту документа, ні його назви — лише відбиток.
Чим два надавачі відрізняються
| Дія.Підпис | Smart ID | |
|---|---|---|
| Застосунок | Дія | Приват24 |
| Кому доступно | будь-хто з активованим Дія.Підписом | клієнтам ПриватБанку |
| Геш | ГОСТ 34.311 | Купина-256 (ДСТУ 7564) |
| Файлів за сесію | до 10 | до 40 |
| Життя QR | 3 хвилини | 3 хвилини |
| Шлях обміну | через наш сервер | напряму браузер ↔ банк |
Остання відмінність важлива для вашої моделі загроз. Smart ID працює напряму: сесія шифрується в браузері користувача, і наш бекенд у обміні не бере участі взагалі — через нього проходить лише малювання QR-картинки з несекретного посилання. Дія інакше: підпис надсилає застосунок на зареєстрований у ДП Дія ендпоінт, тобто на наш сервер, звідки віджет його забирає.
Геш обирати не треба
Кожен надавач приймає свій алгоритм гешу, і віджет підставляє потрібний сам —
за обраним способом. Якщо ви передасте digest явно, для хмарного способу він
буде проігнорований: інакше надавач просто відхилив би запит.
Пачка файлів — одна дія користувача
Кілька документів підписуються однією сесією: один QR, одне підтвердження в застосунку — і пачка підписів назад.
const { batch } = await signer.signBatch([file1, file2, file3]);
Кожен файл у пачці може впасти окремо, не валячи решту: у результаті буде
{ fileName, signature } для вдалих і { fileName, error } для решти.
Detached чи з даними
Надавач підписує геш, тож фізично повертає відокремлений (detached) підпис.
За замовчуванням віджет вкладає у нього ваш документ і віддає повноцінний
.p7s — значення підпису при цьому не змінюється. Потрібен саме detached —
передайте { detached: true }.
Що бачить користувач у застосунку
Назву організації, адресу й призначення операції надавач бере зі свого боку — з даних, які ви вказали під час підключення. У самому запиті на підпис цього немає, тож змінити напис із коду не можна.
Для Дії це три різні поля: назва та повна назва юрособи задаються на відділенні, а рядок операції — це назва офера. Для входу Дія просить назву за шаблоном «Авторизація в "Назва вашої платформи"». Врахуйте, що офер не редагується: щоб змінити цей рядок, створюють новий офер і перемикають на нього налаштування.
Обмеження, про які варто знати заздалегідь
- QR живе 3 хвилини і одноразовий. Не встиг — починаєте спочатку; це обмеження надавачів, не наше.
- Хмарний підпис витрачає наш партнерський акаунт у надавача, тож на
відміну від файлового ключа він доступний лише оплаченим доменам. Домени на
автотріалі за замовчуванням не пускаються: заголовок
Originлегко підробити, і будь-хто міг би нескінченно брати нові квоти за наш рахунок. - Тестове середовище Дії потребує тестового застосунку (Android — App Tester, iOS — TestFlight). Бойовий застосунок з пісочницею не працює.
Вхід за КЕП тими самими способами
Обидва надавачі вміють не лише підписувати, а й підтверджувати особу — див. Вхід за КЕП. Віджет той самий, параметр той самий:
const auth = await embed('auth', { providers: ['file', 'diia', 'smartid'] });