Реалізація електронного підпису у мобільному додатку

TRUETECH займається розробкою, підтримкою та обслуговуванням мобільних додатків iOS, Android, PWA. Маємо великий досвід та експертизу для публікації мобільних додатків до популярних маркетів Google Play, App Store, Amazon, AppGallery та інші.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1735 послуг
Реалізація електронного підпису у мобільному додатку
Складний
~3-5 днів
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    495

Реалізація електронного підпису в мобільних програмах

Електронний підпис в мобільній програмі — це не зображення, накладене на документ. Це криптографічна операція: документ підписується приватним ключем користувача, а верифікатор перевіряє підпис за допомогою публічного ключа, гарантуючи, що документ не змінився після підписання і що саме цей користувач його підписав.

Залежно від юрисдикції та вимог розрізняють кваліфіковану електронну підпис (КЕП — з токеном і сертифікатом від акредитованого УЦ), просунуту електронну підпис (ПЕП — власна PKI) та просту електронну підпис (ПЕП — логін/пароль, SMS-код). Для більшості комерційних кейсів достатньо ПЕП; КЕП потрібна для держслуг і юридично значимого документообігу з держорганами.

PKI на мобільному пристрої

Найпоширеніший підхід для ПЕП: приватний ключ генерується на пристрої та зберігається в Keychain (iOS) або Android Keystore. Публічний ключ реєструється на сервері. Підписання відбувається на пристрої — приватний ключ ніколи не залишає Secure Enclave/TEE.

Генерація пари ключів на Android:

val keyPairGenerator = KeyPairGenerator.getInstance(
    KeyProperties.KEY_ALGORITHM_EC, "AndroidKeyStore"
)
keyPairGenerator.initialize(
    KeyPairGeneratorSpec.Builder(context)
        .setAlias("user_signing_key")
        .setKeyType("EC")
        .setKeySize(256)
        .setSubject(X500Principal("CN=User"))
        .setSerialNumber(BigInteger.ONE)
        .setStartDate(startDate)
        .setEndDate(endDate)
        .build()
)
val keyPair = keyPairGenerator.generateKeyPair()
// реєструємо публічний ключ на сервері
val publicKeyBase64 = Base64.encode(keyPair.public.encoded)

Для підписання документа:

val keyStore = KeyStore.getInstance("AndroidKeyStore")
keyStore.load(null)
val privateKey = keyStore.getKey("user_signing_key", null) as PrivateKey

val signature = Signature.getInstance("SHA256withECDSA")
signature.initSign(privateKey)
signature.update(documentBytes)
val signatureBytes = signature.sign()

iOS, Swift:

let attributes: [String: Any] = [
    kSecAttrKeyType as String: kSecAttrKeyTypeECSECPrimeRandom,
    kSecAttrKeySizeInBits as String: 256,
    kSecAttrTokenID as String: kSecAttrTokenIDSecureEnclave,
    kSecPrivateKeyAttrs as String: [
        kSecAttrIsPermanent as String: true,
        kSecAttrApplicationTag as String: "com.example.signing".data(using: .utf8)!
    ]
]
var error: Unmanaged<CFError>?
guard let privateKey = SecKeyCreateRandomKey(attributes as CFDictionary, &error) else {
    // обробити помилку
}
let publicKey = SecKeyCopyPublicKey(privateKey)!

kSecAttrTokenIDSecureEnclave — ключ створюється всередині Secure Enclave і не може бути вилучений навіть при компрометації основного процесора.

Підписання з біометричною аутентифікацією

Для юридично значимих операцій ключ підписання повинен бути захищений підтвердженням особистості. Привів'язуйте до біометрії через Keystore/Keychain: ключ доступний тільки після успішної біометричної аутентифікації в межах поточної сесії.

Android:

keyGenParameterSpec = KeyGenParameterSpec.Builder(...)
    .setUserAuthenticationRequired(true)
    .setUserAuthenticationParameters(0, KeyProperties.AUTH_BIOMETRIC_STRONG)
    .build()

При кожному підписанні:

val biometricPrompt = BiometricPrompt(activity, executor, callback)
val promptInfo = BiometricPrompt.PromptInfo.Builder()
    .setTitle("Підпишіть документ")
    .setSubtitle("Використовуйте біометрію для підтвердження")
    .setNegativeButtonText("Скасувати")
    .build()

// прив'язуємо CryptoObject з нашим об'єктом Signature
biometricPrompt.authenticate(promptInfo, BiometricPrompt.CryptoObject(signature))

У callback onAuthenticationSucceeded отримуємо result.cryptoObject?.signature — розблокований об'єкт підпису, готовий до роботи.

Формат підпису та верифікація на сервері

Для стандартизації використовуйте CMS (Cryptographic Message Syntax, RFC 5652) або JWS (JSON Web Signature, RFC 7515). JWS зручніше для REST API:

Header.Payload.Signature

Header: {"alg": "ES256", "kid": "user_key_id"} Payload: base64url-кодований документ або його хеш Signature: ES256 підпис

На сервері верифікуйте через будь-яку JWT-бібліотеку з підтримкою ES256. Python: PyJWT, cryptography. Node.js: jose, jsonwebtoken. Java: nimbus-jose-jwt.

Довгострокова дійсність та позначка часу

Якщо документ повинен залишатися дійсним роками (після закінчення терміну дії сертифіката підписавця), використовуйте RFC 3161 Trusted Timestamping. Timestamp Authority (TSA) підписує хеш документа + час своїм ключем. Навіть якщо ключ користувача згодом скомпрометований, позначка часу доводить, коли був створений підпис.

Публічні TSA: Freetsa.org, DigiCert TSA. Інтеграція: bouncycastle на Android, Security.framework + запит RFC 3161 на iOS.

Варіанти інтеграції з зовнішніми провайдерами КЕП

Для кваліфікованого підпису в Росії — КриптоПро, Рутокен, ViPNet. Кожен має мобільні SDK. Інтеграція через CryptoPro CSP SDK для Android/iOS: підписання відбувається на стороні токена (фізичного чи програмного), програма просто передає дані в SDK.

Для міжнародних кейсів — DocuSign SDK, Adobe Sign API, HelloSign. Вони абстрагують криптографію, але прив'язують до конкретного провайдера.

Часова шкала для реалізації ПЕП з генерацією ключів у Keystore/Keychain, біометричним підтвердженням та серверною верифікацією — 3–5 днів. Інтеграція з провайдером КЕП або зовнішнім сервісом документообігу — індивідуальна оцінка після аналізу API провайдера.