Menu

Cấu trúc IBAN và phép kiểm tra mod-97

Cấu trúc IBAN gồm mã quốc gia, hai chữ số kiểm tra ISO và phần BBAN do từng nước tự quy định. Bài này giải thích cách đọc ba đoạn đó, ý tưởng của phép kiểm tra mod-97, và vì sao đạt kiểm tra không có nghĩa tài khoản tồn tại.

Đăng ngày

  • cấu trúc IBAN
  • mod-97
  • dữ liệu thử

Cấu trúc IBAN là một trong những ví dụ rõ nhất cho thấy cùng một chuỗi ký tự có thể bị ràng buộc bởi nhiều tầng quy tắc chồng lên nhau. Chuỗi này được dùng để định danh tài khoản ngân hàng xuyên biên giới, và nó có một phần do tiêu chuẩn quốc tế quy định, một phần do từng quốc gia tự quy định. Đọc hết bài này, bạn sẽ biết ba đoạn của chuỗi nói lên điều gì, phép kiểm tra mod-97 hoạt động theo ý tưởng nào, và vì sao một chuỗi đạt phép kiểm tra vẫn chưa nói được gì về việc tài khoản có tồn tại hay không.

Cấu trúc IBAN chia thành những đoạn nào?

Chuỗi này được chia thành ba đoạn nối liền nhau, không có dấu phân cách bắt buộc ở giữa. Hai ký tự đầu tiên là mã quốc gia, viết theo bộ mã hai chữ cái dùng chung cho các quốc gia và vùng lãnh thổ. Hai ký tự tiếp theo là hai chữ số kiểm tra do tiêu chuẩn quốc tế quy định. Toàn bộ phần còn lại được gọi là BBAN, viết tắt của số tài khoản cơ sở của ngân hàng.

Điểm quan trọng nhất cần nhớ là ranh giới quyền hạn giữa các đoạn. Tiêu chuẩn quốc tế quy định hai đoạn đầu và cách kiểm tra toàn chuỗi. Nhưng độ dài tổng của chuỗi và cấu trúc bên trong của BBAN lại do từng quốc gia tự đặt ra. Điều này không phải một chi tiết nhỏ: nó là lý do vì sao một biểu mẫu viết sẵn một độ dài cố định sẽ từ chối oan tài khoản của những quốc gia khác.

Vì phần BBAN rất khác nhau giữa các nước, một chuỗi hợp lệ ở nước này có thể có độ dài không hề xuất hiện ở nước kia. Bất kỳ đoạn mô tả nào nói rằng chuỗi này luôn dài đúng một số ký tự cố định đều đang mô tả một quốc gia cụ thể, chứ không mô tả tiêu chuẩn.

Mã quốc gia và hai chữ số kiểm tra ISO

Hai ký tự đầu không mang thông tin về ngân hàng, chúng chỉ cho biết chuỗi này thuộc quốc gia nào. Nhờ vậy hệ thống xử lý có thể chia luồng ngay từ ký tự đầu tiên: đọc mã quốc gia, rồi áp bộ quy tắc của quốc gia đó cho phần còn lại. Cách chia luồng theo mã quốc gia là bắt buộc, không phải một lựa chọn thiết kế, vì mọi bước sau đều phụ thuộc vào cấu trúc riêng của nước đó.

Hai chữ số kiểm tra ở vị trí thứ ba và thứ tư là phần quốc tế thật sự. Chúng được tính cho toàn bộ chuỗi, không phải cho riêng phần BBAN, và chúng chỉ có giá trị khi phần BBAN đứng sau đã đúng theo quy định của quốc gia tương ứng. Đây là một điểm dễ bị hiểu ngược: nếu ai đó thay đổi nội dung phần BBAN mà giữ nguyên hai chữ số kiểm tra ISO, phép kiểm tra sẽ báo không đạt ngay, vì hai chữ số đó gắn với cả chuỗi chứ không gắn với mã quốc gia.

