면접관: 암호화된 데이터에 대해 퍼지 쿼리를 수행하는 방법을 알려주세요.

 
  
 
  
您好,我是路人,更多优质文章见个人博客:http://itsoku.com

텍스트

우리는 암호화된 데이터가 퍼지 쿼리에 그다지 적합하지 않다는 것을 알고 있습니다. 이 기사에서는 모든 사람에게 영감을 주기 위해 암호화된 데이터에 대한 퍼지 쿼리 구현에 대해 설명합니다.

데이터 보안을 위해 개발 과정에서 중요한 데이터를 암호화하여 저장하는 경우가 많습니다. 일반적인 데이터에는 비밀번호, 휴대폰 번호, 전화번호, 세부 주소, 은행 카드 번호, 신용 카드 인증 코드 및 기타 정보가 포함됩니다. 이러한 정보에는 암호화 및 저장이 필요합니다. 복호화. 다릅니다. 예를 들어 비밀번호를 암호화하고 저장해야 합니다. 일반적으로 되돌릴 수 없는 느린 hash알고리즘이 사용됩니다. 느린 hash알고리즘은 무차별 대입 크래킹(일반적으로 보안을 위해 시간을 교환함)을 피할 수 있습니다. 검색할 때 복호화나 퍼지 검색이 필요하지 않습니다. 암호문을 직접 사용하여 정확히 일치하지만 휴대폰 번호로는 이를 수행할 수 없습니다. 휴대폰 번호의 원본 정보를 확인해야 하고 휴대폰 번호에 대한 퍼지 검색도 지원해야 하므로 퍼지 쿼리를 지원하겠습니다. 현재 가역적인 암호화 및 복호화 데이터를 위해 어떤 구현이 가능한지 알아보세요.

무심코 인터넷을 검색해 보니 "암호화 후 퍼지 쿼리"에 대한 게시물이 많이 있는데 이러한 관행에 대한 구현 아이디어와 장단점이 이야기되어 있습니다.

암호화된 데이터에 대해 퍼지 쿼리를 수행하는 방법

암호화된 데이터의 퍼지 쿼리를 다음과 같이 세 가지 범주로 분류했습니다.

  • 모래 조각 방법 (성인의 생각을 생각하지 말고 기능만 깨닫고 문제에 대해 깊이 생각하지 마십시오)

  • 기존 관행(쿼리 성능 문제를 고려하고 성능을 위해 일부 저장 공간을 사용하는 등)

  • Super God 접근 방식(알고리즘 수준에서 생각하는 보다 고급 접근 방식)

이 세 가지 구현 방법의 구현 아이디어와 장단점을 하나씩 이야기해 보겠습니다.먼저 모래 조각 방법을 살펴보겠습니다.

모래조각실습

  • 복호화를 위해 모든 데이터를 메모리에 로드하고, 복호화 후 퍼지 매칭을 위해 프로그램 알고리즘을 사용합니다.

  • 암호문 데이터를 일반적으로 tag테이블이라고 하는 일반 텍스트 매핑 테이블에 매핑한 다음 퍼지 쿼리를 통해 tag암호문 데이터를 연결합니다.

모래 조각 하나

복호화를 위해 모든 데이터를 메모리에 로드하는 첫 번째 접근 방식을 살펴보겠습니다. 데이터의 양이 적다면 이 방법을 사용할 수 있습니다. 간단하고 저렴합니다. 데이터의 양이 많을 경우, 재앙이겠군요 대략적인 계산을 해보겠습니다.

영문자(대소문자 구분 없음)는 1바이트, 한자는 2바이트를 차지하며, 예를 DES들어 13800138000암호화된 문자열은 바이트를 HE9T75xNx6c5yLmS5l4r6Q==차지합니다 24.

줄 수 바이트 MB
100와트 2400만 22.89
1000와트 2억 4천만 228.89
100000000 24억 2288.89

가벼우면 수백 메가바이트, 무거우면 기가바이트가 될 수 있는데, 이렇게 하면 응용 프로그램을 단 몇 분 만에 통합할 수 있다 Out of memory. 이 작업은 완전히 가능하지만, 대량의 데이터가 매우 강력하므로 더 이상 권장되지 않습니다.

모래조각Ⅱ

암호문 데이터를 일반 텍스트 매핑 테이블에 매핑한 다음 매핑 테이블에 퍼지 쿼리를 수행하여 암호문 데이터를 연결하는 두 번째 접근 방식을 살펴보겠습니다. 그렇다면 데이터를 암호화하는 이유는 무엇입니까? what???!!!직접 암호화하지 않는 것이 더 낫지 않을까요?

