2008-10-26 70 views
11

Nói mỗi hàng trong một bảng có dữ liệu liên quan đến một người dùng cụ thể. Người dùng có mật khẩu để truy cập vào hệ thống.Các cột được mã hóa MySQL

Làm cách nào để mã hóa cột dữ liệu bằng InnoDB sao cho không ai khác ngoài dữ liệu người dùng có thể đọc dữ liệu? Tôi đã suy nghĩ về một cái gì đó giống như sử dụng một trong các chức năng mã hóa MySQL (nói AES) với một khóa dựa trên một băm tính từ mật khẩu của người dùng.

Có ai có bất kỳ gợi ý nào về cách tôi có thể thực hiện việc này không? Có phải tôi đang trên đường ray bên phải không ?

Một trong những câu trả lời dưới đây

Vấn đề sửa đổi mật khẩu của người sử dụng liên quan đến việc tái mã hóa khóa sử dụng bằng mật khẩu mới mà là nhiều hơn nữa thẳng về phía trước hơn tái mã hóa toàn bộ loạt các dữ liệu của người dùng có thể tùy ý lớn. Khóa người dùng vẫn giữ nguyên trên toàn bộ dữ liệu người dùng trong hệ thống.

Điều này giúp ích như thế nào? Nói mật khẩu là pass1. Và có một loạt các bản ghi được mã hóa với một khóa được tạo ra từ điều này. Nếu người dùng đặt lại mật khẩu để pass2, tôi không có cách nào giải mã dữ liệu đã được mã hóa bằng pass1. Trong trường hợp người dùng quên hoàn toàn mật khẩu, tất cả dữ liệu mã hóa của anh ta sẽ bị mất.

+0

Tôi không liên quan đến tình huống cụ thể của bạn, nhưng tôi thấy bài viết này hữu ích khi giới thiệu kỹ hơn về các vấn đề liên quan: http://i.amniels.com/mysql-database-encryption-using-public-private-keys –

Trả lời

8

Tôi không biết liệu có nhiều ý nghĩa trong việc mã hóa dữ liệu bằng mật khẩu của người dùng, đặc biệt là nếu bạn giữ chính băm trong cơ sở dữ liệu. Trong trường hợp đó, bất kỳ ai có thể truy cập dữ liệu được mã hóa cũng có thể truy cập vào mật khẩu băm và giải mã dữ liệu.

Một cách tiếp cận khác là mã hóa dữ liệu bằng khóa dành riêng cho ứng dụng với một số dữ liệu người dùng cụ thể. Tuy nhiên, sau đó bạn phải đối mặt với một vấn đề khác: làm thế nào để lưu trữ khóa ứng dụng một cách an toàn. Đối với câu hỏi đó tôi không biết câu trả lời dễ dàng, nhưng việc giữ nó trong mã nguồn của bạn có thể đủ tốt nếu bạn sợ rằng dữ liệu cơ sở dữ liệu của bạn có thể bị xâm nhập, nhưng không phải mã nguồn, ví dụ: nếu cơ sở dữ liệu của bạn được lưu trữ ngoài trang web (nghĩ Amazon S3).

Việc tạm dừng khóa ứng dụng bằng mật khẩu của người dùng sẽ giúp bạn chỉ giữ mật khẩu trong cơ sở dữ liệu, nhưng có thể giới thiệu một lỗ hổng bảo mật khác: bạn phải giữ mật khẩu của người dùng trong văn bản rõ ràng trong phiên ứng dụng.

Đối với giải pháp kỹ thuật, nó khá đơn giản và sample code is available. Bạn có thể sửa đổi nó như sau để mã hóa dữ liệu với mật khẩu ứng dụng muối với hash mật khẩu:

INSERT INTO secure_table VALUES (
    1, 
    AES_ENCRYPT(
    'plain text data', 
    CONCAT(@application_password, @user_password)) 
); 

Trong mọi trường hợp bạn sẽ phải lưu trữ mật khẩu ứng dụng của bạn ở đâu đó vì vậy tôi không nghĩ rằng có một cách tiếp cận dễ dàng cung cấp bảo mật hoàn hảo.

Một cách tiếp cận khác mà tôi có thể nghĩ là hỏi người dùng mã PIN ngắn mà bạn có thể sử dụng làm khóa mã hóa. Mã PIN sẽ không được lưu trữ trong cơ sở dữ liệu, nhưng bạn sẽ cần phải yêu cầu người dùng cho nó mỗi khi bạn truy cập dữ liệu của họ.

Và tất nhiên bạn phải nghĩ đến tính khả thi của mã hóa. Bạn sẽ không thể lập chỉ mục hoặc tìm kiếm nó mà không cần giải mã. Nó có thể là cần thiết cho một tập hợp dữ liệu hạn chế (ví dụ như số thẻ tín dụng), nhưng tôi sẽ không đi xa với nó.

0

Tôi không nghĩ đó là cách tiếp cận tốt nhất, trừ khi bạn thực thi người dùng đó không bao giờ có thể thay đổi mật khẩu hoặc bạn có cách mã hóa lại mọi thứ mỗi khi người dùng thay đổi mật khẩu của họ.

0

