2010-07-15 22 views
9

Thông tin cơ bản:

Tôi là một phần của một ứng dụng web lưu trữ và truy xuất dữ liệu HIPAA (y tế). Gần đây, các nguyên tắc HIPAA đã được cập nhật để bao gồm một chính sách yêu cầu tất cả thông tin nhận dạng khách hàng phải được mã hóa khi nó "nghỉ ngơi" (được lưu trữ trong cơ sở dữ liệu và không được truy cập).Quá tải một hàm PHP gốc để mã hóa dữ liệu cho tuân thủ HIPAA

Vấn đề ban đầu

Vấn đề đầu tiên chúng tôi phải giải quyết được xác định cách tốt nhất để hai chiều mã hóa dữ liệu trong một cách mà làm cho dữ liệu an toàn trong trường hợp vi phạm.

Giải pháp ban đầu

Giải pháp nhanh nhất, chúng tôi đã đưa ra là sử dụng mcrypt để mã hóa dữ liệu trước khi chúng tôi đưa nó vào cơ sở dữ liệu.

The New Vấn đề

Việc áp dụng chúng tôi đang phát triển là khá cũ (như các ứng dụng web đi) và sử dụng rất nhiều lập trình thủ tục cũng như phụ thuộc quá nhiều vào mysql_query chức năng để chèn, cập nhật, tải về, và xóa dữ liệu. Chúng tôi không có thời gian hoặc sự dịch sang trọng để dịch mã của chúng tôi thành lớp trừu tượng hóa cơ sở dữ liệu. Vì vậy, cách duy nhất để triển khai hệ thống mã hóa/giải mã này là chỉnh sửa thủ công tất cả các truy vấn CRUD để sử dụng dữ liệu đã được mã hóa qua mcrypt. Điều này là rất không hiệu quả và cực kỳ dễ bị lỗi.

đề xuất giải pháp

Chúng tôi quyết định rằng cách nhanh nhất và hiệu quả nhất để giải quyết vấn đề của chúng tôi là để ghi đè lên bản địa mysql_query chức năng với một phân chia một cách riêng của chúng tôi của chúng tôi. Trong hàm mới của chúng ta, chúng ta sẽ mã hóa/giải mã các giá trị dữ liệu trước khi gửi truy vấn đến máy chủ/trả về kết quả.

đâu Bạn Folks Come In

  1. Đây có phải là giải pháp tốt nhất để giải quyết vấn đề ban đầu của chúng tôi?
  2. Bạn làm cách nào để ghi đè lên một hàm PHP cốt lõi hiện có?
+0

Vì vậy, vấn đề là mã hóa dữ liệu trong khi nó được chuyển sang máy chủ DB? Hoặc lưu trữ nó trong một thời trang được mã hóa? –

+0

Để lưu trữ nó theo kiểu mã hóa và sau đó dễ dàng truy xuất, giải mã và hiển thị nó khi cần thiết. –

+0

