문제

방금 Stack Overflow에 대해 알아냈고 프로젝트에서 친구들과 함께 겪고 있는 제약 조건에 대한 아이디어가 있는지 확인하고 있습니다. 하지만 이것은 제가 찾으려고 노력해 온 이론적 질문에 가깝습니다. 한동안 대답.

저는 암호화에 대해 별로 관심이 없지만 충분히 명확하지 않은 경우 질문을 명확히 하기 위해 편집/댓글을 달겠습니다.

간략하게 설명하면 환경은 다음과 같습니다.

  • 암호화/해독 키에 대한 액세스인 프런트 엔드와 백엔드가 저장 및 쿼리에만 사용되는 애플리케이션입니다.

  • 예를 들어 몇 가지 필드에 액세스할 수 없는 데이터베이스가 있는 경우 평소처럼 text/varchar인 "주소"를 가정해 보겠습니다.

  • 정보를 해독하기 위한 키에 액세스할 수 없으며 모든 정보는 이미 암호화된 데이터베이스에 도착합니다.

주요 문제는 데이터베이스에서 일관되게 쿼리를 만드는 방법, "주소가 '%F§YU/'~#JKSks23%'와 같은 위치"와 같은 작업을 수행하는 것이 불가능하다는 것입니다.(이 질문에 대해 답변을 갖고 있는 사람이 있으면 자유롭게 촬영해 주세요.)

그런데 해도 괜찮을까? where address='±!NNsj3~^º-:'?아니면 데이터베이스도 완전히 소모하게 될까요?

적용할 수 있는 또 다른 제약은 프런트 엔드에 사용 가능한 처리 능력이 많지 않기 때문에 이미 정보 암호화/암호 해독으로 인해 정보가 한계에 도달하기 시작한다는 것입니다.(이렇게 말하면 "테이블 조인을 프런트 엔드로 내보내고 거기에서 쿼리합니다."와 같은 응답을 피하기 위한 것입니다.)

누군가 나에게 그것에 대해 계속 생각할 수 있는 방향을 알려줄 수 있습니까?


오전 4시에 빠른 답변을 주셔서 감사합니다. 처음으로 이 커뮤니티에 깊은 인상을 받았습니다.(아니면 시간대가 다르기 때문일 수도 있습니다)

몇 가지 정보만 제공하면 됩니다.

주요 문제는 부분 일치와 관련된 것입니다.대부분의 데이터베이스에서 필수 요구 사항은 부분 일치를 허용하는 것입니다.실제로 가장 큰 제약은 데이터베이스 소유자는 데이터베이스 내부에서 정보를 볼 수 없습니다..지난 10분 동안 나는 가능한 데이터베이스 문제로 다시 확장되는 가능한 솔루션을 생각해 냈습니다. 이에 대해 여기에 추가하겠습니다.

부분 부분 일치를 허용하는 가능한 솔루션:

  • 비밀번호 + 사용자의 공개 필드 두 개가 실제로 암호화를 위한 키입니다.인증의 경우 정적 값을 암호화하여 데이터베이스 내에서 비교하는 것이 아이디어입니다.
  • 정보가 구문 분석된 방식으로 저장되는 새로운 테이블 세트를 생성합니다. 즉, 다음과 같습니다."4번가"는 2개의 암호화된 행이 됩니다('4번가'에 대해 하나, '거리'에 대해 하나).검색이 이미 별도의 테이블에서 수행될 수 있으므로 이는 이미 부분 부분 일치를 허용합니다.

새로운 질문:

  • 이것이 데이터베이스 서버를 다시 차지하게 될까요, 아니면 부분 일치 문제에 대한 실행 가능한 솔루션이라고 생각하는 사람이 있습니까?

포스트 스크립트:나는 추가 토론과 특히 새로운 질문에 대한 가능한 답변을 허용하기 위해 Cade Roux의 답변을 수락하지 않았습니다.

도움이 되었습니까?

해결책

해시를 효과적으로 쿼리하는 방식으로 수행 할 수 있지만 해당 요구 사항이 많은 시스템은 많지 않습니다.이 시점에서 보안 요구 사항은 시스템을 사용할 수 있도록 다른 요구 사항을 방해하기 때문입니다. 즉, 부분적 일치가 없습니다. 암호화는 그것을 배제합니다. 압축과 같은 문제입니다. 몇 년 전, 매우 작은 환경에서 데이터 형식에 넣기 전에 데이터를 압축해야했습니다. 물론, 그 분야는 쉽게 검색 할 수 없었습니다.

