Mã vạch có phân biệt được hàng thật, hàng giả không? Giới hạn thật của check digit

Check digit chỉ xác nhận một dãy số không bị gõ sai khi quét, chứ không hề xác nhận sản phẩm phía sau dãy số đó là thật. Bài viết giải mã công thức tính check digit bằng ví dụ cụ thể, chỉ ra lỗ hổng cấu trúc mà không bài viết nào khác nói tới, và gợi ý những lớp bảo vệ doanh nghiệp sản xuất nên xây thêm.

VNCX Team14 phút đọc
Mã vạch có phân biệt được hàng thật, hàng giả không? Giới hạn thật của check digit

Câu hỏi lặp lại mỗi khi có một vụ hàng giả bị phanh phui

Mỗi lần báo chí đưa tin về một lô sữa giả, mỹ phẩm giả hay thực phẩm chức năng giả bị thu giữ, tôi lại nhận được vài tin nhắn từ khách hàng, đại loại: "Anh ơi sao hàng giả vẫn quét mã vạch ra thông tin bình thường vậy, vậy check mã vạch có ý nghĩa gì không?". Câu hỏi này quen đến mức tôi đoán được gần hết nội dung sẽ được hỏi tiếp theo.

Phần lớn câu trả lời đang xếp hạng cao trên Google cho đúng một kết luận, nhưng dừng lại ở đó: mã vạch không phân biệt được hàng thật với hàng giả, hãy dùng thêm tem chống giả hoặc QR code. Đúng, nhưng nó không trả lời phần kỹ thuật đứng sau câu hỏi: vậy con số check digit ở cuối mã vạch — cái con số vẫn được quảng cáo là "kiểm tra tính hợp lệ" — thực chất đang kiểm tra cái gì, và vì sao nó không ngăn được người làm giả? Đây là phần một người quản lý sản xuất hay chuỗi cung ứng cần hiểu rõ, vì hiểu sai bản chất con số này rất dễ dẫn tới một sự yên tâm nhầm chỗ: nghĩ rằng bao bì "có mã vạch chuẩn quốc tế" là đã bịt được phần lớn rủi ro hàng giả.

Bài viết này đi vào đúng chỗ mà các bài đang đứng đầu tìm kiếm cho cụm từ này bỏ trống: cách tính check digit thật sự, với một ví dụ số cụ thể để tự tay bấm lại được; lý do về mặt cấu trúc khiến một mã vạch dù tính đúng tuyệt đối vẫn không đủ để bảo vệ thương hiệu; và những lớp mà một doanh nghiệp sản xuất nên xây thêm thay vì đặt cược vào một con số vốn chưa từng được thiết kế cho mục đích chống giả.

Check digit thực chất đang kiểm tra cái gì

Công thức tính, và một ví dụ bạn có thể tự bấm máy tính theo

Mã vạch GTIN-13 (loại phổ biến nhất trên bao bì, còn gọi là EAN-13) gồm 13 chữ số, trong đó 12 chữ số đầu mang thông tin (mã quốc gia đăng ký của doanh nghiệp, mã doanh nghiệp GS1, mã sản phẩm), còn chữ số thứ 13 là check digit, được tính ra từ 12 số kia chứ không phải số tự do.

Cách tính theo chuẩn GS1: đếm từ phải sang trái trong dãy 12 số, nhân lần lượt các vị trí lẻ (1, 3, 5, 7, 9, 11 tính từ phải) với 3, các vị trí chẵn với 1, cộng tất cả lại, rồi lấy số tròn chục gần nhất lớn hơn hoặc bằng tổng đó trừ đi tổng, ra check digit.

Thử với một dãy 12 số ví dụ: 893411012345 (893 là mã quốc gia đăng ký cấp cho GS1 Việt Nam). Từ phải sang trái ta có các số 5, 4, 3, 2, 1, 0, 1, 1, 4, 3, 9, 8. Nhân vị trí lẻ với 3: 5×3=15, 3×3=9, 1×3=3, 1×3=3, 4×3=12, 9×3=27. Nhân vị trí chẵn với 1: 4×1=4, 2×1=2, 0×1=0, 1×1=1, 3×1=3, 8×1=8. Cộng toàn bộ: 15+4+9+2+3+0+3+1+12+3+27+8 = 87. Số tròn chục gần nhất không nhỏ hơn 87 là 90, vậy check digit = 90−87 = 3. Mã vạch hoàn chỉnh sẽ là 8934110123453 — và nếu bạn có sẵn một mã vạch bất kỳ trên kệ hàng ở nhà, hãy thử tính lại đúng công thức này, số ra sẽ luôn khớp với chữ số cuối in trên bao bì. Đây chính xác là công thức mà tôi từng thấy hai, ba bài viết khác trên trang nhất Google nhắc tới nhưng viết sai hoặc viết tắt tới mức không ai tính lại được — trong khi đây lại là phần dễ kiểm chứng nhất và trực tiếp trả lời cho từ khóa "cách tính check digit".

