Một cuốn hộ chiếu có vùng đọc máy vượt qua mọi chữ số kiểm tra trông có vẻ đáng tin. Phép tính khớp, trình xác thực trả về true năm lần, và luồng onboarding đi tiếp. Nhưng cần hiểu chính xác cái true đó nghĩa là gì, vì nó hứa hẹn ít hơn nhiều so với vẻ ngoài.

Bài nhập môn này dành cho các lập trình viên xây dựng luồng KYC và onboarding. Bài chia các bước kiểm tra sàng lọc thường gặp thành ba nhóm: những gì chữ số kiểm tra MRZ phát hiện được, những gì nó không phát hiện được, và bước kiểm tra nào khác lấp từng lỗ hổng. Mọi vùng MRZ dưới đây đều là mẫu của chính ICAO, Anna Maria Eriksson của "Utopia", hoặc một biến thể được tạo riêng cho bài này. Không có giấy tờ thật nào xuất hiện.

Đây là blog của doc.cheap, một API OCR hộ chiếu và giấy tờ tùy thân. Không phần nào dưới đây cần đến nó.

Chữ số kiểm tra dùng để làm gì

MRZ là khối chữ in hoa, chữ số và ký tự đệm < ở cuối trang ảnh của hộ chiếu hoặc ở mặt sau thẻ căn cước. ICAO Doc 9303 gắn cho nó các chữ số kiểm tra: mỗi cái một chữ số cho số giấy tờ, ngày sinh và ngày hết hạn, một cho số cá nhân tùy chọn trên hộ chiếu, và một chữ số kiểm tra tổng hợp phủ phần lớn dòng dưới.

Mỗi chữ số kiểm tra là một tổng có trọng số. Mỗi ký tự được đổi thành một số (0–9 giữ nguyên, A = 10 đến Z = 35, < = 0), các số được nhân với trọng số lặp lại 7, 3, 1, và tổng chia lấy dư cho 10 chính là chữ số kiểm tra. Bài chữ số kiểm tra MRZ hoạt động thế nào đi qua từng bước, kèm một trình xác thực bạn có thể dán vào dùng ngay.

Chữ số kiểm tra được thiết kế để bắt lỗi đọc. Chúng chưa bao giờ nhằm phát hiện gian lận, và mọi điều dưới đây đều bắt nguồn từ đó.

Chữ số kiểm tra bắt được gì

Một chữ số sai. Vì 7, 3 và 1 không có ước chung nào với 10, đổi bất kỳ một chữ số nào của trường thành chữ số khác luôn làm thay đổi tổng chia lấy dư cho 10. 3 bị đọc thành 8, 5 bị đọc thành 6: chữ số kiểm tra của trường không còn khớp, và chữ số kiểm tra tổng hợp cũng vậy.

Phần lớn các lần đảo chỗ hai ký tự liền kề. Khi hai ký tự liền kề đổi chỗ cho nhau, tổng thay đổi một lượng bằng hiệu giá trị của chúng nhân với hiệu trọng số (4, 2 hoặc 6). Lượng đó là bội của 10 chỉ khi hai giá trị chênh nhau một bội của 5. Vì thế 98 gõ thành 89 thì bị phát hiện, còn 16 gõ thành 61 lại lọt qua, 05 gõ thành 50 cũng vậy.

Hư hỏng, lóa sáng và gõ lại. Đây là chỗ chữ số kiểm tra phát huy giá trị. Một nếp gấp đè lên một ký tự, ánh phản chiếu trên lớp ép plastic, một người gõ lại vùng MRZ bằng tay: đó là nguyên nhân của phần lớn dữ liệu MRZ sai, và một chữ số kiểm tra không khớp là tín hiệu rẻ cho biết một trường đã bị đọc sai. Cách xử lý đúng là chụp lại, không phải từ chối.

Chỗ phép tính không nhìn thấy

Ngay cả với lỗi vô tình, chữ số kiểm tra vẫn có lỗ hổng, và một luồng sàng lọc nên biết chúng.