Chính vì hai chữ số này nằm ở giữa chuỗi chứ không nằm ở cuối, nhiều sổ tay hướng dẫn phải mô tả một bước sắp xếp lại trước khi tính. Với những thuật toán chữ số kiểm tra đặt ở cuối chuỗi thì không cần bước đó, nhưng với trường hợp này thì có, và đó là chi tiết khiến nhiều bản triển khai tự viết bị sai ở lần chạy đầu tiên.

Vì sao trong BBAN còn có chữ số kiểm tra quốc gia

Song song với hai chữ số kiểm tra quốc tế, nhiều quốc gia còn nhúng thêm một chữ số kiểm tra của riêng mình vào bên trong BBAN. Chữ số này được tính theo quy tắc nội địa, độc lập với phép kiểm tra quốc tế, và nó chỉ có ý nghĩa trong phạm vi quốc gia đó.

Hệ quả là một chuỗi đầy đủ có thể bị hai tầng ràng buộc cùng lúc, và hai tầng này có thể không đồng thời đạt. Một chuỗi sửa tay rất dễ rơi vào tình trạng đạt tầng quốc tế nhưng hỏng tầng nội địa, hoặc ngược lại. Khi một công cụ chỉ trả về một chữ không đạt duy nhất cho trường hợp này, người dùng không thể biết phải sửa chỗ nào.

Cách làm đúng là báo cáo tách rời: phần kiểm tra ISO đạt hay không, và phần kiểm tra nội địa đạt hay không. Với người dùng, đây là khác biệt giữa việc gõ lại hai ký tự đầu và việc đi hỏi lại ngân hàng về số tài khoản.

Đổi chữ cái thành chữ số: ý tưởng của mod-97

Phép kiểm tra của chuỗi này dựa trên nhánh thuật toán lấy dư cho chín mươi bảy. Ý tưởng cốt lõi gồm hai bước. Bước thứ nhất là chuyển mọi chữ cái trong chuỗi thành chữ số theo một quy tắc cố định, để toàn bộ chuỗi trở thành một dãy chỉ gồm chữ số. Bước thứ hai là sắp xếp lại chuỗi theo một quy ước đã định, rồi chia dãy đó cho chín mươi bảy và xem phần dư.

Nếu phần dư rơi đúng vào giá trị đã quy ước, chuỗi được coi là tự nhất quán. Vì chín mươi bảy là một số nguyên tố và tương đối lớn so với các mô-đun nhỏ, phép chia này phân biệt được nhiều trường hợp hơn hẳn nhánh lấy dư cho mười. Đó là lý do nhánh này được chọn cho những chuỗi dài có lẫn chữ cái.

Quy ước sắp xếp lại là phần dễ bị bỏ sót nhất khi đọc tài liệu. Nếu bạn chỉ ghi nhớ câu lấy toàn chuỗi chia cho chín mươi bảy mà không thực hiện đúng bước sắp xếp, bạn sẽ nhận được kết quả sai một cách có hệ thống: hầu hết các chuỗi đúng đều bị báo không đạt. Cách kiểm chứng duy nhất là đối chiếu với mẫu do tiêu chuẩn công bố.

Vì sao đạt kiểm tra không có nghĩa tài khoản tồn tại?

Vì phép kiểm tra chỉ đọc chuỗi ký tự, và chuỗi ký tự không chứa thông tin về việc tài khoản có được mở hay chưa. Hai chữ số kiểm tra chứng minh rằng phần BBAN và mã quốc gia khớp nhau về mặt cấu trúc, không hơn. Một người hiểu quy tắc hoàn toàn có thể ngồi dựng một chuỗi mới toanh, tính ra hai chữ số kiểm tra cho nó, và chuỗi đó sẽ đạt phép kiểm tra.