Check digit trả lời "con số có đúng không", không trả lời "hàng có thật không"

Mục đích ban đầu của check digit không liên quan gì tới chống hàng giả. Nó được GS1 thiết kế để máy quét, hoặc người gõ tay khi máy quét lỗi, phát hiện ra một lỗi đọc: quét nhầm 8 thành 3, hoặc đảo vị trí hai số cạnh nhau. Nếu 12 số đầu đúng nhưng chữ số thứ 13 sai một đơn vị, phép tính trên sẽ không khớp, hệ thống báo lỗi và yêu cầu quét lại. Vậy thôi. Nó là một cơ chế toàn vẹn dữ liệu (data integrity), giống như checksum trong một file nén, chứ không phải một cơ chế xác thực danh tính (authentication).

Sự khác biệt này quan trọng vì công thức tính check digit là công khai hoàn toàn, được in trong tài liệu GS1 General Specifications mà ai cũng tải được miễn phí. Bất kỳ phần mềm thiết kế bao bì hay máy in tem nào cũng có sẵn hàm tính check digit. Nghĩa là một người làm giả, dù không sao chép nguyên xi mã vạch của hàng thật, mà tự bịa ra 12 số bất kỳ, vẫn tính ra được chữ số thứ 13 hợp lệ trong vài giây. Máy quét ở cửa hàng, ở kho, hay trên app điện thoại khi kiểm tra checksum sẽ báo "mã hợp lệ" — vì đúng là nó hợp lệ về mặt số học. Nhưng "hợp lệ về số học" không có nghĩa là "được GS1 cấp thật" và càng không có nghĩa là "sản phẩm phía sau mã này là hàng chính hãng".

Vì sao một mã vạch tính đúng tuyệt đối vẫn không ngăn được hàng giả

Mã vạch gắn với sản phẩm, không gắn với từng đơn vị hàng

Đây là điểm cấu trúc mà hầu như không bài viết nào tôi đọc được khi tra cứu chủ đề này giải thích rõ, dù nó mới là gốc rễ của vấn đề. Một mã GTIN được cấp cho một loại sản phẩm (một SKU) — ví dụ một chai nước mắm 500ml loại A của công ty B — chứ không phải cho từng chai. Toàn bộ hàng triệu chai cùng loại, sản xuất trong nhiều năm, ở nhiều lô khác nhau, đều mang đúng một dãy 13 số đó. Về bản chất, GTIN là quan hệ một-đến-nhiều: một mã số, vô số đơn vị vật lý.

Hệ quả trực tiếp: một mã vạch, cho dù tính đúng tuyệt đối theo công thức, không thể trả lời câu hỏi "chai tôi đang cầm trên tay có phải một trong số những chai được công ty B thật sự sản xuất và đóng gói hay không". Nó chỉ trả lời được "đây là mã của dòng sản phẩm nước mắm 500ml loại A". Người làm giả không cần đánh cắp bí mật gì để có được thông tin này — họ chỉ cần mua một chai thật ngoài chợ, chụp lại đúng dãy 13 số trên vỏ, in lại y hệt lên bao bì giả. Máy quét đọc ra đúng tên sản phẩm, đúng nhà sản xuất, vì dữ liệu tra cứu gắn với chính dãy số đó chứ không gắn với chai vật lý nào cả.

Công thức check digit là công khai, kể cả người làm giả cũng tính được

