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

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

לחתימות יש את המאפיינים הבאים:

  • אותנטיות: לא ניתן ליצור חתימה שעבורה מתבצע אימות של 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 ביט)

תרחיש לדוגמה

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

עמידות

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