Chuyển đến nội dung

Máy Tính Thuật Toán Luhn - Xác Thực Thẻ Tín Dụng & IMEI

Máy tính Luhn mod 10 miễn phí để xác thực thẻ tín dụng, kiểm tra IMEI và xác minh ID. Ngay lập tức xác thực số hoặc tạo dữ liệu thử nghiệm trực tuyến.

Máy tính Thuật toán Luhn

Thao tác

Kiểm tra xem số của bạn có vượt qua xác thực Luhn mod 10 không

Máy tính tải...
📚

Tài liệu hướng dẫn

Thuật toán Luhn là gì?

Thuật toán Luhn, còn gọi là thuật toán mod 10, là một công thức kiểm tra xem một chuỗi chữ số có thể là số nhận dạng hợp lệ hay không. Nó được dùng để phát hiện lỗi gõ trong số thẻ tín dụng, số IMEI trên điện thoại và các mã ID khác trước khi chúng gây ra lỗi. Kỹ sư Hans Peter Luhn của IBM đã mô tả phương pháp này trong một bằng sáng chế được nộp năm 1954.

Thuật toán này không chứng minh một số là có thật hoặc đang hoạt động. Nó chỉ xác nhận rằng các chữ số tuân theo mẫu dự kiến. Một số thẻ có thể vượt qua kiểm tra Luhn nhưng vẫn là số giả, đã hết hạn hoặc không có tiền.

Cách tính tổng kiểm tra Luhn

Phép kiểm tra được thực hiện trên các chữ số của một số, đọc từ phải sang trái.

  1. Bắt đầu với chữ số thứ hai từ bên phải, nhân đôi mỗi chữ số cách một chữ số.
  2. Nếu nhân đôi một chữ số cho kết quả lớn hơn 9, hãy trừ 9 khỏi kết quả đó. (Điều này tương đương với việc cộng hai chữ số của kết quả, nên 16 trở thành 1 + 6 = 7, hoặc tương đương 16 − 9 = 7.)
  3. Cộng tất cả các chữ số: những chữ số đã nhân đôi (sau khi điều chỉnh) và những chữ số không thay đổi.
  4. Nếu tổng chia hết cho 10, số đó là hợp lệ. Nếu không, số đó không hợp lệ.

Khi một doanh nghiệp cấp các số ID mới, họ thực hiện các bước tương tự theo chiều ngược lại. Họ chọn tất cả chữ số trừ chữ số cuối, thực hiện phép kiểm tra, rồi chọn “chữ số kiểm tra” cuối cùng sao cho tổng chia hết cho 10.

Ví dụ minh họa: Xác thực số thẻ

Xét số kiểm tra 4532015112830366.

  1. Các chữ số từ phải sang trái: 6, 6, 3, 0, 3, 8, 2, 1, 1, 5, 1, 0, 2, 3, 5, 4
  2. Nhân đôi mỗi chữ số thứ hai: 6, 12, 3, 0, 3, 16, 2, 2, 1, 10, 1, 0, 2, 6, 5, 8
  3. Trừ 9 khỏi mọi kết quả lớn hơn 9: 6, 3, 3, 0, 3, 7, 2, 2, 1, 1, 1, 0, 2, 6, 5, 8
  4. Cộng lại: 6+3+3+0+3+7+2+2+1+1+1+0+2+6+5+8 = 50
  5. 50 chia hết cho 10, nên số này là hợp lệ.

Ví dụ minh họa: Một số không hợp lệ

Xét 490154203237517, một số gồm 15 chữ số theo định dạng được dùng cho số IMEI.

Thực hiện các bước tương tự cho kết quả tổng là 59. Vì 59 không chia hết cho 10, số này không hợp lệ.

Để biến nó thành số hợp lệ, chỉ cần thay đổi chữ số cuối. Thử lần lượt từng chữ số cuối cho thấy chữ số 8 sẽ đưa tổng lên 60, là số chia hết cho 10. Vì vậy, 490154203237518 là một số Luhn hợp lệ, còn mọi chữ số cuối khác từ 0 đến 9 (trừ 8) đều tạo ra số không hợp lệ.