Một chữ cái bị đọc thành ký tự có giá trị chênh 10, 20 hoặc 30. Lấy số giấy tờ mẫu L898902C3, có chữ số kiểm tra là 6. Thay C (giá trị 12) bằng 2 (giá trị 2): tổng giảm 10 × 3 = 30, từ 316 xuống 286, và chữ số kiểm tra vẫn là 6. Chữ số kiểm tra tổng hợp, phủ cùng các ký tự với cùng trọng số, cũng vẫn đạt. Những cặp như B và 1, hay C và 2, có thể thay cho nhau mà không để lại dấu hiệu nào.

Các trường không có chữ số kiểm tra nào bảo vệ. Họ tên, quốc gia cấp, quốc tịch và giới tính nằm ngoài mọi chữ số kiểm tra của trường, và chữ số kiểm tra tổng hợp cũng bỏ qua quốc tịch và giới tính. Họ tên bị đọc sai sẽ không có tín hiệu nào; chỉ khi so với trang in mới thấy.

Những gì hoàn toàn không bắt được

Mọi trường hợp trong phần này, theo đúng cách chúng được tạo ra, đều vượt qua chữ số kiểm tra MRZ.

Giấy tờ giả có vùng MRZ nhất quán bên trong. Thuật toán là công khai và chỉ cần hai mươi dòng mã. Ai làm giấy tờ giả cũng tính chữ số kiểm tra cho đúng, vì một chữ số kiểm tra sai là lỗi duy nhất mà mọi đầu đọc đều phát hiện miễn phí. Một vùng MRZ đạt chỉ cho biết vùng đó được đọc đúng. Nó không nói gì về việc giấy tờ có thật hay không.

Dữ liệu sao chép từ một người thật. Vùng MRZ dựng từ họ tên thật, ngày sinh thật và số giấy tờ thật của người khác có chữ số kiểm tra hợp lệ, vì dữ liệu là thật. Người đang đứng trước camera có phải là người đó hay không là một câu hỏi khác: so khớp khuôn mặt với ảnh trên giấy tờ, kiểm tra liveness, hoặc tra danh sách giấy tờ mất và bị đánh cắp của cơ quan cấp nếu bạn có quyền truy cập.

Giấy tờ đã hết hạn. Ngày hết hạn 120415 vượt qua chữ số kiểm tra của nó, và đó là ngày 15 tháng 4 năm 2012. Hết hạn là một quy tắc về ngày tháng, không phải tổng kiểm tra: hãy so ngày đó với hôm nay. Nhớ rằng YYMMDD không có thế kỷ, nên cần xác định nó theo ngữ cảnh; bài định dạng ngày YYMMDD giải thích cách làm. Công cụ tính chữ số kiểm tra MRZ trên trang này đánh dấu ngày hết hạn đã qua là hết hạn ngay cạnh các chữ số kiểm tra, để bạn thấy cả hai câu trả lời song song.

Ảnh bị thay. MRZ không chứa ảnh, cũng không chứa mã băm của ảnh. Thay ảnh trên trang thông tin không làm vùng MRZ thay đổi gì.

Chip bị nhân bản hoặc sửa đổi. Trên hộ chiếu có chip, các nhóm dữ liệu được quốc gia cấp ký số, và việc xác minh chữ ký đó (Passive Authentication, ICAO Doc 9303 Part 11) là cách để biết dữ liệu đến từ cơ quan cấp. Việc này cần đọc qua NFC và chứng thư của cơ quan cấp. Ảnh chụp trang giấy tờ, dù tốt đến đâu, cũng không trả lời được câu hỏi này. MRZ chỉ cung cấp khóa truy cập dùng để mở chip.

Bước kiểm tra hay bị bỏ qua: đối chiếu vùng MRZ với trang in

