חתימה דיגיטלית

הפרימיטיב Digital Signature מאפשר לכם לוודא שאף אחד לא שינה את הנתונים שלכם. היא מספקת אותנטיות ושלמות של הנתונים החתומים, אבל לא סודיות. היא אסימטרית, כלומר היא משתמשת בזוג מפתחות (מפתח ציבורי ומפתח פרטי).

לפרימיטיב Digital Signature יש את המאפיינים הבאים:

  • אותנטיות: אי אפשר ליצור חתימה שמאומתת על ידי PublicKeyVerify.Verify(signature, message), אלא אם יש לכם את המפתח הפרטי.
  • אסימטרית: יצירת החתימה מתבצעת באמצעות מפתח שונה מזה שמשמש לאימות שלה. כך אפשר להפיץ את המפתח הציבורי כדי לאמת חתימות לצדדים שלא יכולים ליצור חתימות בעצמם.

אם לא צריך אסימטריה, כדאי להשתמש במקום זאת בפרימיטיב MAC הפשוט והיעיל יותר.

הפונקציונליות של חתימות דיגיטליות מיוצגת ב-Tink כצמד של פרימיטיבים:

  • PublicKeySign לחתימת נתונים
  • PublicKeyVerify לאימות החתימה

בחירת סוג המפתח

ברוב תרחישי השימוש, מומלץ להשתמש ב-ML_DSA_65 או ב-ECDSA_P256, אבל יש מגוון אפשרויות. באופן כללי, התנאים הבאים מתקיימים:

באלגוריתמים הבאים שאינם פוסט-קוונטיים, צפוי שיהיה צורך לשנות את סוג המפתח בעתיד הקרוב.

  • ‫ECDSA_P256 היא האפשרות הנפוצה ביותר ומוגדרת כברירת מחדל. עם זאת, חשוב לדעת שחתימות ECDSA הן גמישות.
  • ‫ED25519 יוצר חתימות דטרמיניסטיות ומספק ביצועים טובים יותר מ-ECDSA_P256.
  • ‫RSA_SSA_PKCS1_3072_SHA256_F4 יוצר חתימות דטרמיניסטיות ומספק את ביצועי האימות הטובים ביותר (אבל החתימה איטית בהרבה מ-ECDSA_P256 או מ-ED25519).

ערבויות אבטחה מינימליות

  • הנתונים שצריך לחתום עליהם יכולים להיות באורך שרירותי
  • רמת אבטחה של 128 ביט מפני התקפות מסוג 'הודעה נבחרת אדפטיבית' עבור תוכניות שמבוססות על עקומות אליפטיות
  • רמת אבטחה של 112 ביט מפני התקפות מסוג adaptive chosen-message על סכימות מבוססות RSA (מאפשרת מפתחות של 2,048 ביט)

גמישות

תוכנית חתימה היא גמישה אם תוקף יכול ליצור חתימה תקפה שונה להודעה שכבר נחתמה. ברוב המקרים זה לא יוצר בעיה, אבל במקרים מסוימים מתכנתים מניחים באופן מובלע שחתימות תקינות הן ייחודיות, וההנחה הזו עלולה להוביל לתוצאות לא צפויות.

תרחיש שימוש לדוגמה

אפשר לעיין בקטע בנושא חתימה דיגיטלית על נתונים.