Cách sử dụng công cụ tính này

Công cụ tính có hai chế độ, được chọn bằng các nút Tác vụ.

Xác thực kiểm tra một số ngay khi số đó được nhập. Không cần nhấn nút. Kết quả xuất hiện ngay khi ô nhập chứa các chữ số, còn phần phân tích từng bước bên dưới liệt kê từng chữ số, giá trị đóng góp của nó sau khi nhân đôi và rút gọn về một chữ số, cùng với tổng.

Tạo tạo một số vượt qua phép kiểm tra. Các chữ số đã có trong ô được giữ lại làm phần đầu của số mới. Công cụ tính điền phần còn lại bằng các chữ số ngẫu nhiên và thêm chữ số kiểm tra. Kết quả có 16 chữ số, là độ dài của một số thẻ thanh toán thông thường, trừ khi các chữ số được cung cấp đã có 16 chữ số trở lên; trong trường hợp đó, kết quả dài hơn phần đã cung cấp một chữ số.

Các dấu cách, dấu gạch ngang và dấu chấm trong dữ liệu nhập được bỏ qua, vì vậy “4532 0151 1283 0366” và “4532-0151-1283-0366” được đọc giống như chuỗi chỉ gồm các chữ số. Mọi ký tự khác, chẳng hạn như chữ cái, sẽ bị từ chối kèm thông báo lỗi.

Thuật toán Luhn được sử dụng ở đâu

  • Thẻ thanh toán. Visa, Mastercard, American Express và các mạng lưới khác tạo số thẻ sao cho toàn bộ số vượt qua phép kiểm tra Luhn. Biểu mẫu thanh toán có thể dùng phép kiểm tra này để phát hiện chữ số bị gõ sai trước khi liên hệ với đơn vị xử lý thanh toán.
  • Số IMEI. Mã nhận dạng gồm 15 chữ số được cấp cho điện thoại và các thiết bị di động khác có chứa một chữ số kiểm tra Luhn.
  • Số bảo hiểm xã hội Canada. SIN gồm 9 chữ số sử dụng cùng phép kiểm tra này.
  • Mã định danh nhà cung cấp quốc gia của Hoa Kỳ (NPI). Các nhà cung cấp dịch vụ chăm sóc sức khỏe tại Hoa Kỳ nhận một NPI gồm 10 chữ số, được xác thực bằng phép kiểm tra dựa trên Luhn.

Những lỗi thuật toán Luhn không phát hiện được

Thuật toán luôn phát hiện một chữ số bị gõ sai, bất kể đó là chữ số nào hoặc xuất hiện ở vị trí nào. Nó cũng phát hiện mọi trường hợp đổi chỗ hai chữ số liền kề (chẳng hạn gõ “39” thay vì “93”), ngoại trừ một trường hợp cụ thể: đổi chỗ 0 và 9 khi chúng đứng cạnh nhau, chẳng hạn “09” trở thành “90”.

Thuật toán cũng bỏ sót ba lỗi “cặp đôi”, trong đó một cặp chữ số lặp lại bị thay bằng một cặp lặp khác: đọc 22 thành 55, 33 thành 66 và 44 thành 77. Vì các trường hợp bỏ sót này đã được biết và khá hạn chế, phép kiểm tra Luhn đáng tin cậy trong việc phát hiện lỗi gõ thông thường nhưng không được xem là hệ thống phát hiện lỗi hoàn chỉnh khi dùng riêng.

Luhn không phải là phép kiểm tra bảo mật

Luhn được thiết kế để phát hiện lỗi nhập dữ liệu vô ý, không phải gian lận. Một số vượt qua phép kiểm tra chỉ có nghĩa là nó đúng về mặt toán học, không hơn. Bảo mật thanh toán thực tế phụ thuộc vào các lớp kiểm tra khác được bổ sung sau phép kiểm tra Luhn, chẳng hạn như mã CVV của thẻ, xác minh địa chỉ và xác thực 3-D Secure. Luhn đơn giản là bộ lọc đầu tiên và ít tốn kém nhất, được chạy trước các bước kiểm tra chậm hơn.

