בעזרת הפרימיטיב של החתימה הדיגיטלית אפשר לוודא שאף אחד לא שינה את הנתונים שלכם. היא מספקת אותנטיות ותקינות של הנתונים החתומים, אבל לא סודיות. הוא אסימטרי, כלומר הוא משתמש בזוג מפתחות (מפתח ציבורי ומפתח פרטי).
לפרימיטיב החתימה הדיגיטלית יש את המאפיינים הבאים:
- אותנטיות: אי אפשר ליצור חתימה ש-
PublicKeyVerify.Verify(signature, message)
מאמתת, אלא אם יש לכם את המפתח הפרטי. - אסימטרי: ליצירת החתימה נעשה שימוש במפתח שונה מזה שמשמש לאימות שלה. כך תוכלו להפיץ את המפתח הציבורי לאימות חתימות לצדדים שלא יכולים ליצור חתימות בעצמם.
אם אין צורך באסימטריה, מומלץ להשתמש במקום זאת בפרימיטיב MAC הפשוט והיעיל יותר.
הפונקציונליות של חתימות דיגיטליות מיוצגת ב-Tink כצמד פרימיטיבים:
- PublicKeySign לחתימה על נתונים
- PublicKeyVerify לאימות החתימה
בחירת סוג מפתח
מומלץ להשתמש ב-ECDSA_P256 ברוב תרחישי השימוש, אבל יש מגוון אפשרויות. באופן כללי, הכלל הבא תקף:
- ECDSA_P256 היא האפשרות הנפוצה ביותר, וזוהי ברירת המחדל הסבירה. עם זאת, חשוב לזכור שחתימות ECDSA הן ניתנות לשינוי.
- פרוטוקול ED25519 יוצר חתימות גורםיות ומספק ביצועים טובים יותר מ-ECDSA_P256.
- RSA_SSA_PKCS1_3072_SHA256_F4 יוצר חתימות ודטרמיניסטיות ומספק את ביצועי האימות הטובים ביותר (אבל החתימה איטית בהרבה מ-ECDSA_P256 או מ-ED25519).
ערבויות אבטחה מינימליות
- אורך הנתונים לחתימה יכול להיות שרירותי
- רמת אבטחה של 128 ביט מפני התקפות הודעות נבחרות אדפטיביות לסכמות שמבוססות על עקומה אליפטית
- רמת אבטחה של 112 ביט מפני התקפות אדפטיביות של הודעות שנבחרו מראש לסכמות מבוססות RSA (מאפשרת מפתחות של 2048 ביט)
גמישות
סכימה לחתימה היא גמישה אם תוקף יכול ליצור חתימה תקפה אחרת להודעה שכבר חתומה. זה לא בעיה ברוב התרחישים, אבל במקרים מסוימים מתכנתים מניחים באופן משתמע שחתימות תקינות הן ייחודיות, וזה עלול להוביל לתוצאות בלתי צפויות.
תרחיש לדוגמה
מידע נוסף זמין במאמר חתימה דיגיטלית על נתונים.