Ở chiều ngược lại, ngay cả khi người làm giả không sao chép mã thật mà muốn tạo ra một mã "nhìn có vẻ thuộc về một công ty được cấp phép" (ví dụ bắt đầu bằng 893 để trông giống hàng đăng ký tại Việt Nam), họ vẫn tính được check digit hợp lệ bằng đúng công thức ở trên. Không có bước nào trong quy trình quét mã vạch tiêu chuẩn đối chiếu ngược con số đó với một cơ sở dữ liệu tập trung để xác nhận "mã doanh nghiệp này có thật sự thuộc về công ty B, và công ty B có thật sự đăng ký sản phẩm này hay không". Phần lớn ứng dụng "quét mã vạch kiểm tra hàng giả" trên điện thoại chỉ làm hai việc: kiểm tra checksum, và tra cứu một cơ sở dữ liệu sản phẩm mở do chính người dùng hoặc nhà bán đóng góp — cả hai đều không xác thực được nguồn gốc vật lý của món hàng đang cầm trên tay.

Đăng ký mã GS1 không có nghĩa là mỗi sản phẩm được xác thực

Nhiều chủ doanh nghiệp tôi từng làm việc cùng nhầm lẫn giữa hai việc: đăng ký mã doanh nghiệp GS1 (GCP) với GS1 Việt Nam, và việc mỗi sản phẩm bán ra được xác thực là thật. Khi một công ty đăng ký thành viên GS1, họ được cấp một mã doanh nghiệp, từ đó tự cấp mã GTIN cho từng dòng sản phẩm của mình mà không cần GS1 duyệt riêng từng mã. Việc đăng ký này xác nhận công ty tồn tại và được quyền dùng dải số đó — nó không đi kèm cơ chế kiểm tra ai đang in con số đó lên bao bì nào.

GS1 có cung cấp công cụ tra cứu công khai — GEPIR và gần đây là Verified by GS1 — cho phép kiểm tra xem một mã doanh nghiệp có thật sự được đăng ký hay không, dữ liệu cơ bản của mã GTIN có khớp với thông tin nhà sản xuất công bố hay không. Đây là một lớp kiểm tra hữu ích hơn hẳn chỉ nhìn checksum, và tôi khuyên bất kỳ ai làm việc trong chuỗi cung ứng nên biết tới công cụ này. Nhưng ngay cả lớp này cũng chỉ xác nhận "mã số này từng được một công ty thật đăng ký cho một sản phẩm thật", chứ không xác nhận được đơn vị hàng hóa cụ thể trước mặt bạn có đúng là một trong những đơn vị công ty đó sản xuất hay không — vì như đã nói, một mã dùng chung cho toàn bộ dòng sản phẩm.

Một lần khách hàng của tôi phát hiện hai lô "hàng thật" trùng mã

Có một trường hợp tôi nhớ khá rõ vì nó không phải hàng giả theo nghĩa thông thường. Một doanh nghiệp sản xuất thực phẩm khô ở miền Trung đặt in bao bì qua một xưởng in trung gian, xưởng này tái sử dụng file thiết kế cũ của một khách hàng khác cho nhanh, chỉ đổi tên và hình ảnh mà quên đổi dãy mã vạch. Kết quả là hai công ty không liên quan gì tới nhau, bán hai sản phẩm khác nhau, cùng in một mã GTIN. Cả hai mã đều tính đúng check digit — vì thực chất chỉ là một mã bị dùng lặp — nên không hệ thống quét nào ở siêu thị báo lỗi. Chuyện chỉ vỡ lở khi một nhân viên siêu thị quét mã nhập kho, thấy tên sản phẩm và hình ảnh hiện ra không khớp với gói hàng trên tay, và liên hệ ngược lại nhà cung cấp để hỏi.

Trường hợp này không ai cố tình làm giả, nhưng nó cho thấy rất rõ: một mã vạch hợp lệ về mặt toán học không hề đảm bảo tính duy nhất trên thực tế, và khi lỗi trùng mã xảy ra — dù vô tình hay cố ý — hệ thống mã vạch tiêu chuẩn không có cơ chế tự phát hiện. Phải có con người phát hiện ra sự bất thường trong dữ liệu đi kèm.

Vậy nên xây lớp bảo vệ nào, thay vì trông chờ vào check digit

Lớp nền: mã vạch GS1 chuẩn, dùng đúng mục đích của nó

Mã vạch GTIN vẫn cần thiết và không nên bỏ — nó là ngôn ngữ chung để siêu thị, hệ thống kho vận, sàn thương mại điện tử nhận diện đúng loại sản phẩm, tính tiền đúng, quản lý tồn kho đúng. Vấn đề không phải là bỏ mã vạch, mà là ngừng kỳ vọng nó làm việc mà nó chưa từng được thiết kế để làm.

