VIZ, MRZ ve Çipteki DG1 Verisinin AI ile Çapraz Doğrulanması
Görsel veri alanı, optik MRZ ve eMRTD çipindeki DG1 bilgisini; OCR güveni, MRZ kontrol basamakları, jMRTD ve Passive Authentication ile açıklanabilir bir sonuçta birleştiriyoruz.
Bir eMRTD veri sayfasındaki aynı kimlik bilgisi üç farklı kanalda karşımıza çıkabilir: insan gözüyle okunan Visual Inspection Zone (VIZ), makinece okunan MRZ ve temassız çipteki DG1. Bu üç kaynağın çapraz doğrulanması, kişiselleştirme hatalarını ve veri tutarsızlıklarını yakalamak için güçlüdür. AI özellikle VIZ OCR belirsizliğini yönetebilir; ancak çip imzası ve Data Group bütünlüğü yalnızca ICAO Passive Authentication ile doğrulanır.
Üç veri kaynağının rolü
- VIZ: Belge üzerindeki isim, doğum tarihi, belge numarası ve benzeri görsel alanlar.
- MRZ: ICAO Doc 9303 biçimindeki sabit karakter setine ve kontrol basamaklarına sahip makinece okunur alan.
- DG1: Çipte MRZ bilgisini taşıyan LDS Data Group.
DG1'in okunmuş olması onun güvenilir olduğunu tek başına göstermez. EF.SOD imzası DS sertifikasıyla, DS zinciri CSCA ile ve DG1 hash'i EF.SOD ile doğrulanmalıdır.
Önerilen doğrulama sırası
- Belgenin görsel görüntüsünü kontrollü koşulda yakalayın.
- VIZ alanlarını bölge bazlı OCR ile okuyun ve karakter güvenlerini saklayın.
- MRZ'yi okuyun, biçim ve check digit kontrollerini çalıştırın.
- PACE/BAC sonrası EF.DG1 ve EF.SOD'u çipten okuyun.
- Passive Authentication sonucunu tamamlayın.
- VIZ, optik MRZ ve doğrulanmış DG1 alanlarını normalize ederek karşılaştırın.
- Sonucu MATCH, REVIEW veya MISMATCH olarak neden kodlarıyla üretin.
jMRTD ile DG1 okuma
import java.io.InputStream;
import org.jmrtd.PassportService;
import org.jmrtd.lds.icao.DG1File;
import org.jmrtd.lds.icao.MRZInfo;
DG1File readDg1(PassportService service) throws Exception {
try (InputStream in = service.getInputStream(PassportService.EF_DG1)) {
return new DG1File(in);
}
}
DG1File dg1 = readDg1(passportService);
MRZInfo chipMrz = dg1.getMRZInfo();
String documentNumber = chipMrz.getDocumentNumber();
String primaryId = chipMrz.getPrimaryIdentifier();
String secondaryId = chipMrz.getSecondaryIdentifier();
String dateOfBirth = chipMrz.getDateOfBirth();
jMRTD sürümüne göre paket veya metot imzaları değişebilir; kullanılan sürümün API dokümantasyonu kontrol edilmelidir.
Normalizasyon katmanı
VIZ ve MRZ aynı bilgiyi farklı yazım kurallarıyla temsil edebilir. Unicode karakterler, aksanlar, boşluklar, tireler ve MRZ dolgu karakterleri normalize edilmeden doğrudan string karşılaştırması yanlış alarm üretir.
import java.text.Normalizer;
import java.util.Locale;
static String normalizeIdentityText(String value) {
if (value == null) return "";
String decomposed = Normalizer.normalize(value, Normalizer.Form.NFD);
return decomposed
.replaceAll("\\p{M}+", "")
.toUpperCase(Locale.ROOT)
.replace('<', ' ')
.replaceAll("[^A-Z0-9 ]", "")
.replaceAll("\\s+", " ")
.trim();
}
Ülkeye özgü transliterasyon politikası genel bir aksan silme fonksiyonundan daha kapsamlı olabilir. Üretim sistemi, düzenleyen makamın tanımlı transliterasyon tablolarını kullanmalıdır.
Alan bazlı karşılaştırma
enum FieldStatus { MATCH, REVIEW, MISMATCH, NOT_AVAILABLE }
record FieldResult(
String field,
FieldStatus status,
double confidence,
String reason
) {}
static FieldResult compareName(
String vizValue, double vizOcrConfidence, String dg1Value) {
String viz = normalizeIdentityText(vizValue);
String chip = normalizeIdentityText(dg1Value);
if (viz.isBlank() || chip.isBlank())
return new FieldResult("name", FieldStatus.NOT_AVAILABLE, 0, "MISSING_VALUE");
if (viz.equals(chip))
return new FieldResult("name", FieldStatus.MATCH, vizOcrConfidence, "EXACT_NORMALIZED");
if (vizOcrConfidence < 0.85)
return new FieldResult("name", FieldStatus.REVIEW, vizOcrConfidence, "LOW_OCR_CONFIDENCE");
return new FieldResult("name", FieldStatus.MISMATCH, vizOcrConfidence, "VALUE_DIFFERENCE");
}
AI veya fuzzy matching, farklı değerleri sessizce eşit kabul etmek için kullanılmamalıdır. Benzerlik modeli REVIEW önceliği üretmeli; kritik alanlardaki kesin uyuşmazlığı gizlememelidir.
MRZ kontrol basamakları
Belge numarası, doğum tarihi ve son geçerlilik tarihi gibi alanların check digit kontrolleri OCR hatasını yakalamada güçlü deterministik sinyallerdir. MRZ kontrolü başarısızsa AI otomatik düzeltme önerileri üretebilir; seçilen karakter değişikliği, güven değeri ve alternatifler denetim kaydına yazılmalıdır.
WEIGHTS = (7, 3, 1)
def mrz_value(ch: str) -> int:
if ch == '<': return 0
if ch.isdigit(): return int(ch)
return ord(ch) - ord('A') + 10
def check_digit(text: str) -> str:
total = sum(mrz_value(c) * WEIGHTS[i % 3]
for i, c in enumerate(text))
return str(total % 10)
def check_field(text: str, expected: str) -> bool:
return check_digit(text) == expected
AI risk skoru ile kural motorunun birleşimi
Kriptografik veya check digit hataları modele bırakılmamalıdır. Önce deterministik kurallar çalışır; AI yalnızca OCR belirsizliği, karakter alternatifi ve inceleme önceliği üretir.
def final_decision(passive_auth, mrz_checks, field_results, ai_risk):
if passive_auth == "FAIL":
return "MISMATCH", ["PASSIVE_AUTH_FAILED"]
if not all(mrz_checks.values()):
return "REVIEW", ["MRZ_CHECK_DIGIT_FAILED"]
if any(x["status"] == "MISMATCH" for x in field_results):
return "MISMATCH", ["CROSS_SOURCE_DIFFERENCE"]
if ai_risk >= 0.60 or any(x["status"] == "REVIEW" for x in field_results):
return "REVIEW", ["AI_OR_OCR_UNCERTAINTY"]
return "MATCH", []
Örnek sonuç modeli
{
"passiveAuthentication": "PASS",
"sources": {"viz": "CAPTURED", "mrz": "CHECKED", "dg1": "SOD_HASH_VERIFIED"},
"fields": [
{"name": "documentNumber", "status": "MATCH"},
{"name": "dateOfBirth", "status": "MATCH"},
{"name": "surname", "status": "REVIEW", "reason": "LOW_OCR_CONFIDENCE"}
],
"decision": "REVIEW"
}
Sonuç
VIZ, MRZ ve DG1 çapraz doğrulaması; görsel kişiselleştirme, optik okuma ve çip verisini tek bir denetlenebilir sonuçta birleştirir. AI, VIZ OCR ve belirsizlik yönetiminde değerlidir. Güvenin temeli ise MRZ kuralları, EF.SOD imzası, DS–CSCA zinciri ve Data Group hash doğrulamasıdır.
Referanslar
Bu makaleyi nasıl değerlendirirsin?
Geri bildirimin sonraki içerikleri geliştirmeme yardımcı olur.