데이터 암호화를 위해서는 보안 요구 사항이 있어야 하므로 이렇게 하겠습니다. 일반 텍스트 매핑 테이블을 추가하는 것은 보안 요구 사항을 위반하는 것이므로 안전하지도 편리하지도 않습니다.

관습적인 관행

가장 널리 사용되는 방식인 기존 접근 방식을 살펴보겠습니다. 이러한 방식은 데이터 보안을 만족하며 쿼리 친화적입니다.

  • 암호화 알고리즘 기능을 데이터베이스에 구현하여 퍼지 쿼리 시 활용decode(key) like '%partial%

  • 암호문 데이터에 대해 단어 분할 조합을 수행하고, 단어 분할 조합의 결과 집합을 각각 암호화한 후 확장 컬럼에 저장한다.key like '%partial%'

일상적인 것

프로그램과 일치하는 암복호화 알고리즘을 데이터베이스에 구현하고, 퍼지 질의 조건을 수정하고, 데이터베이스 암호화 및 복호화 기능을 사용하여 먼저 복호화한 후 퍼지 검색을 수정함으로써 실현할 수 있으나 단점도 명백하다 이런 방식으로 데이터베이스의 인덱스를 이용하여 질의를 최적화할 수 없으며, 일부 데이터베이스라도 프로그램과 동일한 암호화 및 복호화 알고리즘을 보장할 수는 없으나 기존 암호화 방식과의 일관성은 보장할 수 있습니다. 및 암호 해독 알고리즘 응용 프로그램은 일관성이 있습니다.

AES쿼리 성능에 대한 요구 사항이 특별히 높지 않고 데이터 보안에 대한 요구 사항이 평균인 경우 , 예를 들어 일반적인 암호화 및 암호 해독 알고리즘을 사용하는 DES것도 좋은 선택입니다 .

회사에서 자체 알고리즘 구현을 갖고 있고 다중 터미널 알고리즘 구현을 제공하지 않는 경우, 좋은 알고리즘을 가진 사람을 찾아 연구하여 다중 터미널 구현을 완료하거나 이 방법 사용을 포기하십시오.

수준 높은 기술교류그룹을 만들었습니다. 훌륭한 사람들과 함께하면 스스로도 훌륭해집니다. 서둘러 그룹에 가입하시고 함께 성장하는 기쁨을 누려보세요.

루틴 2

암호문 데이터에 대해 단어 분할을 결합하고, 단어 분할 조합의 결과 집합을 각각 암호화한 후 확장 열에 저장하여 쿼리 시 전달하는 방식은 비교적 key like '%partial%'비용 효율적인 구현 방법입니다. 먼저 구현 아이디어를 분석해 보겠습니다.

먼저 문자를 고정된 길이로 그룹화하고 필드를 배수로 분할합니다. 예를 들어 영어 4자(반각)와 한자 2자(전각)를 검색 조건으로 사용합니다. 예:

ningyu14개의 문자를 그룹으로, 첫 번째 그룹 ning , 두 번째 그룹 ingy , 세 번째 그룹 ngyu , 네 번째 그룹 gyu1 ... 등의 암호화 방법을 사용합니다.

검색 조건 중 4개의 문자가 포함된 데이터를 모두 검색해야 하는 경우: ingy 문자를 암호화한 후  key like “%partial%” 데이터베이스를 확인하세요.

암호화 후에 길이가 늘어나는 것은 우리 모두 알고 있으며, 이렇게 늘어난 길이를 저장하는 데 드는 추가 비용은 우리가 지출해야 하는 추가 비용입니다. 일반적인 사용 비용은 속도의 대가입니다. 암호문의 증가율은 알고리즘에 따라 다릅니다. 섹션 DES, 암호화된 문자열은 1바이트를 차지하고 그 성장은 두 배로 커지므로 우수한 알고리즘이 얼마나 중요하고 회사에 많은 비용을 절약할 수 있지만 또 알고리즘 엔지니어의 급여가 낮지 않으므로 나는 그렇지 않습니다. 비용을 절약할 것인지, 비용을 늘릴 것인지 알 수 있습니다. 하하하... 스스로 판단할 수 있습니다.1380013800011HE9T75xNx6c5yLmS5l4r6Q==242.18

다시 얘기하자면, 이 방법은 암호화된 데이터의 퍼지 쿼리를 실현할 수 있지만 퍼지 쿼리의 문자 길이에 대한 요구 사항이 있습니다.위의 예에서는 퍼지 쿼리 문자의 원본 텍스트 길이가 더 커야 합니다. 영문/숫자 4자, 한자 2자 이상은 길이가 아무리 짧아도 권장하지 않습니다. 단어 분할 조합 수가 늘어나 저장 비용이 증가하고 보안이 저하되기 때문입니다.