Lớp thứ hai: định danh theo từng đơn vị sản phẩm, không chỉ theo dòng sản phẩm

Muốn phân biệt được đơn vị hàng hóa cụ thể trên tay người tiêu dùng, doanh nghiệp cần một lớp mã bổ sung, gắn cho từng chai, từng hộp, từng lô riêng biệt — không phải một mã dùng chung cho cả dòng sản phẩm. GS1 cũng có chuẩn cho việc này, gọi là số sê-ri (serial number), kết hợp với GTIN tạo thành mã định danh duy nhất cho từng đơn vị, thường được trình bày qua GS1 Digital Link dưới dạng QR code thay vì mã vạch tuyến tính truyền thống.

Lớp thứ ba: xác thực qua máy chủ tại thời điểm quét, không tra cứu offline

Điểm khác biệt cốt lõi giữa một QR chống giả thật sự với một mã vạch: QR đó phải gọi về một máy chủ trung tâm mỗi lần quét, ghi nhận thời gian, vị trí, số lần đã quét, và có thể cảnh báo ngay khi cùng một mã bị quét từ hai nơi cách xa nhau trong thời gian ngắn — dấu hiệu kinh điển của việc mã bị sao chép và dán lên nhiều sản phẩm giả. Một mã vạch tĩnh, dù kèm checksum hoàn hảo, không bao giờ làm được việc này vì bản thân nó không kết nối với hệ thống nào theo thời gian thực.

Lớp thứ tư: neo dữ liệu để không ai chỉnh sửa được lịch sử sau khi phát hành

Lớp cuối, thường bị bỏ qua vì nghe có vẻ phức tạp hơn mức cần thiết với nhiều doanh nghiệp vừa và nhỏ, nhưng đáng cân nhắc với ngành hàng rủi ro cao: neo (anchor) các sự kiện xác thực quan trọng — lô hàng xuất xưởng, lần quét đầu tiên, cảnh báo nghi ngờ giả — vào một cấu trúc dữ liệu không thể sửa ngược, kiểu blockchain. Mục đích không phải để "nghe sang", mà để đảm bảo nếu có tranh chấp pháp lý hoặc thu hồi sản phẩm, dữ liệu truy xuất trình ra được không bị chỉnh sửa sau khi sự việc xảy ra — kể cả bởi chính nhân viên nội bộ.

Checklist trước khi doanh nghiệp in lô bao bì tiếp theo

Trước khi duyệt file in bao bì tiếp theo, hãy tự hỏi ba việc. Một, mã vạch trên bao bì có đang được kỳ vọng làm nhiệm vụ chống giả không — nếu có, cần điều chỉnh kỳ vọng ngay, vì đó không phải việc nó sinh ra để làm. Hai, sản phẩm có lớp định danh riêng cho từng đơn vị hoặc từng lô chưa, hay toàn bộ hàng triệu đơn vị đang dùng chung một mã duy nhất suốt vòng đời sản phẩm. Ba, khi khách hàng quét mã trên tay, họ có đang gọi về một hệ thống xác thực thời gian thực nào đó không, hay chỉ đang đọc lại đúng thông tin tĩnh đã in sẵn từ mười năm trước.

Trả lời trung thực ba câu hỏi này thường cho thấy rõ khoảng trống lớn nhất không nằm ở việc mã vạch có đúng chuẩn quốc tế hay không — hầu hết doanh nghiệp làm đúng phần này — mà nằm ở chỗ toàn bộ hệ thống chưa có một lớp nào biết phân biệt giữa chiếc hộp thứ một và chiếc hộp thứ một triệu mang cùng một cái tên sản phẩm.

#mã vạch#chống hàng giả#GS1#truy xuất nguồn gốc#QR code

Tác giả

VNCX Team

Chia sẻ bài viết

ZaloFacebook

Bắt đầu với VNCX

Cần tem QR chống hàng giả cho sản phẩm?

Mỗi sản phẩm một mã QR riêng kèm mã ẩn dùng một lần để khách xác minh hàng thật

Xem tất cả
Mã vạch có phân biệt hàng thật, hàng giả không? Giới hạn của check digit