2013-01-04 35 views
7

Tôi đang trong quá trình xây dựng một ứng dụng web nhỏ sẽ chứa khoảng 10 mẩu thông tin cho mỗi người được chèn vào. Do bảo vệ dữ liệu, phần lớn thông tin này phải được mã hóa.Tìm kiếm ký tự đại diện của dữ liệu được mã hóa trong cơ sở dữ liệu MySQL?

Sử dụng khung CodeIgniter và lớp mã hóa CodeIgniter Tôi có thể mã hóa thông tin ở phía ứng dụng trước khi lưu trữ nó trong cơ sở dữ liệu. Lớp mã hóa CodeIgniter sử dụng hàm mcrypt của PHP cùng với mật mã AES_256.

Vấn đề tôi có là tôi cần cho phép người dùng ứng dụng tìm kiếm thông tin được lưu trữ bằng cách sử dụng tìm kiếm theo ký tự đại diện, Có thể cũng thông qua API vào một ngày sau đó.

Bất kỳ cơ thể nào cũng gặp phải một giải pháp cho một vấn đề tương tự. Tôi đã đọc về MySQL AES_ENCRYPT và AES_DECRYPT nhưng họ vẫn yêu cầu chuyển một chìa khóa qua lại trong văn bản đơn giản mà tôi không muốn làm.

Tôi hiện đang kết luận rằng nếu tôi muốn tiếp tục tuyến đường này thì giải mã đầy đủ là giải pháp duy nhất của tôi mỗi khi tìm kiếm được thực hiện (rõ ràng là không tốt).

Trả lời

6

Vâng, bạn không thể tìm kiếm trong văn bản được giải mã mà không cần giải mã trước, điều đó đúng.

Tuy nhiên, điều đó không có nghĩa là không có cách nào xung quanh việc này. Ví dụ: bạn có thể tạo inverted index dữ liệu và mã băm (sha1, md5, crc32, chọn một) các khóa được sử dụng để tìm kiếm. Tất cả những gì bạn phải làm sau đó là băm các thuật ngữ tìm kiếm bạn đang sử dụng, tìm kiếm chúng trong chỉ mục và lấy bất kỳ bản ghi nào khớp với, mà sẽ chỉ là một phần nhỏ của bảng thay vì toàn bộ điều.

Bằng cách băm dữ liệu (sử dụng muối!), Bạn tránh lưu trữ dữ liệu theo cách không an toàn, trong khi bạn vẫn có thể tìm kiếm thông qua dữ liệu vì bạn đã lập chỉ mục cho dữ liệu đó. Không cần giải mã cho đến khi bạn thực sự chắc chắn tài liệu nào khớp với nhau.

+1

+1 cho tư duy bên, và sử dụng băm để đảm bảo từ khóa nhạy cảm vẫn được duy trì một cách nhạy cảm –

+1

Xin cảm ơn vì đã trả lời, tôi nghĩ rằng tôi hiểu những gì bạn đang đề xuất nhưng sẽ không lập chỉ mục tìm kiếm 'where_in' hoặc 'like', ví dụ: tìm kiếm% CHR% sẽ trả về một bản ghi có từ CHRIS trong đó. Có lẽ tôi đang đọc nó sai, nếu như vậy bạn có thể xây dựng một chút xin vui lòng. – user1530205

+1

Các tìm kiếm theo ký tự đại diện chính xác không thực sự hoạt động với các chỉ mục ngược, nhưng hoạt động thực sự tốt với các tìm kiếm thông thường. Cách duy nhất bạn có thể thực hiện tìm kiếm ký tự đại diện là giải mã toàn bộ điều. –