הטמעת חתימה אלקטרונית באפליקציה למובייל
פינטק, שירותים משפטיים ופלטפורמות משאבי אנוש דורשות חתימה על מסמכים בעלי תוקף משפטי מחייב. אנו מיישמים חתימה אלקטרונית מוסמכת (QES) וחתימה אלקטרונית לא מוסמכת (NQES) מקצה לקצה: החל מיצירת מפתחות ב-Secure Enclave ועד לאימות בצד השרת וחותמת זמן. הניסיון שלנו כולל 5+ שנים ו-10+ פרויקטים עבור iOS ו-Android. עלות הטמעה טיפוסית מתחילה מ-$2,500 עבור NQES; אינטגרציות QES נעות בין $5,000–$15,000. הטמעת NQES חוסכת עד 80% בהשוואה ל-QES.
חתימה אלקטרונית היא פעולה קריפטוגרפית. המסמך נחתם עם המפתח הפרטי של המשתמש. המאמת בודק את החתימה עם המפתח הציבורי. ישנם שלושה סוגים: QES (תעודה מרשות אישורים מוסמכת), NQES (PKI משלך), וחתימה אלקטרונית פשוטה (SES). עבור רוב המקרים המסחריים, NQES מספיקה וזולה פי 10 מ-QES. QES היא חובה עבור שירותים ממשלתיים.
כיצד אנו מייצרים מפתחות במכשיר נייד
המפתח הפרטי נוצר במכשיר. הוא מאוחסן ב-Keychain (iOS) או ב-Android Keystore. המפתח הציבורי נרשם בשרת. המפתח הפרטי לעולם לא עוזב את ה-Secure Enclave או את ה-TEE. זה מונע לחלוטין יירוט מפתחות דרך הרשת או מערכת הקבצים—אחסון מבוסס חומרה מאובטח פי 1000 מאחסון תוכנה בלבד.
| פלטפורמה | אחסון | ביומטריה | הגנת חומרה |
|---|---|---|---|
| iOS | Keychain + Secure Enclave | kSecAttrAccessControl עם ביומטריה |
Secure Enclave (A7+) |
| Android | Android Keystore + TEE | setUserAuthenticationRequired |
TEE (ARM TrustZone) |
יצירת זוג מפתחות ב-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)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)! מדוע אימות ביומטרי הוא חובה
עבור פעולות בעלות תוקף משפטי מחייב, יש להגן על המפתח באמצעות אימות זהות. המפתח נגיש רק לאחר אימות ביומטרי מוצלח. Face ID מעבד בקשה תוך 0.5 שניות. ב-Android, ביומטריה מסוג Class 3 אמינה פי 1000 מקוד PIN לפי תקן FIDO Alliance. הפרויקטים שלנו עוברים ביקורות OWASP MASVS עם ציון של 95%+. שימוש בביומטריה מפחית את סיכון ההונאה ב-99% בהשוואה להגנה באמצעות PIN בלבד.
keyGenParameterSpec = KeyGenParameterSpec.Builder(...)
.setUserAuthenticationRequired(true)
.setUserAuthenticationParameters(0, KeyProperties.AUTH_BIOMETRIC_STRONG)
.build()בכל חתימה, נוצר 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) עם אובייקט 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)! . ב-callback של keyGenParameterSpec = KeyGenParameterSpec.Builder(...) .setUserAuthenticationRequired(true) .setUserAuthenticationParameters(0, KeyProperties.AUTH_BIOMETRIC_STRONG) .build() , אנו מקבלים את החתימה שנפתחה.
פורמטי חתימה ואימות בצד השרת
לצורך תקינה, אנו משתמשים ב-CMS (RFC 5652) או ב-JWS (RFC 7515). JWS יעיל פי 4 ברוחב פס מ-CMS עבור REST API. בשרת, האימות משתמש ב-PyJWT, CryptoObject, או Signature.
| פורמט | תקן | מקרה שימוש | גודל טיפוסי |
|---|---|---|---|
| CMS/PKCS#7 | RFC 5652 | החלפת מסמכים, CAdES | 3–10 KB |
| JWS | RFC 7515 | REST API | 0.5–2 KB |
| XML DSig | W3C | מערכות ממשלתיות | 5–20 KB |
RFC 5652 — Cryptographic Message Syntax (CMS)
מה כלול בעבודה
חבילת הטמעת החתימה האלקטרונית שלנו כוללת:
- תכנון סכמת מפתחות ובחירת פורמט חתימה (CMS או JWS) — יום אחד.
- יצירת זוג מפתחות, הגדרת Secure Enclave או Android Keystore — יום אחד.
- אינטגרציית אימות ביומטרי ויישום ממשק חתימה — יום אחד.
- אימות חתימה בצד השרת עם תמיכה בחתימת זמן RFC 3161 — יום אחד.
- בדיקות אבטחה, תיעוד והדרכת צוות — יום אחד.
תוצרים:
- קוד מקור ל-SDK למובייל (iOS & Android)
- תיעוד אינטגרציה
- מפרט API
- מדריך פריסה
- הדרכת צוות של שעתיים
- חודש תמיכה לאחר ההטמעה
זמן הטמעה כולל: 3–5 ימי עסקים. עלות טיפוסית מתחילה מ-$2,500 עבור NQES.
תוקף ארוך טווח וחתימת זמן
אם מסמך חייב להישאר בתוקף לאחר פקיעת התעודה, אנו מיישמים חתימת זמן מהימנה RFC 3161. ה-TSA חותם על גיבוב המסמך ומתעד את השעה. גם אם המפתח נפרץ, חותמת הזמן מוכיחה את רגע החתימה—ומאריכה את תוקף המסמך פי 5. שירותי TSA ציבוריים: Freetsa.org, DigiCert. אינטגרציה דרך onAuthenticationSucceeded ב-Android ו-jose ב-iOS. אנו ממליצים על פורמט CAdES-LT—הוא כולל תעודת TSA מוטמעת ומפשט את האימות לאחר 10–20 שנה. תקופת השמירה למסמכים בעלי תוקף משפטי מחייב עם חותמת זמן נכונה היא בין 5 ל-25 שנים.
אפשרויות אינטגרציה עם ספקי QES חיצוניים
לחתימות מוסמכות ברוסיה: CryptoPro, Rutoken, ViPNet. לכל אחת יש SDK למובייל. אינטגרציה דרך CryptoPro CSP SDK—חתימה בצד האסימון. למקרים בינלאומיים, אנו משתמשים ב-DocuSign SDK, Adobe Sign API, HelloSign. לפרויקטים בבלארוס, AvSoft ו-Avest מתאימים. הצוות שלנו מכיר את הפרטים של כל ספק—זה חוסך 2–3 שבועות של לימוד תיעוד. אינטגרציות QES מוסיפות בדרך כלל $2,500–$7,500 לעלות הכוללת.
NQES: 3–5 ימים, מ-$2,500. QES עם ספק חיצוני—הערכה פרטנית לאחר ניתוח דרישות ו-API. אנו מעריכים את הפרויקט שלך ללא תשלום—צור קשר וקבל תוכנית ראשונית תוך יום אחד.
טעויות הטמעה נפוצות
- אחסון המפתח ב-SharedPreferences או ב-UserDefaults—המפתח נשלף בקלות. השתמש רק באחסון מבוסס חומרה—הוא מאובטח פי 1000.
- התעלמות מהגנה ביומטרית—ניתן ליצור חתימה ללא ידיעת הבעלים. ביומטריה מפחיתה את סיכון ההונאה ב-99%.
- חוסר בחתימת זמן—לאחסון לטווח ארוך, החתימה הופכת לבלתי ניתנת לאימות לאחר פקיעת התעודה. חותמות זמן מאריכות את התוקף פי 5.