보다 일반적인 응용 프로그램에서 궁극적으로 키는 체인의 누군가 (아마도 웹 서버)에게 사용할 수 있습니다.

최종 사용자 트래픽의 경우 SSL은 해당 파이프를 보호합니다. 일부 네트워크 스위치는 웹 서버와 데이터베이스간에이를 보호 할 수 있으며 데이터베이스에 암호화 된 데이터를 저장하는 것은 괜찮지 만 암호화 된 데이터를 쿼리하지는 않습니다.

그리고 데이터가 표시되면 기계에 표시되므로 해당 시점에서 모든 범용 컴퓨팅 장치를 우회 할 수 있으며 응용 프로그램 외부에 주변 방어가 실제로 작동하는 주변 방어 기능이 있습니다.

다른 팁

데이터베이스 테이블을 보관하는 디스크를 암호화하고, 데이터베이스 연결을 암호화하고, 데이터베이스가 정상적으로 작동하도록 놔두는 것은 어떨까요?

[이 정도 수준의 편집증을 요구하는 맥락/제약 조건을 실제로 이해하지 못합니다.]

편집하다:"법적 제약" 응?당신이 불법적인 일에 연루되지 않기를 바랍니다. 부주의한 액세서리가 되는 것은 싫습니다...;-)

만약 - 에헴 - 법적 제약이 - 이 솔루션을 강제한다면, 그게 전부입니다. LIKE 일치가 없고 클라이언트 시스템이 이를 처리할 수 없으면 응답이 느려집니다.

몇 달 전에 나는 같은 문제를 발견했습니다. 전체 데이터베이스 (인덱스 제외)가 암호화되고 부분 일치의 문제가 제기되었습니다.

솔루션을 찾고 인터넷을 검색했지만 이에 대해 할 일이 많지 않고 "해결 방법"이있는 것 같습니다.

내가 마지막으로 채택한 솔루션은 다음과 같습니다.

  1. 쿼리가 수행되는 필드의 데이터와 함께 임시 테이블을 작성하고, 해독 처리되고 테이블의 주요 키 인 다른 필드 (분명히이 필드는 일반 텍스트와 같이 해독 될 필요는 없습니다).

  2. 임시 테이블이있는 부분 일치를 다시 수행하고 식별자를 검색하십시오.

  3. 해당 식별자의 실제 테이블을 쿼리하고 결과를 반환하십시오.

  4. 임시 테이블을 떨어 뜨립니다.

나는 이것이 사소한 오버 헤드를 가정하지만 데이터베이스가 완전히 암호화되어야한다는 것이 필수 일 때이 작업을 수행하는 다른 방법을 찾지 못했습니다.

각각의 특정 사례에 따라 결과에 대한 데이터를 잃지 않고 임시 테이블에 삽입 된 라인 수를 필터링 할 수 있습니다 (쿼리를 수행하는 사용자에게 속한 행만 고려하십시오 ...). .

MD5 해싱을 사용하고 싶습니다. 기본적으로, 그것은 당신의 줄을 가져 와서 그것을 재현 할 수없는 해시로 바꿉니다. 그런 다음 나중에 사물에 대해 검증하기 위해 사용할 수 있습니다. 예를 들어:

$salt = "123-=asd";
$address = "3412 g ave";

$sql = "INSERT INTO addresses (address) VALUES ('" . md5($salt . $address) . "')";
mysql_query($sql);

그런 다음 향후 주소를 검증하려면 다음과 같습니다.

$salt = "123-=asd";
$address = "3412 g ave";

$sql = "SELECT address FROM addresses WHERE address = '" . md5($salt . $address) . "'";
$res = mysql_query($sql);
if (mysql_fetch_row($res))
    // exists
else
    // does not

이제 데이터베이스 측면에서 암호화되어 있으므로 소스 코드를 살펴 보더라도 아무도 찾을 수 없습니다. 그러나 소금을 찾으면 소금이 해독하는 데 도움이됩니다.

http://en.wikipedia.org/wiki/md5

나중에 쿼리하려는 민감한 데이터를 저장해야 하는 경우 일반 텍스트로 저장하여 해당 테이블에 대한 액세스를 최대한 제한하는 것이 좋습니다.

그렇게 할 수 없고 프런트 엔드에서 오버헤드를 원하지 않는 경우 서버에서 실행되어 암호화된 데이터를 처리하는 구성 요소를 백 엔드에 만들 수 있습니다.

암호화된 데이터에 쿼리를 하시나요?좋은 암호화 알고리즘을 사용하고 있다면 어떻게 해야 할지 상상할 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top