תפריט

כללי אימות מספרי זהות לפי מדינה ומדוע הם נבדלים

כללי אימות מספרי זהות לפי מדינה נעים בין אלגוריתם מפורסם ומלא לבין תיאור תבנית בלבד ועד לכלום — ומחרוזת אחת יכולה להתאים לכמה מדינות.

פורסם

  • אימות
  • זהות
  • ספרת ביקורת

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

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

מדוע אי אפשר לאמת מספרי זהות באותה דרך?

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

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

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

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

מדינות שמפרסמות את אלגוריתם ספרת הביקורת

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

משפחת החשבון שמעורבת כאן היא המשפחה הרגילה שמבוססת מודולוס, שנסקרת באלגוריתמי ספרת ביקורת, וסכמה לאומית היא בדרך כלל קבוצת פרמטרים מסוימת בתוכה. קומץ מדינות מיישמות את איבר ההכפלה והחיבור של משפחת mod-10; אחרות משתמשות בסידור mod-11, ולכן המיפוי מהשארית לתו נבדל ממקרה למקרה.

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

מדינות שמפרסמות תבנית בלי אלגוריתם

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

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

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

מה קורה כשמספר אחד מתאים לכמה מדינות?

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

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

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

אורך וסט תווים הם רק נקודת התחלה

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

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

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

למפתחים: להתייחס לכללי מדינות כאל נתונים

המשמעות המעשית של כל המגוון הזה היא שאין לקמפל את הכללים אל תוך מסלול הקוד שמחליט את התוצאה.

  1. יש לשמור רשומה אחת לכל סכמה: המדינה, סט התווים החוקי, הצורה ורמת הכיסוי—אלגוריתם, תבנית בלבד, או כלום.
  2. יש לשמור פרמטרים עבור סכמות שמפרסמות חשבון, ולהשאיר את השדה ריק במקום לנחש עבור האחרות.
  3. יש להעביר כל קלט דרך הרשומות שהוא מתאים להן ולהחזיר רשימה, ולא מנצח יחיד.
  4. יש להשאיר את ארבע התוצאות נפרדות בטיפוסים, כדי שמי שקורא לא יוכל בטעות להתייחס לתוצאה של תבנית בלבד כאל אישור.
  5. יש לתארך את מערך הכללים ולהפוך את עדכונו לשינוי בנתונים, משום שמוסכמות לאומיות משתנות וטבלה שמוטבעת בקוד נהפכת לשגויה בשקט.

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

צעדים הבאים

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

המשך קריאה

מדריכים בנושא כלי אימות למספרי כרטיסים ולמספרי זהות