Bạn có thể lưu trữ một khóa khác để mã hóa/giải mã dữ liệu cụ thể của người dùng có thể được tạo khi người dùng mới được tạo. Hãy gọi khóa người dùng chính mới này. Khóa người dùng này cũng phải được mã hóa trong cơ sở dữ liệu và cách tiếp cận trực tiếp nhất là mã hóa nó bằng mật khẩu của người dùng hoặc bất kỳ dữ liệu nào khác có mật khẩu (chẳng hạn như mật khẩu và thời gian tạo/sửa đổi, v.v.).

Tôi sẽ giữ phiên của người dùng khóa người dùng đã được giải mã để truy cập dữ liệu của người dùng vào bất kỳ thời điểm mong muốn nào trong phiên.

Vấn đề sửa đổi mật khẩu của người dùng liên quan đến việc mã hóa lại khóa người dùng bằng mật khẩu mới nhanh hơn việc mã hóa lại toàn bộ dữ liệu của người dùng có thể tùy ý lớn. Khóa người dùng vẫn giữ nguyên trên toàn bộ dữ liệu người dùng trong hệ thống.

Tất nhiên, phương pháp này chỉ có thể được sử dụng nếu xác thực được thực hiện bằng cách gửi mật khẩu người dùng thực đến máy chủ lúc đăng nhập, vì cơ sở dữ liệu chỉ chứa băm mật khẩu.

0

Giả sử mật khẩu là pass1. Và có một loạt các bản ghi được mã hóa với một khóa được tạo ra từ điều này. Nếu người dùng hiện nay reset mật khẩu để pass2, tôi không có cách nào giải mã các dữ liệu đã được mã hóa bằng pass1

Mấu chốt sẽ cần phải được mã hóa một cách đảo ngược, do đó nó có thể được giải mã sử dụng pass1 và được mã hóa lại bằng pass2.

Để tóm tắt:

lưu trữ trong cơ sở dữ liệu là: Ai là chiều mã hóa mật khẩu (đối với kiểm tra mật khẩu), khóa mã hóa cho dữ liệu khác, thuận nghịch được mã hóa bằng cách sử dụng mật khẩu rõ ràng (hoặc tại bất kỳ tỷ lệ, các mật khẩu được mã hóa theo một cách khác với cách nó được lưu trữ trong cơ sở dữ liệu) và các dữ liệu khác, được mã hóa ngược bằng cách sử dụng khóa mã hóa rõ ràng.

Bất cứ khi nào bạn cần dữ liệu khác, bạn phải có mật khẩu rõ ràng (hoặc được mã hóa khác như được lưu trữ trong cơ sở dữ liệu), đọc khóa mã hóa, giải mã bằng mật khẩu và sử dụng để giải mã dữ liệu khác.

Khi mật khẩu được thay đổi, khóa mã hóa được giải mã bằng mật khẩu cũ, được mã hóa bằng mật khẩu mới và được lưu trữ.

2

Để làm rõ một trong các câu trả lời được đề cập trong câu hỏi: "khóa người dùng/ứng dụng" là khóa cá nhân được tạo ngẫu nhiên, được sử dụng để mã hóa dữ liệu. Khóa cá nhân không bao giờ thay đổi (trừ khi nó bị xâm phạm). Bạn mã hóa và lưu trữ khóa riêng bằng mật khẩu. Vì khóa riêng nhỏ hơn nhiều so với dữ liệu, nên thay đổi mật khẩu rẻ hơn nhiều: bạn chỉ cần giải mã khoá riêng với mật khẩu cũ và mã hóa lại mật khẩu bằng mật khẩu mới.

0

Nếu bạn cần truy cập dữ liệu mà không cần tương tác của người dùng (ví dụ di chuyển cơ sở dữ liệu), bạn sẽ không có chìa khóa để giải mã.

1

Đối với dữ liệu không dành riêng cho người dùng (toàn cầu), bạn có thể sử dụng kết hợp mật mã đối xứng và không đối xứng.Bạn có thể có trường extra password mà tất cả người dùng được yêu cầu nhập để ngay cả khi một người dùng thay đổi mật khẩu của mình, dữ liệu chung sẽ vẫn có thể sử dụng được cho những người dùng khác có mật khẩu khác.

extra password có thể được bitwise xor'ed bằng một mã khác salt-like string bên trong mã nguồn. Cùng với nhau, nó có thể tạo ra passkey đối xứng để giải mã private key được lưu trữ trong cơ sở dữ liệu (mà sẽ không bao giờ thay đổi). Sau private key được giải mã bằng cách sử dụng extra password, khóa riêng có thể giải mã và read tất cả dữ liệu trong db. Khóa riêng có thể được lưu dưới dạng biến phiên.

public key, như tên cho thấy, có thể nằm dưới dạng chuỗi văn bản thuần trong db. Khi bạn cần write đến db, hãy sử dụng khóa công khai để mã hóa dữ liệu.

Bạn có thể thường xuyên cung cấp cho người dùng một extra password mới và mã hóa lại số private key tĩnh, tiếp theo là xor'ing với salt-like string.

Nếu dữ liệu là dữ liệu người dùng cụ thể và không có nghĩa là cho người dùng khác, bạn có thể sử dụng mật khẩu của người dùng mà không có trường mật khẩu bổ sung để mã hóa khóa cá nhân. Quản trị viên có thể có một bản sao của khóa riêng cho người dùng cụ thể, có thể được giải mã bằng mật khẩu của mình.

Các vấn đề liên quan