Tôi nghĩ bạn có thể làm điều này ở lớp sai. Bạn có xem xét mã hóa toàn bộ cơ sở dữ liệu MySQL không? Một số giải pháp cho điều này được thảo luận trong [câu hỏi này] (http://stackoverflow.com/questions/143750/mysql-and-data-file-encryption). –

Trả lời

3

Mặc dù trước đây bạn đã tuyên bố rằng bạn không thể/không dịch mã của mình thành lớp trừu tượng cơ sở dữ liệu, tôi tin đó sẽ là giải pháp lý tưởng. Chắc chắn, đó là rất nhiều công việc ngay bây giờ, nhưng nó trả hết. Những gì bạn đã đề xuất là một hack, mà có thể (và có lẽ sẽ) dẫn đến lỗi và đau đầu trong tương lai.

Điều tốt nhất tiếp theo sẽ là mã hóa toàn bộ cơ sở dữ liệu, như được đề xuất trong các nhận xét. Có các giải pháp cho việc mã hóa trong suốt ở các mức khác nhau, ví dụ: this hoặc this

Một điều khác mà bạn có thể muốn xem là các hàm gốc của mã encryption and decryption của MySQL, có thể được sử dụng để thực hiện mã hóa cấp cột nếu bạn quan tâm về hiệu suất.

+0

@Aircule Được rồi, loại giải quyết một vấn đề: Mã hóa dữ liệu khi nó đi vào DB. Chúng tôi có thể sử dụng trình kích hoạt để mã hóa dữ liệu trước khi chèn hoặc cập nhật. Tuy nhiên, những gì về thu hồi dữ liệu? –

+0

@Levi Bạn không thể giải mã nó khi truy xuất? – quantumSoup

+0

@Aircule, vâng, chúng tôi có thể nhưng chúng tôi phải gọi hàm giải mã của chúng tôi theo cách thủ công trước khi in dữ liệu cho mọi truy vấn và có hàng nghìn truy vấn được mã hóa cứng. –

0

Bạn có thể mã hóa ở cấp hệ thống tệp và để hệ điều hành xử lý nó. Nếu bạn muốn xử lý nó ở cấp độ PHP, hãy mở rộng, đừng ghi đè lên.

function mysqle_query() { 
    // Do some stuff 
    // like replace fieldnames with AES_ENCRYPT(fieldname) on insert and delete 
    // and replace fieldnames with AES_DECRYPT(fieldname) on select 
    mysql_query(); 
} 
2

Trong khi giải pháp tốt nhất sẽ là lớp trừu tượng rằng câu trả lời khác đã gợi ý, bạn có thể ghi đè lên các chức năng PHP hiện với các phiên bản của riêng bạn với Something PECL Runkit extension

như:

runkit_function_rename ('mysql_query', 'mysql_query_old'); 
function mysql_query ($query , $link_identifier=null) { 
    // modify $query here for UPDATE/DELETE statement and any WHERE clause, etc 
    $newQuery = modifyQuery($query); 

    if (is_null($link_identifier)) { 
     $result = mysql_query_old ($newQuery); 
    } else { 
     $result = mysql_query_old ($newQuery, $link_identifier); 
    } 
    // modify $result here for returned data from any SELECT statement 
    return modifyResult($result); 
} 

Lưu ý: Theo mặc định, chỉ có các không gian người dùng có thể bị xóa, đổi tên hoặc sửa đổi. Để ghi đè chức năng nội bộ, bạn phải bật cài đặt runkit.internal_override trong php.ini.

Đó không phải là giải pháp tôi thực sự khuyên bạn nên. Tôi đã phải làm một cái gì đó tương tự như một số năm trở lại trong java, nơi nó đã được dễ dàng hơn để mở rộng jdbc; nhưng trong khi phân tích cú pháp cú pháp của các truy vấn SQL là đủ khó, nó sẽ khó hơn nếu các truy vấn của bạn đang sử dụng các biến liên kết. Xem ra cho chuỗi thoát! Xem ra cho bất kỳ sử dụng chức năng liên quan như mysql_db_query, chỉ trong trường hợp chúng được sử dụng cùng với mysql_query trong ứng dụng!

Lời xin lỗi khi gõ văn bản. Vợ tôi đã nảy router của chúng tôi một vài lần trong khi I'be đã viết đề nghị này

+0

Bộ định tuyến của bạn phải làm gì với bàn phím? – blockhead

+0

Mỗi khi cô ấy làm như vậy, nó mang lại cho tôi những jitters –

1

Tôi nghĩ rằng một trong những cách xử lý này sẽ tự động sẽ được xem xét MySQL proxy

và thực hiện mã hóa thông qua đó. Tôi đã chơi xung quanh với nó cách đây 2 hoặc nhiều năm khi nó đang ở giai đoạn rất sớm, và từ những gì tôi nhớ nó về cơ bản có thể chặn các yêu cầu và làm 'công cụ' với họ :) Không cần thay đổi mã. Hy vọng điều này sẽ hữu ích.

1

Có các giải pháp thương mại có sẵn để trợ giúp với dữ liệu khi mã hóa còn lại. Bạn có thể kiểm tra Gazzang hoặc Packet General. Cả hai đều cung cấp mã hóa MySQL để giúp tuân thủ HIPPA. Good Luck

0

Tôi thực sự nghĩ rằng bạn đang xem xét điều này từ góc độ sai. Đây không phải là vấn đề cần được các nhà phát triển giải quyết thông qua việc mã hóa/giải mã dữ liệu khi bạn lưu trữ và truy xuất dữ liệu từ cơ sở dữ liệu - sử dụng giải pháp cơ sở hạ tầng.

Xem xét mã hóa toàn bộ phần cứng hoặc phần mềm, mã hóa cơ sở dữ liệu thông qua chức năng mã hóa dữ liệu trong suốt của RDBMS (nếu RDBMS cụ thể có) hoặc thông qua hệ điều hành.

Xem this document from NIST

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