타오바오(Taobao), 핀둬둬(Pinduoduo), JD API에 접속한 적이 있나요? 플랫폼의 주문 데이터 중 사용자의 민감한 데이터를 암호화하는 동시에 퍼지 쿼리(Fuzzy Query)를 지원하는 방식이 사용되었습니다. 아래에 정리했습니다. 여러 전자상거래 플랫폼의 암호문 필드 검색 계획에 대한 설명을 보려면 아래 링크를 확인하세요.

Taobao 암호문 필드 검색 체계 Alibaba 텍스트 필드 검색 체계 Pinduoduo 암호문 필드 검색 체계 JD 암호문 필드 검색 체계

ps. 기본적으로는 동일하고 모두 서로 표절한 것이며 암호화된 데이터 형식도 동일합니다.

이 방법의 장점은 구현이 복잡하지 않고 비교적 사용이 간편하다는 점이며, 확장 필드의 저장 비용이 증가하므로 절충 방법이지만, 데이터베이스 인덱스를 사용하여 쿼리 속도를 최적화할 수 있다. . 이 방법을 권장합니다.

슈퍼신 연습

우수사례를 살펴보겠습니다.이러한 실습은 더 어렵고 알고리즘 수준에서 고려됩니다.어떤 경우에는 새로운 알고리즘을 설계하기도 합니다.기성된 알고리즘 참조도 있지만 대부분은 다음과 같은 반제품입니다. 직접 사용할 수 없습니다. 사용하므로 누군가는 여전히 심층적인 조사를 수행하고 이를 자신의 애플리케이션에 통합해야 합니다.

  • 알고리즘 수준에서 생각하고 퍼지 검색을 지원하는 새로운 알고리즘을 설계하기도 합니다.

이 수준은 대부분 전문 알고리즘 엔지니어의 연구 분야로, 질서 있고 비가역적이며 암호문 길이가 너무 빨리 늘어나지 않는 알고리즘을 설계하는 것은 간단한 문제가 아닙니다. 일반적인 아이디어는 다음과 같습니다. 암호화 및 복호화, 원본 텍스트와 동일한 암호문 순서를 유지하여 암호문의 퍼지 일치를 지원합니다. 왜냐하면 저는 이 분야의 전문가도 아니고 추가 연구를 수행하지 않았기 때문에 인터넷에서 다음과 같은 정보를 찾았습니다. 한 번 참고해보세요.

  • 데이터베이스 내 문자 데이터에 대한 퍼지 매칭 암호화 방법

여기서 언급하는 Hill비밀번호 처리 및 퍼지 매칭 암호화 방법 FMES에 중점을 둘 수 있습니다.

  • BloomFilter 기반의 향상된 암호화된 텍스트 퍼지 검색 메커니즘에 대한 연구

  • 빠른 쿼리를 지원하는 데이터베이스를 암호화하는 방법

  • Lucene 기반 클라우드 검색 및 암호문 기반 퍼지 쿼리

Lucene을 기반으로 한 아이디어는 위에서 소개한 기존 방법 2와 유사하며 문자를 동일한 길이의 단어로 분할하고 단어 분할 후의 결과 집합을 암호화하여 저장하지만 저장 방식이 다릅니다. 다른 하나는 검색 db엔진 입니다 es.

  • 클라우드 스토리지의 검증 가능한 퍼지 쿼리 암호화 체계

요약하다

여기서는 암호화된 데이터에 대한 모든 검색 방식을 소개했습니다. 먼저 인터넷 어디에서나 볼 수 있는 모래 조각 방법에 대해 언급했습니다. 또한 이러한 모래 조각 방법은 권장되지 않는다고 말씀드렸습니다. 가능한 한 기존의 방법을 사용하십시오. 회사는 전문적인 알고리즘 방향을 가지고 있습니다. 인재의 경우 알고리즘 수준에 따라 초자연적인 접근 방식을 고려하는 것이 좋습니다.

일반적으로 입력, 출력 비율, 구현 및 사용 비용 측면에서 두 번째 루틴 방법을 적극 권장합니다.

더 좋은 기사

  1. Java High Concurrency 시리즈(총 34개 기사)

  2. MySql 마스터 시리즈(총 27개 기사)

  3. Maven 마스터 시리즈(총 10개 기사)

  4. 마이바티스 시리즈(총 12편)

  5. db 및 캐시 일관성의 일반적인 구현에 대해 이야기

  6. 인터페이스 멱등성은 매우 중요합니다. 그게 무엇인가요? 그것을 달성하는 방법?

  7. 조금 어려운 제네릭은 많은 사람들을 혼란스럽게 만들 것입니다. 왜냐하면 당신이 이 글을 읽지 않았기 때문입니다!

↓↓↓ 点击阅读原文,直达个人博客
你在看吗

추천

출처blog.csdn.net/likun557/article/details/131929053