Ba câu hỏi sau đây nằm ngoài khả năng của bất kỳ phép tính nào trên chuỗi: tài khoản này có thật hay không, nó thuộc về ai, và nó có nhận được tiền hay không. Cả ba đều cần một cuộc tra cứu với hệ thống ngân hàng, và mỗi lần tra cứu như vậy đều có chi phí, có độ trễ và có khả năng thất bại. Đây là lý do phải tách hẳn hai loại kiểm tra này trong thiết kế, chứ không chỉ tách trong câu chữ.

Nếu bạn muốn xem một chuỗi cụ thể được tách thành những đoạn nào và mỗi tầng kiểm tra trả về kết quả gì, công cụ kiểm tra số của trang này hiển thị mã quốc gia, hai chữ số kiểm tra ISO, phần BBAN và chữ số kiểm tra quốc gia như những trường riêng biệt.

Phần dành cho nhà phát triển: độ dài khác nhau và chia luồng theo quốc gia

Vì độ dài và cấu trúc phần BBAN do từng quốc gia quy định, bộ quy tắc của chuỗi này phải được lưu như dữ liệu chứ không phải viết cứng trong mã nguồn. Đây là điểm khác biệt lớn nhất so với những loại số có cấu trúc thống nhất toàn cầu.

  • Đừng áp một độ dài duy nhất cho mọi đầu vào. Hãy tra độ dài hợp lệ theo mã quốc gia đã đọc được ở hai ký tự đầu, rồi mới kiểm tra tiếp.
  • Đừng viết một biểu thức so khớp khổng lồ bao trùm mọi quốc gia. Mỗi lần một nước đổi quy tắc, bạn sẽ phải sửa một chuỗi ký tự mà không ai dám chắc mình không làm hỏng nước khác.
  • Trả về kết quả của từng tầng riêng biệt, kể cả khi tầng quốc tế đã không đạt. Người dùng cần biết lỗi nằm ở hai ký tự đầu hay ở phần thân.
  • Chỉ so khớp chữ cái sau khi đã thống nhất dạng chữ, vì dữ liệu nhập từ nhiều nguồn thường không đồng nhất về chữ hoa chữ thường.
  • Ghi lại quốc gia và quy tắc nào đã được dùng cho mỗi kết luận. Khi có tranh chấp về một chuỗi, đây là thứ duy nhất giúp tái hiện lại phán đoán cũ.

Cuối cùng, hãy nhớ rằng phép kiểm tra này là một bộ lọc sớm. Nó giúp bạn phát hiện lỗi gõ trước khi gửi yêu cầu đi, nhưng nó không thay thế bất kỳ bước xác nhận nào với ngân hàng.

Việc nên làm sau bài này

Hãy lấy một chuỗi thử, đổi hai ký tự đầu thành mã của một quốc gia khác, rồi xem hệ thống của bạn phản ứng thế nào. Nếu nó vẫn chấp nhận, bộ quy tắc của bạn đang không thật sự chia luồng theo quốc gia. Để hiểu nhánh thuật toán đứng sau phép kiểm tra này, bài thuật toán chữ số kiểm tra: mod-10, mod-11 và mod-97 so sánh ba nhánh với nhau; còn bài những số không có chữ số kiểm tra giải thích trường hợp không có thuật toán nào để chạy. Nếu công việc của bạn gắn với dữ liệu liên hệ quốc tế, bài kiểm thử địa chỉ và số điện thoại quốc tế có thêm ví dụ về cùng kiểu lỗi cấu trúc.

Mọi chuỗi minh họa trong bài chỉ nhằm trình bày ý tưởng của phép lấy dư cho chín mươi bảy; chúng là giá trị được dựng riêng cho việc giải thích, không phải số tài khoản của bất kỳ ai, không thuộc bất kỳ ngân hàng nào, và không dùng được cho bất kỳ giao dịch nào.

Đọc tiếp

Bài viết về Kiểm Tra CCCD