Một giấy tờ ghi hầu hết thông tin hai lần: một lần trong MRZ và một lần trong vùng kiểm tra bằng mắt (VIZ), tức trang in mà con người đọc. Hai phần do cùng một cơ quan cấp tạo ra cùng lúc, nên trên một giấy tờ thật, còn nguyên vẹn, chúng khớp nhau.

Điều đó khiến một chỗ không khớp đáng chú ý hơn một chữ số kiểm tra sai. Chữ số kiểm tra sai thường chỉ có nghĩa là ảnh chụp kém. Chữ số kiểm tra đều đạt nhưng họ, ngày sinh hoặc số giấy tờ in trên trang lại ghi khác, nghĩa là một bên đã bị đọc sai hoặc bị sửa sau khi in. Dù là trường hợp nào, đó cũng là giấy tờ cần một người xem.

Việc đối chiếu phải được làm có chủ đích. Đọc cả hai vùng, chuẩn hóa các giá trị in (ngày tháng về cùng một dạng, họ tên rút về chữ in hoa trơn), rồi so từng trường một. Hãy tính đến chuyển tự: Müller in trên trang có thể là MUELLER hoặc MULLER trong vùng MRZ, tùy cơ quan cấp. Trang định dạng MRZ cho biết mỗi bố cục có những trường nào, và do đó những trường nào có thể đối chiếu.

Một thứ tự sàng lọc đứng vững

  1. Hình dạng. Số dòng và độ dài quyết định TD1, TD2 hay TD3. Sai hình dạng là đọc hỏng.
  2. Chữ số kiểm tra. Không đạt nghĩa là chụp lại, không phải từ chối.
  3. Vùng MRZ so với trang in. Không khớp trong khi chữ số kiểm tra đạt thì chuyển cho người xem.
  4. Ngày tháng. Ngày hết hạn so với hôm nay; ngày sinh so với quy tắc độ tuổi của bạn.
  5. Danh tính. So khớp khuôn mặt và liveness, đối chiếu với ảnh trên giấy tờ.
  6. Tính xác thực. Xác minh chip qua NFC, hoặc kiểm tra các đặc điểm bảo an vật lý bằng một dịch vụ chuyên làm việc đó.

Bước 1 đến 4 rẻ và chạy được trên mọi ảnh. Bước 5 và 6 là những sản phẩm riêng, và phép tính MRZ dù nhiều đến đâu cũng không thay thế được.

doc.cheap nằm ở đâu

API OCR hộ chiếu doc.cheap đảm nhận bước 1 đến 4 và báo cáo trung thực về phần còn lại. Phản hồi của nó có mrz.status: passed, failed hoặc absent. Khi là failed, mrz.reason cho biết điều gì không khớp, hoặc là một chữ số kiểm tra (Check digit failed for: document number), hoặc là chỗ lệch với trang in (MRZ does not match the visual zone for: surname), vì theo mặc định cả hai vùng đều được đọc và đối chiếu. Bản thân vùng MRZ được trả về nguyên văn trong mrz.lines và mrz.text, nên bạn có thể tự tính lại chữ số kiểm tra trong mã của mình. document.expiry_date, document.is_expired và document.days_remaining trả lời bước 4.

Đây là dịch vụ nhận dạng, không phải dịch vụ xác minh. Khối authenticity của nó trả về not_checked thay vì ngụ ý là đã đạt, còn kiểm tra ảnh và chip thuộc về các công cụ chuyên dụng. Để thử một vùng MRZ mà không cần viết mã, hãy dán nó vào công cụ tính chữ số kiểm tra MRZ; công cụ chạy trong trình duyệt và hiện từng chữ số đã tính cạnh chữ số được in. Nếu bạn đang chọn một dịch vụ được lưu trữ sẵn, bảng so sánh API OCR hộ chiếu đặt các mức giá công bố cạnh nhau.

Một câu hỏi cho bạn: trong những lỗ hổng này, luồng onboarding của bạn đã thực sự gặp phải cái nào? Hãy cho chúng tôi biết trong phần bình luận bên dưới.