תפריט

מבנה IBAN וספרת הביקורת mod-97

מבנה IBAN הוא קוד מדינה, שתי ספרות ביקורת של ISO וחלק חשבון לאומי שכל מדינה מגדירה אחרת. החשבון של mod-97 הוא שמחבר בין השלושה.

פורסם

  • אימות
  • IBAN
  • ספרת ביקורת

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

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

מהם החלקים של IBAN?

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

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

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

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

קוד המדינה ושתי ספרות הביקורת של ISO

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

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

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

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

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

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

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

הפיכת אותיות למספרים: הרעיון שמאחורי mod-97

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

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

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

מדוע בדיקה שעברה אינה מוכיחה שחשבון קיים?

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

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

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

למפתחים: ניתוב לפי מדינה ואורך

המימוש הוא ברובו ניהול רשומות, ובניהול הרשומות יושבות התקלות.

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

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

צעדים הבאים

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

המשך קריאה

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