2010-07-15 3 views
9

배경 정보에 대한 데이터를 암호화하는 네이티브 PHP 함수를 오버로드 :

내가 (의료) 데이터 HIPAA를 검색 저장하고 웹 응용 프로그램을 실행 개발자의 한 팀의 일원입니다. 최근 HIPAA 가이드 라인은 "휴식 중"(데이터베이스에 저장되어 있고 액세스되지 않은) 모든 클라이언트 정보를 암호화해야한다는 정책을 포함하도록 업데이트되었습니다.는 HIPAA 준수

우리는 위반의 경우에 보안 데이터를 만드는 방식으로 데이터를 암호화 양방향으로 최선의 방법을 결정하고 해결하기 위해 한 첫 번째 문제 초기 문제.

초기 솔루션

우리가 해낸 가장 빠른 해결책은 우리가 데이터베이스에 삽입 하기 전에 데이터를 암호화하는 mcrypt를 사용하는 것이 었습니다.

새로운 문제

우리가 개발하는 애플리케이션은, (웹 응용 프로그램을 이동로) 아주 오래되어 검색, 삽입, 업데이트하기 위해 mysql_query 기능에 대한 의존도뿐만 아니라 절차 적 프로그래밍을 많이 사용하고, 데이터를 삭제하십시오. 우리는 코드를 데이터베이스 추상화 계층으로 변환하는 시간이나 고급 스러움이 없습니다. 따라서이 암호화/암호 해독 시스템을 구현하는 유일한 방법은 수동으로 모든 CRUD 쿼리를 편집하여 mcrypt을 통해 암호화 된 데이터를 사용하는 것입니다. 이는 매우 비효율적이며 오류가 발생하기 쉽습니다.

우리의 솔루션

제안 우리는 우리의 문제를 해결하는 가장 빠르고 가장 효과적인 방법은 우리 자신의 고안 중 하나를 사용하여 기본 mysql_query 기능을 덮어 쓸 것을 결정했다. 새로운 함수에서는 서버에 쿼리를 보내거나 결과 집합을 반환하기 전에 데이터 값을 암호화/해독합니다. 당신 밥상이

  1. 에 와서

    이 우리의 초기 문제를 해결하는 가장 좋은 방법인가?

  2. 기존의 핵심 PHP 기능을 어떻게 덮어 쓰시겠습니까?
+0

데이터가 DB 서버로 전송되는 동안 데이터를 암호화하는 것이 문제가됩니까? 아니면 암호화 된 방식으로 저장 하시겠습니까? –

+0

암호화 된 방식으로 저장 한 다음 필요한 경우 쉽게 검색하고 해독하고 표시 할 수 있습니다. –

+0

잘못된 레이어에서이 작업을 수행했을 수 있습니다. 전체 MySQL 데이터베이스를 암호화하는 것을 고려 했습니까? 이것에 대한 몇 가지 해결책은 [이 질문에 설명되어 있습니다 (http://stackoverflow.com/questions/143750/mysql-and-data-file-encryption). –

답변

3

이전에 코드를 데이터베이스 추상화 계층으로 변환 할 수 없거나 변환하지 않을 것이라고 언급했지만 이상적인 솔루션이라고 생각합니다. 물론, 지금 당장 더 많은 일이 있지만, 그만한 돈이됩니다. 당신이 제안한 것은 해킹입니다. 미래에 오류와 두통을 일으킬 수 있습니다.

다음 가장 좋은 것은 의견에서 제안 된대로 전체 데이터베이스를 암호화하는 것입니다. 솔루션 즉, 서로 다른 수준에서 투명 암호화를 위해 거기 밖으로 : this 또는 this

당신이 보길 원하는 것일 수도 또 다른 것은 당신이 염려되는 경우 열 수준의 암호화를 구현하는 데 사용할 수있는 MySQL의의 기본 encryption and decryption 기능입니다 성능에 대해.

+0

@Aircule 그래, 그런 종류의 문제를 해결합니다 : 데이터가 DB로 들어갈 때 데이터 암호화. 삽입 또는 업데이트하기 전에 트리거를 사용하여 데이터를 암호화 할 수 있습니다. 그러나 데이터 검색은 어떻게됩니까? –

+0

@Levi 검색시 해독 할 수 없습니까? – quantumSoup

+0

@Aircule, 그렇습니다.하지만 모든 쿼리에 대해 데이터를 인쇄하기 전에 수동으로 암호 해독 함수를 호출해야하며 수천 개의 하드 코딩 된 쿼리가 있습니다. –

0

파일 시스템 수준에서 암호화하고 OS가 처리하도록 할 수 있습니다. PHP 수준에서 처리하고 확장하려면 덮어 쓰지 마십시오.

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

가장 좋은 방법은 다른 답변이 제안하는 추상화 계층이 될 것이지만, 당신이 좋아하는 PECL Runkit extension

뭔가 자신 만의 버전으로 PHP 함수를 기존 재정의 할 수

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); 
} 

참고 : 기본적으로 사용자 공간 만 제거하거나 이름을 변경하거나 기능을 수정할 수 있습니다. 내부 기능을 무시하려면 을 runkit.internal_override 설정 php.ini에서 사용하도록 설정해야합니다.

정말 추천하는 해결책은 아닙니다. 나는 자바에서 몇 년 전에 유사한 것을해야했다. jdbc를 확장하는 것이 훨씬 쉬웠다. 그러나 SQL 쿼리의 구문 구문 분석은 어렵지만 쿼리가 바인드 변수를 사용하는 경우 여전히 어려워집니다. 이스케이프 된 문자열 조심해! 애플리케이션 내에서 mysql_query와 함께 사용되는 경우를 대비하여 mysql_db_query와 같은 관련 함수의 사용에주의하십시오!

불안한 타이핑에 사과드립니다. I'be이 제안

+0

라우터는 키보드와 어떤 관련이 있습니까? – blockhead

+0

그녀가 그렇게 할 때마다, 그것은 나에게 불안감을 준다. –

1

을 쓰고있는 동안 내 아내는 내가 MySQL proxy

로보고 그 통해 암호화를 구현하는 것이이 작업을 자동으로 처리 한 가지 방법을 생각 몇 번 우리의 라우터를 수신 거부하고있다. 나는 2 ~ 3 년 전에 매우 초기 단계에 있었고, 기본적으로 요청을 가로 챌 수 있고 그들과 함께 할 수 있다고 생각했다. 잘하면이 도움이됩니다.

1

암호화 된 데이터를 도울 수있는 상용 솔루션이 있습니다. Gazzang 또는 Packet General을 체크 아웃 할 수 있습니다. 두 제품 모두 HIPPA 준수에 도움이되는 MySQL 암호화를 제공합니다. 행운을 빌어 요.

0

나는 당신이 틀린 관점에서 이것을보고 있다고 생각합니다. 데이터베이스에서 저장 및 검색 할 때 데이터 암호화/해독을 통해 개발자가 해결할 수있는 문제는 아닙니다. 인프라 솔루션을 사용하십시오.

하드웨어 또는 소프트웨어 전체 디스크 암호화, RDBMS의 투명 데이터 암호화 기능 (특정 RDBMS에있는 경우) 또는 OS를 통한 데이터베이스 자체의 암호화를 고려하십시오.

this document from NIST