Cách thức hoạt động của kiểm tra tổng
Số thẻ, IBAN, mã số thuế và địa chỉ tiền mã hóa đều chứa một hoặc hai chữ số bổ sung được tính toán từ các chữ số còn lại. Chỉ cần gõ sai một ký tự thì phép tính sẽ không còn khớp nữa — đó là lý do bộ xác thực có thể phát hiện lỗi gõ sai ngay lập tức, ngoại tuyến, mà không cần hỏi ngân hàng hay mạng blockchain.
Kiểm tra tổng là gì?
Kiểm tra tổng (hoặc chữ số kiểm tra) là sự dư thừa có chủ đích. Khi một số được cấp phát, một hoặc nhiều chữ số của nó không được chọn một cách tự do: chúng được tính toán từ các chữ số còn lại theo một công thức nhất định. Bất kỳ ai biết công thức này đều có thể tính lại các chữ số đó và so sánh. Nếu chúng trùng khớp, số đó có tính nhất quán nội tại. Nếu không, có điều gì đó đã bị gõ sai, đọc nhầm hoặc bị hỏng.
Đó là tất cả những gì kiểm tra tổng hứa hẹn. Nó không nói lên điều gì về việc tài khoản có tồn tại hay không, ai là chủ sở hữu hay nó chứa gì — đây là điểm mà mọi bộ xác thực trên trang web này đều nhắc lại, vì hai thứ này dễ bị nhầm lẫn.
Ví dụ minh họa 1 — Luhn, thuật toán số thẻ
Luhn được sử dụng bởi Visa, Mastercard và hầu hết các loại thẻ thanh toán khác. Hãy xem ví dụ kinh điển 7992 7398 713. Bắt đầu từ chữ số bên phải, nhân đôi mỗi chữ số thứ hai; nếu kết quả nhân đôi là một số hai chữ số, hãy cộng các chữ số của nó lại với nhau. Sau đó cộng tất cả các giá trị lại.
| Chữ số | Vị trí tính từ bên phải | Đã gấp đôi? | Được tính là |
|---|---|---|---|
3 | Chữ số kiểm tra | — | 3 |
1 | Thứ 2 từ phải sang | 1 × 2 = 2 | 2 |
7 | Thứ 3 | — | 7 |
8 | Thứ 4 | 8 × 2 = 16 → 1 + 6 | 7 |
9 | Thứ 5 | — | 9 |
3 | Thứ 6 | 3 × 2 = 6 | 6 |
7 | Thứ 7 | — | 7 |
2 | Thứ 8 | 2 × 2 = 4 | 4 |
9 | Thứ 9 | — | 9 |
9 | Thứ 10 | 9 × 2 = 18 → 1 + 8 | 9 |
7 | Thứ 11 | — | 7 |
Cột bên phải có tổng bằng 3 + 2 + 7 + 7 + 9 + 6 + 7 + 4 + 9 + 9 + 7 = 70. Con số 70 chia hết cho mười nên số đó hợp lệ. Nếu thay đổi bất kỳ chữ số nào thì tổng sẽ không còn là bội số của mười nữa. Hãy thử trên Kiểm tra thẻ tín dụng — công cụ này sẽ thực hiện phép tính y hệt như vậy ngay trên thiết bị của bạn.
Ví dụ minh họa 2 — tổng có trọng số (ISBN-10)
Nhiều số căn cước công dân quốc gia sử dụng phương pháp tổng có trọng số: nhân từng chữ số với một trọng số cố định, cộng chúng lại và kiểm tra phần dư. ISBN-10 là ví dụ rõ ràng nhất. Đối với 0-306-40615-2, các trọng số giảm dần từ 10 xuống 1:
0×10 + 3×9 + 0×8 + 6×7 + 4×6 + 0×5 + 6×4 + 1×3 + 5×2 + 2×1 = 132
132 chính xác bằng 11 × 12, vì vậy phần dư khi chia cho 11 bằng không và ISBN đó hợp lệ. Mã CPF của Brazil, mã PESEL của Ba Lan và hàng chục mã định danh khác đều tuân theo quy luật tương tự với các trọng số và mô-đun riêng — đó là lý do tại sao một Xác thực ID lô có thể kiểm tra hàng nghìn mã chỉ trong một giây.
Ví dụ minh họa 3 — IBAN và mô-đun 97
Số tài khoản ngân hàng quốc tế sử dụng tiêu chuẩn ISO 7064 mod 97-10, một phương thức mạnh hơn với hai chữ số kiểm tra. Hãy xem ví dụ tiêu chuẩn GB82 WEST 1234 5698 7654 32:
- Kiểm tra độ dài theo quốc gia: mã IBAN của Anh gồm 22 ký tự. ✓
- Dời bốn ký tự đầu tiên ra cuối:
WEST12345698765432GB82. - Thay mỗi chữ cái bằng hai chữ số (A = 10 … Z = 35): W→32, E→14, S→28, T→29, G→16, B→11, kết quả là
3214282912345698765432161182. - Chia số đó cho 97. Phần dư phải chính xác bằng 1 — và đúng là như vậy.
Vì 97 là số nguyên tố và lớn hơn bất kỳ sự hoán đổi hai chữ số nào, nên mô-đun 97 có thể phát hiện ra mọi lỗi sai của một chữ cái duy nhất và mọi trường hợp hoán đổi ký tự; chỉ có khoảng một chuỗi ngẫu nhiên trên 97 mới có thể vượt qua một cách tình cờ. Trình Trình xác thực IBAN sẽ hiển thị kết quả từng lớp kiểm tra này là đạt hay không.
Địa chỉ tiền mã hóa: các giá trị kiểm tra được tạo từ hàm băm
Địa chỉ Bitcoin và Ethereum đặt ra tiêu chuẩn cao hơn, vì một lỗi gõ sai sẽ khiến tiền bị gửi đến người nhận không tồn tại vĩnh viễn. Các địa chỉ Bitcoin cũ (1…, 3…) sử dụng Base58Check: nội dung địa chỉ được qua hàm SHA-256 hai lần và bốn byte đầu tiên của kết quả sẽ được thêm vào làm giá trị kiểm tra. Chỉ một ký tự sai cũng đủ thay đổi hoàn toàn hàm băm, nên khả năng một lỗi gõ lọt qua là khoảng một trên bốn tỷ. Các địa chỉ bc1… mới hơn sử dụng Bech32 hoặc Bech32m, một mã sửa lỗi giúp phát hiện mọi sai sót ảnh hưởng đến tối đa bốn ký tự. Thuật toán EIP-55 của Ethereum giấu giá trị kiểm tra trong mẫu chữ viết hoa và thường.
Trình xác thực địa chỉ Bitcoin Trình kiểm tra địa chỉ Bitcoin và trình xác thực địa chỉ Ethereum Trình kiểm tra địa chỉ Ethereum triển khai các thuật toán này trong trình duyệt và tự kiểm tra đối chiếu với các bộ dữ liệu thử nghiệm chính thức mỗi khi trang được tải.
Tóm tắt các phương án
| Phương án | Được sử dụng bởi | Phát hiện được | Khả năng một lỗi ngẫu nhiên lọt qua |
|---|---|---|---|
| Luhn (mod 10) | Thẻ tín dụng & thẻ ghi nợ, IMEI, nhiều loại CMND quốc gia | Mọi lỗi sai về một chữ số và hầu hết các trường hợp hoán đổi ký tự liền kề | Khoảng 1 trên 10 |
| ISO 7064 mod 97-10 | IBAN, một số mã số thuế và mã số doanh nghiệp | Mọi lỗi đơn lẻ và mọi trường hợp hoán đổi ký tự | Khoảng 1 trên 97 |
| Tổng có trọng số, mod 10 hoặc 11 | ISBN-10, mã số CPF của Brazil, mã số PESEL của Ba Lan và nhiều loại ID khác | Các lỗi đơn lẻ và hầu hết các trường hợp hoán đổi ký tự | Khoảng 1 trên 10 hoặc 1 trên 11 |
| Base58Check (SHA-256 kép, 4 byte) | Địa chỉ Bitcoin cũ (1…, 3…) | Bất kỳ lỗi đánh máy nào cũng sẽ bị phát hiện với xác suất cực cao | Khoảng 1 trên 4 tỷ |
| Bech32 / Bech32m (mã BCH) | Địa chỉ Bitcoin SegWit & Taproot (bc1…) | Đảm bảo: mọi lỗi chỉ ảnh hưởng đến tối đa 4 ký tự | Dưới 1 trên một tỷ |
| EIP-55 (việc phân biệt chữ hoa chữ thường của keccak-256) | Địa chỉ Ethereum | Lỗi đánh máy, do mẫu chữ hoa và chữ thường tạo nên | Rất thấp đối với dữ liệu có chữ hoa chữ thường lẫn lộn |
Tại sao trình xác thực nên chạy trên thiết bị của bạn?
Tất cả những điều trên đều là phép tính trên các chữ số mà bạn đã có sẵn. Không có lý do gì để trình xác thực gửi số thẻ, mã số thuế hay địa chỉ ví lên máy chủ — và lại có lý do rất chính đáng để không làm vậy. Mọi trình xác thực trên trang này đều chạy tại chỗ; danh sách các công cụ ngoại tuyến sẽ nhóm chúng lại, và hướng dẫn kiểm tra xem công cụ có tải dữ liệu của bạn lên hay không sẽ chỉ cho bạn cách xác nhận điều đó đối với bất kỳ trang web nào trong vòng hai mươi giây.
Câu hỏi thường gặp
Liệu checksum hợp lệ có nghĩa là số đó là thật hoặc đang hoạt động không?
Không. Checksum chỉ chứng minh các chữ số có sự nhất quán nội bộ — tức là số đó có thể tồn tại. Nó không thể cho bạn biết tài khoản có đang mở không, ai là chủ sở hữu hay số dư của nó là bao nhiêu. Mọi trình xác thực trên trang này đều nêu rõ điều này trên trang, vì sự khác biệt đó rất quan trọng.
Khả năng một số sai vẫn qua được kiểm tra là bao nhiêu?
Điều này phụ thuộc vào thuật toán. Một chữ số kiểm tra mod-10 cho phép khoảng 1 lỗi ngẫu nhiên trên 10 trường hợp lọt qua; thuật toán mod 97 của IBAN cho phép khoảng 1 trường hợp trên 97 lọt qua; checksum Base58Check gồm 4 byte cho phép khoảng 1 trường hợp trên 4 tỷ lọt qua. Đặc điểm quan trọng là tất cả các thuật toán này đều phát hiện được những sai sót phổ biến của con người — một chữ số sai hoặc hai chữ số bị hoán đổi.
Tại sao một số mã định danh lại không có checksum?
Các thuật toán cũ hoặc đơn giản hơn được thiết kế để tra cứu trong sổ đăng ký thay vì kiểm tra ngoại tuyến, và một số hệ thống đánh số ra đời trước khi có thực tiễn này. Đối với những trường hợp đó, bộ xác thực chỉ có thể kiểm tra độ dài và định dạng.
Liệu việc dán số thẻ hoặc số CMND của tôi vào bộ xác thực có an toàn không?
Chỉ khi quá trình xác thực được thực hiện trên thiết bị của bạn. Checksum là phép tính dựa trên các chữ số mà bạn đã có sẵn, vì vậy không có lý do chính đáng nào để bộ xác thực gửi chúng đến máy chủ. Bạn có thể xác nhận công cụ đang chạy tại chỗ bằng cách thực hiện bài kiểm tra chế độ máy bay được mô tả trong hướng dẫn của chúng tôi về cách kiểm tra xem công cụ có tải dữ liệu của bạn lên hay không.
Sự khác biệt giữa checksum, hash và mã hóa là gì?
Checksum là một chữ số kiểm tra ngắn được thiết kế để phát hiện các lỗi gõ nhầm ngẫu nhiên. Hash mật mã là một dấu vân tay dài được thiết kế sao cho ngay cả khi có sự thay đổi cố ý cũng sẽ được phát hiện và dữ liệu gốc không thể phục hồi. Mã hóa biến đổi dữ liệu sao cho chỉ có thể đọc được khi có khóa. Base58Check sử dụng hash để tạo thành checksum của mình, đó là lý do tại sao rất khó để lừa gạt nó một cách ngẫu nhiên.