Hướng dẫn mysql search encrypted data - dữ liệu được mã hóa tìm kiếm mysql
Nói chung, bạn không nên mã hóa dữ liệu được lưu trữ trong cơ sở dữ liệu mà bạn cần tìm kiếm. Trong ví dụ của bạn mà bạn đưa ra, sẽ rất hữu ích khi biết bối cảnh lý do tại sao bạn lấy tên người dùng bằng tên đầu tiên và mối quan tâm bảo mật chung của bạn là gì ...
Đây có phải là một ứng dụng web và mối quan tâm chính của bạn là truyền thông tin cá nhân của người dùng qua mạng? Sử dụng kết nối được mã hóa khi gửi dữ liệu giữa PC của người dùng và máy chủ (ví dụ: 'HTTPS'). Bạn có quan tâm đến việc ai đó hack máy chủ và tải xuống một bản sao của cơ sở dữ liệu không? Xem xét giới hạn số lượng thông tin nhận dạng cá nhân bạn đang lưu trữ. Bạn có thực sự cần lưu trữ tên thật của người dùng không? Giả sử bạn cần lưu trữ thông tin nhận dạng cá nhân về người dùng, hãy xem xét sử dụng các phương thức khác để tìm nạp hồ sơ của họ từ cơ sở dữ liệu hơn là sử dụng các phần nhận dạng cá nhân (nghĩa là không lấy chúng bởi 'First_name'). Cân nhắc lấy người dùng bằng ID hoặc tên người dùng có thể không liên quan đến tên thật của họ. Điều này sẽ cho phép bạn sử dụng lập chỉ mục để truy xuất nhanh các hồ sơ và bạn có thể mã hóa thông tin cá nhân của họ (tên, họ, email, điện thoại #, v.v.) cho nội dung trái tim của bạn. Nếu điều này không giúp bạn, có thể cung cấp thêm một số bối cảnh về những gì bạn đang cố gắng thực hiện và tại sao. TLDR: Cố gắng tìm kiếm dữ liệu được mã hóa là một ý tưởng tồi. Hãy nghĩ về vấn đề nào bạn đang cố gắng tránh và đưa ra một giải pháp thay thế. Rõ ràng chúng không có nghĩa là được xem, do đó việc tìm kiếm trên chúng sẽ có vấn đề. Một thủ thuật tôi đã sử dụng trong quá khứ là băm dữ liệu được mã hóa trước khi mã hóa nó và lưu trữ băm trong một cột được lập chỉ mục. Tất nhiên, điều này chỉ hoạt động nếu bạn đang tìm kiếm trên toàn bộ giá trị; Giá trị một phần sẽ không có cùng băm. Bạn có thể mở rộng điều này bằng cách tạo một chỉ mục "toàn văn" của băm, nếu bạn cần, nhưng nó có thể trở nên phức tạp rất nhanh. Phụ lục Có ý kiến cho rằng tôi thêm một chú thích vào câu trả lời của mình trên một cuộc tranh luận khá dài trong trò chuyện về tính dễ bị tổn thương đối với các cuộc tấn công từ điển, vì vậy tôi sẽ thảo luận về rủi ro bảo mật tiềm năng này đối với cách tiếp cận trên. Tấn công từ điển: Một cuộc tấn công từ điển là khi ai đó đặt trước danh sách các giá trị đã biết và so sánh các băm với cột băm của bạn trong cơ sở dữ liệu. Nếu họ có thể tìm thấy một trận đấu, có khả năng giá trị đã biết thực sự là thứ đang được băm (mặc dù không xác định, vì băm không được đảm bảo là duy nhất). Điều này thường được giảm thiểu bằng cách băm giá trị bằng một "muối" ngẫu nhiên được nối hoặc chuẩn bị để băm sẽ không khớp với từ điển, nhưng câu trả lời ở trên không thể sử dụng muối vì bạn mất khả năng tìm kiếm. Cuộc tấn công này rất nguy hiểm khi xử lý những thứ như mật khẩu: Nếu bạn tạo từ điển băm mật khẩu phổ biến, thì bạn có thể nhanh chóng tìm kiếm bảng giá trị băm đó và xác định người dùng có mật khẩu như vậy và trích xuất thông tin xác thực để đánh cắp danh tính của người dùng đó . Nó ít nguy hiểm hơn đối với các mặt hàng có mức độ cao của Cardinality, như SSN, số thẻ tín dụng, hướng dẫn, v.v. (nhưng có những rủi ro khác nhau [đọc: hợp pháp] liên quan đến việc lưu trữ những ). Lý do cho điều này là để một cuộc tấn công từ điển hoạt động, bạn cần phải xây dựng sẵn một từ điển các giá trị có thể và băm của chúng. Về mặt lý thuyết, bạn có thể xây dựng một từ điển của tất cả các SSN có thể (một tỷ hàng, giả sử tất cả các hoán vị định dạng được loại bỏ; nhiều hàng nghìn tỷ đồng cho thẻ tín dụng) ... nhưng đó thường không phải là điểm của một cuộc tấn công từ điển và Về cơ bản trở nên tương đương với một cuộc tấn công vũ lực nơi bạn đang điều tra một cách có hệ thống mọi giá trị. Bạn cũng có thể tìm kiếm một SSN hoặc số thẻ tín dụng cụ thể, nếu bạn đang cố gắng khớp SSN với một người. Một lần nữa, thường không phải là điểm của một cuộc tấn công từ điển, nhưng có thể làm được, vì vậy nếu đây là một rủi ro bạn cần tránh, câu trả lời của tôi không phải là một giải pháp tốt cho bạn. Vì vậy, bạn có nó. Như với tất cả dữ liệu được mã hóa, nó thường được mã hóa vì một lý do, vì vậy hãy nhận biết dữ liệu của bạn và những gì bạn đang cố gắng bảo vệ nó khỏi. 6.3.1 & NBSP; Định cấu hình MySQL để sử dụng các kết nối được mã hóaMột số tham số cấu hình có sẵn để cho biết có nên sử dụng các kết nối được mã hóa hay không và để chỉ định chứng chỉ và tệp khóa thích hợp. Phần này cung cấp hướng dẫn chung về việc định cấu hình máy chủ và máy khách cho các kết nối được mã hóa:
Đối với một số triển khai MySQL, có thể không chỉ mong muốn mà bắt buộc phải sử dụng các kết nối được mã hóa (ví dụ, để đáp ứng các yêu cầu quy định). Phần này thảo luận về cài đặt cấu hình cho phép bạn thực hiện việc này. Các cấp kiểm soát này có sẵn:
Để yêu cầu khách hàng kết nối bằng cách sử dụng các kết nối được mã hóa, bật biến hệ thống 5. Ví dụ: đặt các dòng này vào tệp máy chủ 0:Cấu hình khởi động phía máy chủ cho các kết nối được mã hóaCấu hình phía máy khách cho các kết nối được mã hóa Các kết nối được mã hóa cũng có thể được sử dụng trong các bối cảnh khác, như được thảo luận trong các phần bổ sung này: Giữa các máy chủ nguồn và bản sao. Xem Phần & NBSP; 16.3.8, Thiết lập bản sao để sử dụng các kết nối được mã hóa.
Về phía máy chủ, tùy chọn 4 chỉ định rằng máy chủ cho phép nhưng không yêu cầu các kết nối được mã hóa. Tùy chọn này được bật theo mặc định, vì vậy nó không cần phải được chỉ định rõ ràng.
Để chỉ định ngoài ra rằng máy khách được yêu cầu sử dụng các kết nối được mã hóa, hãy bật biến hệ thống 5:
Mỗi biến chứng chỉ và biến hệ thống chính tên một tệp ở định dạng PEM. Nếu bạn cần tạo chứng chỉ cần thiết và các tệp chính, xem Phần & NBSP; 6.3.3, Tạo chứng chỉ SSL và RSA và khóa. Các máy chủ MySQL được biên dịch bằng OpenSSL có thể tự động tạo các tệp chứng chỉ và khóa bị thiếu khi khởi động. Xem Phần & NBSP; 6.3.3.1, Tạo các chứng chỉ và khóa SSL và RSA bằng MySQL. Ngoài ra, nếu bạn có phân phối nguồn MySQL, bạn có thể kiểm tra thiết lập của mình bằng chứng chỉ trình diễn và các tệp khóa trong thư mục 2 của nó.Máy chủ thực hiện chứng chỉ và tệp chính tự động khám phá. Nếu không có tùy chọn kết nối được mã hóa rõ ràng nào được đưa ra ngoài 4 (có thể cùng với 4) để định cấu hình các kết nối được mã hóa, máy chủ sẽ cố gắng tự động hỗ trợ kết nối được mã hóa khi khởi động:
Nếu máy chủ tự động cho phép hỗ trợ kết nối được mã hóa, nó sẽ ghi một ghi chú vào nhật ký lỗi. Nếu máy chủ phát hiện ra rằng chứng chỉ CA tự ký, nó sẽ viết một cảnh báo cho nhật ký lỗi. .mysql_ssl_rsa_setup.) MySQL cũng cung cấp các biến hệ thống này cho điều khiển kết nối được mã hóa phía máy chủ:
Cấu hình phía máy khách cho các kết nối được mã hóaĐể biết danh sách đầy đủ các tùy chọn máy khách liên quan đến việc thiết lập các kết nối được mã hóa, hãy xem các tùy chọn lệnh cho các kết nối được mã hóa. Theo mặc định, các chương trình máy khách MySQL cố gắng thiết lập kết nối được mã hóa nếu máy chủ hỗ trợ các kết nối được mã hóa, với điều khiển tiếp theo có sẵn thông qua tùy chọn 3:
Quan trọng Cài đặt mặc định, 5, tạo kết nối được mã hóa nếu các cài đặt mặc định khác không thay đổi. Tuy nhiên, để giúp ngăn chặn các cuộc tấn công giữa người đàn ông tinh vi, điều quan trọng là khách hàng phải xác minh danh tính máy chủ. Cài đặt 8 và 9 là một lựa chọn tốt hơn so với cài đặt mặc định để giúp ngăn chặn loại tấn công này. 4 làm cho máy khách kiểm tra xem chứng chỉ máy chủ có hợp lệ không. 0 làm cho máy khách kiểm tra xem chứng chỉ máy chủ có hợp lệ không và cũng khiến máy khách kiểm tra xem tên máy chủ mà máy khách đang sử dụng có khớp với danh tính trong chứng chỉ máy chủ không. Để thực hiện một trong các cài đặt này, trước tiên bạn phải đảm bảo rằng chứng chỉ CA cho máy chủ có sẵn một cách đáng tin cậy cho tất cả các máy khách sử dụng nó trong môi trường của bạn, nếu không các vấn đề sẵn có sẽ dẫn đến. Vì lý do này, chúng không phải là cài đặt mặc định.Nỗ lực thiết lập kết nối không được mã hóa không thành công nếu biến hệ thống 5 được bật ở phía máy chủ để khiến máy chủ yêu cầu các kết nối được mã hóa. Xem cấu hình các kết nối được mã hóa là bắt buộc.Các tùy chọn sau đây ở phía máy khách xác định chứng chỉ và các tệp chính mà khách hàng sử dụng khi thiết lập các kết nối được mã hóa đến máy chủ. Chúng tương tự như các biến hệ thống 6, 8 và 9 được sử dụng ở phía máy chủ, nhưng 0 và 1 Xác định khóa công khai và riêng tư của máy khách:
Để có thêm bảo mật liên quan đến quy định của mã hóa mặc định, máy khách có thể cung cấp chứng chỉ CA khớp với máy chủ được sử dụng và kích hoạt xác minh nhận dạng tên máy chủ. Theo cách này, máy chủ và máy khách đặt niềm tin của họ vào cùng một chứng chỉ CA và máy khách xác minh rằng máy chủ mà nó kết nối là một dự định:
Ghi chú Xác minh nhận dạng tên máy chủ với 0 không hoạt động với các chứng chỉ tự ký được tạo tự động bởi máy chủ hoặc bằng cách sử dụng thủ công mysql_ssl_rsa_setup (xem Phần & NBSP; 6.3.3.1 Các chứng chỉ tự ký như vậy không chứa tên máy chủ là giá trị tên chung.mysql_ssl_rsa_setup (see Section 6.3.3.1, “Creating SSL and RSA Certificates and Keys using MySQL”). Such self-signed certificates
do not contain the server name as the Common Name value. Trước MySQL 5.7.23, xác minh nhận dạng tên máy chủ cũng không hoạt động với các chứng chỉ chỉ định tên chung bằng cách sử dụng ký tự đại diện vì tên đó được so sánh nguyên văn với tên máy chủ. MySQL cũng cung cấp các tùy chọn này cho điều khiển kết nối được mã hóa phía máy khách:
Tùy thuộc vào các yêu cầu mã hóa của tài khoản MySQL được khách hàng sử dụng, máy khách có thể được yêu cầu chỉ định một số tùy chọn nhất định để kết nối bằng mã hóa với máy chủ MySQL. Giả sử rằng bạn muốn kết nối bằng cách sử dụng một tài khoản không có yêu cầu mã hóa đặc biệt hoặc được tạo bằng cách sử dụng câu lệnh 6 bao gồm mệnh đề 7. Giả sử rằng máy chủ hỗ trợ các kết nối được mã hóa, máy khách có thể kết nối bằng cách sử dụng mã hóa không có tùy chọn 3 hoặc với tùy chọn 5 rõ ràng:
Hoặc:
Đối với một tài khoản được tạo với mệnh đề 7, nỗ lực kết nối không thành công nếu không thể thiết lập kết nối được mã hóa. Đối với một tài khoản không có yêu cầu mã hóa đặc biệt, nỗ lực rơi trở lại kết nối không được mã hóa nếu không thể thiết lập kết nối được mã hóa. Để ngăn chặn dự phòng và thất bại nếu không thể có được kết nối được mã hóa, hãy kết nối như thế này:
Nếu tài khoản có các yêu cầu bảo mật nghiêm ngặt hơn, các tùy chọn khác phải được chỉ định để thiết lập kết nối được mã hóa:
Để biết thêm thông tin về mệnh đề 9, xem Phần & NBSP; 13.7.1.2, Tạo câu lệnh của người dùng.Máy chủ MySQL có thể tạo chứng chỉ máy khách và các tệp chính mà máy khách có thể sử dụng để kết nối với các phiên bản MYSQL Server. Xem Phần & NBSP; 6.3.3, Tạo chứng chỉ SSL và RSA và khóa. Quan trọng Nếu máy khách kết nối với cá thể máy chủ MySQL sử dụng chứng chỉ SSL với tiện ích mở rộng 0 (tiện ích mở rộng X.509 V3), việc sử dụng khóa mở rộng phải bao gồm xác thực máy khách ( 1). Nếu Chứng chỉ SSL chỉ được chỉ định để xác thực máy chủ ( 2) và các mục đích chứng chỉ không phải là máy tính khác, xác minh chứng chỉ sẽ không thành công và kết nối máy khách với phiên bản máy chủ MySQL không thành công. Không có tiện ích mở rộng 0 trong các chứng chỉ SSL được tạo bởi máy chủ MySQL (như được mô tả trong Phần & NBSP; 6.3.3.1, Chứng chỉ SSL và RSA và các khóa sử dụng các chứng chỉ MYSQL) và các chứng chỉ SSL được tạo bằng lệnh OpenSSL theo hướng dẫn trong Phần & NBSP; 6.3 .3.2, Tạo các chứng chỉ và khóa SSL bằng cách sử dụng OpenSSL. Nếu bạn sử dụng chứng chỉ máy khách của riêng mình được tạo theo một cách khác, hãy đảm bảo bất kỳ tiện ích mở rộng 0 nào bao gồm xác thực máy khách.openssl command following the instructions in Section 6.3.3.2, “Creating SSL Certificates and Keys Using openssl”. If you use your own client certificate created in another way, ensure any 0 extension includes client
authentication. Để ngăn chặn việc sử dụng mã hóa và ghi đè các tùy chọn 5 khác, hãy gọi chương trình máy khách bằng 7:
Để xác định xem kết nối hiện tại với máy chủ có sử dụng mã hóa hay không, hãy kiểm tra giá trị phiên của biến trạng thái 7. Nếu giá trị trống, kết nối không được mã hóa. Mặt khác, kết nối được mã hóa và giá trị cho biết mật mã mã hóa. Ví dụ:
Đối với máy khách MySQL, một giải pháp thay thế là sử dụng lệnh 8 hoặc 9 và kiểm tra dòng 0:mysql client,
an alternative is to use the 8 or 9 command and check the 0 line:
Hoặc: 0Định cấu hình các kết nối được mã hóa là bắt buộcĐối với một số triển khai MySQL, có thể không chỉ mong muốn mà bắt buộc phải sử dụng các kết nối được mã hóa (ví dụ, để đáp ứng các yêu cầu quy định). Phần này thảo luận về cài đặt cấu hình cho phép bạn thực hiện việc này. Các cấp kiểm soát này có sẵn:
Để yêu cầu khách hàng kết nối bằng cách sử dụng các kết nối được mã hóa, bật biến hệ thống 5. Ví dụ: đặt các dòng này vào tệp máy chủ 0: 1Với 5 được bật, các kết nối máy khách đến máy chủ được yêu cầu sử dụng một số hình thức vận chuyển an toàn và máy chủ chỉ cho phép các kết nối TCP/IP sử dụng SSL hoặc kết nối sử dụng tệp ổ cắm (trên UNIX) hoặc bộ nhớ được chia sẻ (trên Windows) . Máy chủ từ chối các nỗ lực kết nối không phân biệt, không thành công với lỗi 4.Để gọi một chương trình máy khách sao cho nó yêu cầu kết nối được mã hóa cho dù máy chủ có yêu cầu mã hóa hay không, hãy sử dụng giá trị tùy chọn 3 là 6, 4 hoặc 0. Ví dụ: 2Để định cấu hình tài khoản MySQL chỉ có thể sử dụng được qua các kết nối được mã hóa, bao gồm mệnh đề 9 trong câu lệnh 6 tạo tài khoản, chỉ định trong mệnh đề đó, các đặc điểm mã hóa bạn yêu cầu. Ví dụ: để yêu cầu kết nối được mã hóa và sử dụng chứng chỉ X.509 hợp lệ, sử dụng 1: 3Để biết thêm thông tin về mệnh đề 9, xem Phần & NBSP; 13.7.1.2, Tạo câu lệnh của người dùng.Để sửa đổi các tài khoản hiện có không có yêu cầu mã hóa, hãy sử dụng câu lệnh 03. |