Kiểm tra dãy số thẻ bằng thuật toán Luhn: kiểm được gì và không kiểm được gì
Công cụ kiểm tra xem một dãy số có đúng cấu trúc số thẻ hay không, dựa trên ba điều kiện là tiền tố tổ chức phát hành, độ dài hợp lệ và phép thử Luhn. Đây là phép kiểm tra định dạng chạy hoàn toàn trên máy bạn, không kết nối tới ngân hàng nào và không cho biết thẻ có thật hay còn hiệu lực.
Tính năng nổi bật
- Chạy phép thử Luhn để phát hiện dãy số sai cấu trúc do gõ nhầm
- Nhận diện bảy nhóm thẻ quốc tế theo tiền tố gồm Visa, Mastercard, American Express, Discover, JCB, Diners Club và UnionPay
- Kiểm tra độ dài có đúng với nhóm thẻ vừa nhận diện hay không và báo rõ khi lệch
- Tự chia dãy số thành từng cụm bốn chữ số khi bạn gõ để dễ đối chiếu bằng mắt
- Bắt đầu kiểm tra khi bạn nhập đủ mười ba chữ số trở lên
- Báo lỗi cụ thể theo từng trường hợp thay vì chỉ nói không hợp lệ
- Có sẵn sáu dãy số kiểm thử công khai để bạn thử ngay mà không phải nhập số thật
- Toàn bộ phép tính chạy trong trình duyệt, không có bước gửi dữ liệu đi đâu
Một phép kiểm tra định dạng, không phải một phép xác thực thẻ
Hãy rõ ràng ngay từ đầu về giới hạn của công cụ này, vì hiểu nhầm ở đây có thể gây hại thật. Nó chỉ trả lời được một câu hỏi duy nhất: dãy số bạn nhập có thỏa mãn quy tắc cấu tạo của số thẻ hay không. Nó không biết thẻ đó có tồn tại không, do ngân hàng nào phát hành, còn hạn hay đã khóa, có tiền hay không, và thuộc về ai. Những thông tin đó chỉ ngân hàng phát hành mới có, và muốn biết thì phải gửi một yêu cầu cấp phép qua hệ thống của tổ chức thẻ, việc mà không một trang web tra cứu nào làm được. Giá trị thực tế của phép kiểm tra này nằm ở chỗ khác: nó bắt lỗi gõ nhầm ngay tại biểu mẫu trước khi dữ liệu được gửi tới cổng thanh toán, giúp người dùng nhận thông báo tức thì thay vì chờ vài giây rồi nhận một lỗi khó hiểu từ ngân hàng. Đó là lý do gần như mọi trang thanh toán đều cài phép thử này ở phía trình duyệt.
Lợi ích khi sử dụng
- Bắt được lỗi gõ nhầm một chữ số, dạng lỗi chiếm phần lớn các lần nhập sai
- Biết ngay dãy số thuộc nhóm thẻ nào để đối chiếu với thông tin trên biểu mẫu
- Thông báo lỗi nói rõ nguyên nhân nên tiết kiệm thời gian dò tìm
- Có sẵn số kiểm thử công khai để lập trình viên thử luồng nhập liệu mà không cần số thật
- Không gửi dữ liệu ra ngoài nên phù hợp để kiểm tra logic khi đang phát triển biểu mẫu
Cách dùng công cụ đúng mục đích
- 1Bấm một trong sáu nút số kiểm thử ở khung dưới nếu bạn chỉ muốn xem công cụ hoạt động thế nào.
- 2Khi cần kiểm tra một dãy số cụ thể, hãy dùng số kiểm thử do nhà cung cấp cổng thanh toán cấp, không dùng số thẻ thật đang lưu hành.
- 3Gõ hoặc dán dãy số vào ô nhập, dấu cách được chèn tự động sau mỗi bốn chữ số nên bạn không phải tự căn.
- 4Đọc kết quả ngay bên dưới: nếu hợp lệ, công cụ ghi rõ nhóm thẻ, số chữ số và trạng thái của phép thử Luhn.
- 5Nếu không hợp lệ, đọc dòng lý do để biết sai ở tiền tố, sai ở độ dài hay sai ở phép thử tổng kiểm.
Thuật toán Luhn hoạt động ra sao
Luhn là một phép tính tổng kiểm rất đơn giản, được mô tả từ những năm 1950 và nay là chuẩn chung cho số thẻ thanh toán. Cách làm: đọc dãy số từ phải sang trái, giữ nguyên chữ số ở vị trí lẻ, nhân đôi chữ số ở vị trí chẵn; nếu kết quả nhân đôi lớn hơn 9 thì trừ đi 9. Cộng tất cả các số thu được, và nếu tổng chia hết cho 10 thì dãy số vượt qua phép thử. Thử với dãy kiểm thử quen thuộc 4111 1111 1111 1111: có tám chữ số bị nhân đôi, trong đó chữ số 4 ở đầu thành 8 và bảy chữ số 1 thành 2, tổng phần này là 8 cộng 14 bằng 22; tám chữ số còn lại đều là 1 nên cộng thêm 8; tổng chung là 30, chia hết cho 10 nên dãy hợp lệ. Điều đáng nói là phép thử này rất rẻ về mặt tính toán nhưng bắt được rất nhiều lỗi thực tế, đó là lý do nó tồn tại suốt bảy thập kỷ mà chưa bị thay thế.
Luhn bắt được lỗi nào và bỏ sót lỗi nào
Phép thử này bắt được toàn bộ lỗi sai một chữ số, tức là mọi trường hợp bạn gõ nhầm một con số thành con số khác đều bị phát hiện. Nó cũng bắt được gần hết các lỗi hoán vị hai chữ số liền kề, kiểu gõ 34 thành 43, với đúng một ngoại lệ là cặp 0 và 9: đổi 09 thành 90 hoặc ngược lại thì tổng không đổi nên phép thử vẫn báo hợp lệ. Đây là hạn chế đã biết và được chấp nhận vì xác suất xảy ra thấp. Ngược lại, Luhn hoàn toàn không phát hiện được các lỗi lớn hơn: gõ nhầm hai chữ số không liền nhau, đảo thứ tự cả một cụm, hoặc bịa ra một dãy số vốn được dựng sao cho thỏa mãn phép thử. Đó chính là lý do nói rằng vượt qua Luhn không có nghĩa là số thẻ có thật. Một dãy số bất kỳ đều có thể được sửa chữ số cuối để thỏa mãn phép thử, mà điều đó không tạo ra thẻ nào cả.
Sáu tới tám chữ số đầu cho biết ai phát hành thẻ
Phần đầu của số thẻ là mã định danh tổ chức phát hành, dài sáu hoặc tám chữ số tùy chuẩn áp dụng, và nó xác định ngân hàng cùng loại sản phẩm thẻ. Chữ số đầu tiên cho biết ngành: số 4 và số 5 thuộc về ngành tài chính ngân hàng, số 3 thuộc nhóm du lịch và giải trí, số 6 thuộc nhóm bán lẻ và ngân hàng. Trong công cụ, quy tắc nhận diện đơn giản hóa như sau: bắt đầu bằng 4 là Visa với độ dài 13, 16 hoặc 19; bắt đầu bằng 51 tới 55 hoặc 22 tới 27 là Mastercard với 16 chữ số; bắt đầu bằng 34 hoặc 37 là American Express với đúng 15 chữ số và cách nhóm 4-6-5 thay vì bốn cụm bốn; bắt đầu bằng 62 là UnionPay với 16 tới 19 chữ số; bắt đầu bằng 35 là JCB. Cần lưu ý một điểm quan trọng với người dùng ở Việt Nam: thẻ chip nội địa theo chuẩn của tổ chức chuyển mạch trong nước bắt đầu bằng 9704 và không nằm trong bảy nhóm mà công cụ nhận diện, nên nhập vào sẽ nhận thông báo không nhận diện được loại thẻ dù dãy số hoàn toàn hợp lệ.
Vì sao không nên nhập số thẻ đang dùng vào bất kỳ trang web nào
Ngay cả khi một trang khẳng định xử lý hoàn toàn tại chỗ, thói quen an toàn vẫn là không gõ số thẻ thật ở nơi không phải màn hình thanh toán của một đơn vị bạn tin cậy. Lý do rất thực tế: bạn không có cách nào kiểm chứng lời khẳng định đó, một tiện ích mở rộng độc hại trong trình duyệt vẫn đọc được nội dung bạn gõ, và số thẻ có thể còn nằm trong bộ nhớ tự động điền hoặc trong lịch sử biểu mẫu. Quan trọng hơn, phép kiểm tra ở đây không mang lại thông tin gì hữu ích cho chủ thẻ: nó không cho biết thẻ còn hạn mức, không cho biết thẻ có bị khóa hay không, nên chẳng có lý do chính đáng nào để nhập số thật. Nếu bạn lỡ nhập số thẻ vào một trang lạ, hãy theo dõi sao kê trong vài tuần kế tiếp, bật thông báo giao dịch, và cân nhắc yêu cầu ngân hàng phát hành lại thẻ nếu thấy dấu hiệu bất thường. Với thẻ ảo dùng một lần, việc hủy và tạo thẻ mới thường chỉ mất vài phút trong ứng dụng ngân hàng.
Kiểm tra định dạng nằm ở đâu trong một luồng thanh toán thật
Một giao dịch thẻ đi qua nhiều lớp kiểm tra và Luhn chỉ là lớp mỏng nhất, đứng đầu tiên. Lớp thứ nhất chạy ngay trong trình duyệt ngay khi người dùng gõ, gồm kiểm tra ký tự, độ dài, tiền tố và tổng kiểm, mục đích duy nhất là báo lỗi sớm cho người nhập. Lớp thứ hai là cổng thanh toán kiểm tra thêm ngày hết hạn và mã bảo mật in trên thẻ. Lớp thứ ba là yêu cầu cấp phép gửi qua mạng của tổ chức thẻ tới ngân hàng phát hành, nơi duy nhất biết thẻ có tồn tại, còn hiệu lực và đủ hạn mức hay không. Với giao dịch trực tuyến còn có thêm bước xác thực chủ thẻ qua mã một lần hoặc qua ứng dụng ngân hàng. Hiểu chuỗi này giúp lập trình viên đặt kỳ vọng đúng: đừng dựa vào Luhn để chống gian lận, vì kẻ gian không gặp khó khăn gì với phép thử này. Chống gian lận là việc của các lớp phía sau và của hệ thống chấm điểm rủi ro ở phía cổng thanh toán.
Câu hỏi thường gặp (FAQ)
Công cụ có kiểm tra được thẻ của tôi còn tiền hay không?
Không. Nó chỉ kiểm tra dãy số có đúng cấu trúc theo tiền tố, độ dài và phép thử Luhn. Thông tin về số dư, hạn mức, trạng thái khóa hay ngày hết hạn chỉ ngân hàng phát hành mới có, và muốn biết thì phải gửi yêu cầu cấp phép qua hệ thống của tổ chức thẻ. Không trang tra cứu nào làm được việc đó.
Kết quả báo hợp lệ có nghĩa là thẻ có thật không?
Không. Hợp lệ ở đây chỉ có nghĩa là dãy số thỏa mãn quy tắc cấu tạo. Bất kỳ dãy số nào cũng có thể chỉnh chữ số cuối để vượt qua phép thử mà vẫn không tương ứng với thẻ nào cả. Ngược lại cũng đúng: một thẻ có thật vẫn bị báo không hợp lệ nếu bạn gõ thiếu hoặc nhầm một chữ số.
Tôi có nên nhập số thẻ đang dùng vào đây không?
Không nên, và cũng không có lý do gì để làm vậy vì kết quả không mang lại thông tin hữu ích cho bạn. Nguyên tắc an toàn là chỉ gõ số thẻ trên màn hình thanh toán của đơn vị bạn tin cậy. Nếu cần thử công cụ, hãy dùng sáu dãy số kiểm thử công khai có sẵn trong khung phía dưới.
Thuật toán Luhn tính như thế nào?
Đọc dãy số từ phải sang trái, nhân đôi các chữ số ở vị trí chẵn, nếu kết quả lớn hơn 9 thì trừ đi 9, rồi cộng tất cả các số lại. Dãy hợp lệ khi tổng chia hết cho 10. Với dãy 4111 1111 1111 1111 thì tổng là 30 nên vượt qua phép thử.
Luhn có bắt được mọi lỗi gõ nhầm không?
Bắt được toàn bộ lỗi sai một chữ số và gần hết lỗi đảo hai chữ số liền kề, với ngoại lệ duy nhất là cặp 0 và 9 vì đổi chỗ hai số này không làm thay đổi tổng. Những lỗi lớn hơn như nhầm hai chữ số cách xa nhau hoặc đảo cả cụm thì phép thử này không phát hiện được.
Vì sao thẻ nội địa của tôi báo không nhận diện được loại thẻ?
Vì công cụ chỉ nhận bảy nhóm thẻ quốc tế theo tiền tố, trong khi thẻ chip nội địa ở Việt Nam bắt đầu bằng 9704 và không thuộc nhóm nào trong số đó. Dãy số của bạn có thể hoàn toàn hợp lệ, chỉ là bộ quy tắc nhận diện trong công cụ không bao gồm dải số này.
Vì sao thẻ American Express chỉ có 15 chữ số?
Vì mỗi tổ chức thẻ tự quy định độ dài cho dải số của mình. American Express dùng 15 chữ số và in theo cách nhóm bốn, sáu rồi năm, trong khi Visa và Mastercard dùng 16 chữ số chia thành bốn cụm bốn. Công cụ tự chia thành các cụm bốn nên với thẻ này cách nhóm hiển thị sẽ khác với cách in trên thẻ.
Sáu chữ số đầu của số thẻ có ý nghĩa gì?
Đó là mã định danh tổ chức phát hành, cho biết ngân hàng nào phát hành và thuộc dòng sản phẩm nào. Chữ số đầu tiên chỉ ngành, ví dụ số 4 và 5 thuộc ngành tài chính ngân hàng, số 3 thuộc nhóm du lịch giải trí. Chuẩn hiện hành đang chuyển dần từ sáu sang tám chữ số cho mã này.
Công cụ có kiểm tra ngày hết hạn và mã bảo mật không?
Không, công cụ chỉ nhận dãy số thẻ. Ngày hết hạn và mã bảo mật in ở mặt sau chỉ được kiểm tra ở phía cổng thanh toán và ngân hàng phát hành. Ngoài ra, theo quy định bảo mật của ngành thẻ, mã bảo mật không được phép lưu trữ ở bất kỳ đâu sau khi giao dịch được cấp phép.
Lập trình viên nên dùng số nào để thử luồng thanh toán?
Dùng bộ số kiểm thử do chính nhà cung cấp cổng thanh toán của bạn công bố, vì chúng được ánh xạ sẵn tới các kịch bản như giao dịch thành công, thẻ bị từ chối hay hết hạn mức. Các dãy số công khai trong công cụ này chỉ dùng để thử phần kiểm tra định dạng, chúng không chạy được trong môi trường thử nghiệm của cổng thanh toán.
Có nên dùng Luhn để chống gian lận không?
Không. Phép thử này quá đơn giản để cản được ai đó có ý đồ xấu, mục đích của nó chỉ là giảm lỗi gõ nhầm. Việc phát hiện gian lận nằm ở các lớp phía sau: xác thực chủ thẻ qua mã một lần, hệ thống chấm điểm rủi ro của cổng thanh toán và quyết định cuối cùng của ngân hàng phát hành.
Dữ liệu tôi nhập có được gửi lên máy chủ không?
Không, toàn bộ phép tính chạy bằng JavaScript trong tab của bạn và không có lệnh gửi dữ liệu nào. Dù vậy, lời khuyên vẫn không đổi: đừng nhập số thẻ đang dùng vào bất kỳ trang web nào không phải màn hình thanh toán, vì bạn không có cách kiểm chứng và vì kết quả cũng chẳng có ích gì với bạn.
Từ khóa liên quan
- kiểm tra số thẻ hợp lệ
- thuật toán luhn
- luhn algorithm là gì
- kiểm tra định dạng số thẻ
- số thẻ visa có bao nhiêu số
- thẻ mastercard bắt đầu bằng số mấy
- amex 15 số
- mã bin thẻ ngân hàng
- 6 số đầu thẻ tín dụng
- thẻ chip nội địa 9704
- số thẻ test thanh toán
- validate thẻ phía client
- kiểm tra checksum số thẻ
- cách nhận diện loại thẻ theo số
- unionpay bắt đầu bằng 62
- jcb bắt đầu bằng 35
- diners club số thẻ
- bảo mật thông tin thẻ
- pci dss lưu cvv
- công cụ kiểm tra số thẻ online
