Đỗ không cửa hàng đơn giản SHA-1 của số thẻ tín dụng, nó sẽ là cách để dễ dàng để crack (đặc biệt là kể từ khi 4 chữ số cuối cùng được biết). Chúng tôi đã có cùng một vấn đề trong công ty của tôi: đây là cách chúng tôi giải quyết nó.
giải pháp đầu tiên
- Đối với mỗi thẻ tín dụng, chúng tôi lưu trữ 4 chữ số cuối cùng, ngày hết hạn, một muối ngẫu nhiên dài (dài 50 byte), và băm ướp muối của số CC. Chúng tôi sử dụng thuật toán bcrypt băm vì nó rất an toàn và có thể được điều chỉnh để có mức độ chuyên sâu CPU như bạn mong muốn. Chúng tôi đã điều chỉnh nó là rất tốn kém (khoảng 1 giây mỗi băm trên máy chủ của chúng tôi!). Nhưng tôi đoán bạn có thể sử dụng SHA-256 thay vào đó và lặp lại nhiều lần nếu cần.
- Khi nhập số CC mới, chúng tôi bắt đầu bằng cách tìm tất cả các số CC hiện có kết thúc bằng 4 chữ số và có cùng ngày hết hạn. Sau đó, đối với mỗi CC phù hợp, chúng tôi kiểm tra xem mã băm được lưu trữ của nó có khớp với hàm băm muối được tính từ muối của nó và số CC mới không. Nói cách khác, chúng tôi kiểm tra xem có hay không
hash(stored_CC1_salt+CC2)==stored_CC1_hash
.
Vì chúng tôi có khoảng 100k thẻ tín dụng trong cơ sở dữ liệu của mình, chúng tôi cần tính khoảng 10 băm, vì vậy chúng tôi nhận được kết quả sau khoảng 10 giây. Trong trường hợp của chúng tôi, điều này là tốt, nhưng bạn có thể muốn điều chỉnh bcrypt xuống một chút. Thật không may, nếu bạn làm thế, giải pháp này sẽ kém an toàn hơn. Mặt khác, nếu bạn điều chỉnh bcrypt để có nhiều CPU hơn, nó sẽ mất nhiều thời gian hơn để phù hợp với số CC.
Mặc dù tôi tin rằng giải pháp này là cách tốt hơn chỉ đơn giản là lưu trữ một băm chưa được định trước của số CC, nó sẽ không ngăn chặn một tên cướp biển rất có động cơ (người quản lý để có được một bản sao của cơ sở dữ liệu) thẻ trong thời gian trung bình từ 2 đến 5 năm. Vì vậy, nếu bạn có 100k thẻ tín dụng trong cơ sở dữ liệu của mình và nếu tên cướp biển có số lô của CPU thì anh ấy có thể khôi phục một số thẻ tín dụng mỗi ngày!
Điều này dẫn tôi đến sự tin tưởng rằng bạn không nên tự tính giá trị băm: bạn phải ủy quyền cho người khác. Đây là giải pháp thứ hai (chúng tôi đang trong quá trình chuyển sang giải pháp thứ hai này).
giải pháp thứ hai
Đơn giản chỉ cần có cung cấp dịch vụ thanh toán của bạn tạo ra một bí danh cho thẻ tín dụng của bạn.
- cho mỗi thẻ tín dụng, bạn chỉ cần lưu trữ bất cứ điều gì bạn muốn lưu trữ (ví dụ 4 chữ số cuối & ngày hết hạn) cộng một số thẻ tín dụng bí danh.
- khi nhập số thẻ tín dụng mới, bạn liên hệ với nhà cung cấp thanh toán và cung cấp số CC (hoặc chuyển hướng khách hàng đến nhà cung cấp thanh toán và nhập số CC trực tiếp trên trang web của nhà cung cấp thanh toán). Đổi lại, bạn nhận được bí danh thẻ tín dụng! Đó là nó. Tất nhiên bạn nên đảm bảo rằng nhà cung cấp thanh toán của bạn cung cấp tùy chọn này và bí danh được tạo thực sự an toàn (ví dụ: đảm bảo họ không chỉ tính toán SHA-1 trên số thẻ tín dụng!). Bây giờ cướp biển phải phá vỡ hệ thống của bạn cộng hệ thống của nhà cung cấp thanh toán của bạn nếu anh ta muốn khôi phục số thẻ tín dụng.
Thật đơn giản, nhanh, an toàn (ít nhất, nếu nhà cung cấp thanh toán của bạn). Vấn đề duy nhất tôi thấy là nó liên kết bạn với nhà cung cấp thanh toán của bạn.
Hy vọng điều này sẽ hữu ích.
Tôi đồng ý. Hãy ghi nhớ rằng điều này làm cho việc đăng ký một thẻ tín dụng một hoạt động O (n) trong đó n là số thẻ hiện có đã đăng ký. Cộng với băm là một hoạt động khá tốn kém. – Johan