Xác thực một số bằng JavaScript

1function isValidLuhn(number) {
2  const digits = number.replace(/\D/g, '').split('').map(Number);
3  if (digits.length === 0) return false;
4
5  let sum = 0;
6  let doubleDigit = false;
7  for (let i = digits.length - 1; i >= 0; i--) {
8    let d = digits[i];
9    if (doubleDigit) {
10      d *= 2;
11      if (d > 9) d -= 9;
12    }
13    sum += d;
14    doubleDigit = !doubleDigit;
15  }
16  return sum % 10 === 0;
17}
18

Việc kiểm tra dữ liệu đầu vào rỗng rất quan trọng: một chuỗi rỗng có tổng chữ số là 0, và 0 chia hết cho 10, nên nếu không có bước kiểm tra này, hàm sẽ coi chuỗi rỗng là một số hợp lệ. Để tìm chữ số kiểm tra thay vì kiểm tra một số, hãy chạy cùng vòng lặp trên các chữ số trước chữ số kiểm tra, nhưng bắt đầu nhân đôi từ chữ số cuối cùng trong số đó, rồi tính (10 - sum % 10) % 10.

Các câu hỏi thường gặp

Thuật toán Luhn được dùng để làm gì?

Thuật toán này kiểm tra xem một số nhận dạng, chẳng hạn như số thẻ tín dụng, số IMEI hoặc SIN của Canada, có hợp lệ về mặt cấu trúc hay không. Nó phát hiện các chữ số bị gõ sai hoặc bị đảo vị trí trước khi chúng gây ra lỗi xử lý.

Thuật toán Luhn chính xác đến mức nào trong việc phát hiện lỗi?

Thuật toán phát hiện mọi chữ số bị gõ sai và gần như mọi trường hợp hai chữ số liền kề bị đổi chỗ. Trường hợp đổi chỗ duy nhất nó bỏ sót là 0 và 9 khi đứng cạnh nhau. Nó cũng bỏ sót ba trường hợp thay thế “cặp đôi” cụ thể: 22 thay cho 55, 33 thay cho 66 và 44 thay cho 77.

Số Luhn hợp lệ có nghĩa là thẻ có thật không?

Không. Phép kiểm tra chỉ xác nhận các chữ số phù hợp với mẫu dự kiến. Nó không cho biết thẻ có tồn tại, đang hoạt động hay có tiền hay không. Doanh nghiệp thực hiện các bước kiểm tra riêng, chẳng hạn như kiểm tra mã CVV, để xác minh các thông tin đó.

Có thể thực hiện phép kiểm tra Luhn mà không cần máy tính không?

Có. Phép kiểm tra chỉ cần nhân đôi, trừ và cộng, nên có thể thực hiện bằng tay hoặc bằng một máy tính đơn giản. Đây là một phần trong thiết kế ban đầu, nhằm phục vụ thời kỳ thẻ đục lỗ trước khi máy tính kỹ thuật số trở nên phổ biến.

Các số được tạo ra có phải là số thẻ có thật không?

Không. Công cụ tạo chỉ tạo ra các chuỗi chữ số thỏa mãn phép kiểm tra Luhn. Chúng được dùng để kiểm thử biểu mẫu nhập liệu. Không ngân hàng nào đã phát hành chúng và không thể dùng chúng để thanh toán bất cứ thứ gì.

Tại sao nó được gọi là thuật toán mod 10?

Vì bước cuối cùng kiểm tra xem tổng có chia hết cho 10 hay không; trong toán học, điều này được viết là “sum mod 10 = 0”. “Mod” là viết tắt của modulo, phần dư còn lại sau phép chia.

Ai phát minh ra thuật toán Luhn?

Hans Peter Luhn, một kỹ sư tại IBM, đã mô tả thuật toán này trong đơn đăng ký bằng sáng chế được nộp năm 1954 (được cấp năm 1960 với số bằng sáng chế Hoa Kỳ 2.950.048). Ông cũng được biết đến với những công trình ban đầu về lập chỉ mục văn bản bằng máy tính.