Số thẻ tín dụng tiêu chuẩn có entropy giới hạn. Mỗi ISO/IEC 7812 6 chữ số đầu tiên được cố định cho một nhà phát hành thẻ nhất định và giả định thận trọng đơn giản nhất là những kẻ tấn công đã biết chúng. Chữ số cuối cùng là một chức năng công cộng của những người khác. Đối với số thẻ tín dụng gồm 16 chữ số, số đó để lại 9 chữ số (tốt nhất là <30 bit entropy). Điều này chỉ có thể tăng lên một chút (như 5 bit) bằng cách sử dụng ngày hết hạn.
Điều này ngụ ý rằng chúng ta không thể sử dụng hàm nhanh và công khai (như hàm băm, trừ khi có quy định khác) và nhận được tính một chiều mong muốn. Và rằng bất kỳ chức năng công khai chậm chạp nào cũng sẽ có mức độ bảo mật hạn chế. Hơn nữa, kích thước quá nhỏ đối với mật mã khóa công khai.
Tôi kết luận rằng chúng ta chỉ có thể sử dụng mật mã khóa bí mật, đối xứng. Mã hóa bảo toàn định dạng đi vắng. Chúng tôi cũng có thể sử dụng một định dạng lại Mã xác thực tin nhắn, nhưng chúng ta phải sợ xung đột và nó sẽ đảm bảo tính toàn vẹn kém mạnh mẽ hơn một chút so với FPE.
Mỗi yêu cầu trong bình luận, Tôi sẽ trình bày chi tiết một MAC được định dạng lại. Tôi cho rằng đầu ra phải là 16 chữ số thập phân, không có ràng buộc nào khác. Điều này ngụ ý rằng chúng tôi sẵn sàng chấp nhận một số xác suất va chạm thấp: vì $n$ số thẻ mà xác suất sẽ được giới hạn trên bởi $n\,(n-1)/(2\cdot10^{16})$; xem cái này. Ví dụ: chúng tôi phải hài lòng với độ tin cậy 99% không có xung đột giữa tối đa 14 triệu số thẻ (được chọn mà không cần biết về khóa).
- Giả sử một khóa bí mật cố định với entropy ít nhất 128 bit
- tính toán HMAC-SHA-256 của số thẻ tín dụng và khóa, với
Kích thước đầu ra
= 32 byte
- Coi đầu ra là một số nguyên trong $[0,2^{256})$ (theo quy ước big-endian), giảm nó modulo $10^{16}$và biểu thị kết quả dưới dạng 16 chữ số thập phân (với các số 0 đứng đầu nếu cần thiết), tạo thành mã thông báo.
Về cơ bản, không thể đảo ngược mã thông báo đó nếu không có quyền truy cập vào khóa hoặc thiết bị có khóa; nhưng điều đó có thể thực hiện được với nỗ lực chính và vừa phải, bằng cách thử và sai trên số thẻ tín dụng.
Ngoài ra, nếu chúng tôi muốn làm cho việc đảo ngược một cái bằng phím hơi khó khăn hơn, chúng tôi có thể thay thế HMAC-SHA-256 bằng Argon2 (số thẻ tín dụng được cung cấp dưới dạng mật khẩu, khóa dưới dạng khóa, muối cố định, chiều dài thẻ
= 32 byte), được tham số hóa để làm chậm mọi thứ ở mức có thể chấp nhận được. Điều đó không làm thay đổi xác suất va chạm, nhưng tính bảo mật được cải thiện: giả sử Argon2 được tham số hóa trong 0,1 giây thời gian tính toán của một PC nhất định; kẻ tấn công có 100 PC tương tự; 9 chữ số của số thẻ tín dụng là hoàn toàn ngẫu nhiên, 6 chữ số đã biết và chữ số cuối cùng là tổng kiểm tra thông thường; sau đó sẽ cần trung bình một triệu giây (11,6 ngày) để đảo ngược một hàm băm nhất định hoặc 1 giây để đảo ngược một hàm băm trong số một triệu hàm băm đã cho.
Nếu chúng tôi không thể sống chung với rủi ro va chạm, chúng tôi phải sử dụng Mã hóa bảo toàn định dạng thực sự, nhưng chúng tôi gặp khó khăn trong việc đảo ngược cho một người giữ khóa. FPE khó tính toán hơn đáng kể theo hướng ngược lại không phải là tiêu chuẩn, nhưng có thể hiểu được, hãy xem phần này câu hỏi.