참고 : 토큰은 암호화 토큰이 아닌 어휘 토큰을 나타냅니다. 예를 들어, 토큰 화기는 '학습', '학습', '학습'을 '학습'으로 바꿀 수 있습니다.
암호화가 필요하지 않으면 Tantivy는 모든면에서 더 좋습니다.
Dioxus를 사용하는 기본 GUI 데모와 Enron 이메일 세트는 여기에서 내 Github에서 사용할 수 있습니다. 주로 클라이언트 측 응용 프로그램에 저장된 데이터 세트에 대해 검색 속도가 괜찮다는 것을 보여주는 것입니다.
이것은 여전히 진행중인 작업입니다. 이 라이브러리 또는 그 종속성에 대한 보장은 개념적으로 또는 다른 방식으로 이루어지지 않습니다. 보안 감사는 수행되지 않았습니다. 자신의 위험에 사용하십시오.
검색 또는 색인의 각 키워드는 토큰 화됩니다. 이 토큰 및 테이블 이름은 Blake2B-128로 해시 된 다음 AES-128-ECB로 암호화되기 전에 저장되거나 쿼리에 사용됩니다.
Encrypt(Hash(token + table_name))
ECB 모드는 암호화에 사용됩니다. ECB는 동일한 일반 텍스트를 동일하게 만들지 만 토큰 및 테이블 이름의 해시와 같은 고유 한 값에 대한 관심은 아닙니다. 이는 별도의 테이블에서 발생하는 경우 동일한 토큰이 다른 암호 텍스트를 가짐을 의미합니다.
문서 ID는 AES-128-ECB로 암호화됩니다. 그런 다음 32 비트 카운터와 관련이 있습니다.
문서 ID가 여러 번 나타나고 문서 ID 수가 128 비트로 열거 될 수있는 것보다 훨씬 작기 때문에 문서 ID를 압축 할 수 있습니다.
1,000 개의 고유 한 토큰 / 문서를 가정하면 문서에 토큰 발생을 저장하는 데 드는 비용은 다음과 같습니다.
| 서류 | 최적화되지 않았습니다 | 32 비트 |
|---|---|---|
| 1000 | 16MB | 4MB |
| 10k | 160MB | 40MB |
| 50k | 800MB | 200MB |
| 100k | 1.6GB | 400MB |
| 250K | 4GB | 1GB |
| 백만 | 16GB | 4GB |
| 10억 | 16TB | 4TB |
차이는 순서대로 값을 차이로 나타내는 것입니다. 이것은 적은 비트로 표현할 수있는 값을 생성하므로 비트 포킹이 더 엄격합니다.
비트 포킹 크레이트는 128 개의 정수의 차이 및 비트 포킹 블록에 사용됩니다.
차이는 값이 정렬 될 때 가장 잘 작동하지만 정렬 된 값을 유지하려면 순서 외 입력이 추가 될 때 모든 값을 다시 인코딩해야합니다. 순서 외 값을 수집하여 상각 된 접근법을 사용하면 변경 비용을 상각하여 변경할 수 있습니다.
| 레이어 번호 | 포장 체계 | 정렬 | 차이 |
|---|---|---|---|
| 0 | 없음 -32 비트 (<128 ints) | 없음 | 아니요 |
| 1+ | Bitpacker4x (128 ints) | 전 세계적으로 0 이상의 레이어 | 예 |
대략 9,000-10,000 개의 짧은 Enron 전자 메일을 압축하고 결과 FTS DB 크기는 32 비트 인코딩을 사용하여 235MB였습니다. 상각 된 차등 및 층 비트 포킹을 사용하면 21MB로 변경되었습니다.
파일을 삭제하는 것은 ... 비용이 많이 듭니다
할 일을 탐구하십시오. RocksDB memtable 또는 썰매와 같은 것. 메모리에 변경 사항을 저장 한 다음 500ms마다 또는 메모리 제한에 도달하면 플러시하십시오.
버킷은 처음 3 ~ 4 자별으로 단어를 정렬 (토큰 화되지 않음), 압축? 그리고 암호화. CBC 또는 GCM (인증 된 암호화)과 같은 확산으로 무언가로 암호화하십시오. 이는 AutoComplete가 3 ~ 4 자 후에 시작될 것임을 의미합니다. 이것은 여전히 개념적 단계에 있습니다.
데이터 무결성은 가까운 시간에 데이터베이스 파일을 해시하고 암호화 된 해시 버전을 저장하여 선택 사항입니다.
암호화 된 문서 ID에는 확산이 없습니다. 확산을 추가하려면 무작위로 생성 된 IV를 사용하여 문서 ID를 암호화해야합니다. 이것은 또한 압축을 불가능하게 만듭니다. IV를 저장하면 토큰 당 128 비트와 문서 쌍 (AES CBC의 경우)이 추가됩니다.
다음은 열쇠가없는 공격자에게 볼 수 있습니다.
의사 사무실의 환자 목록의 색인의 경우 열쇠가없는 공격자는 환자의 수와 문서 내에서 사용되는 토큰 분포를 볼 수 있습니다. 그들은 이름이나 다른 식별자와 같은 일반 텍스트를 볼 수 없었으며 환자의 문서 ID조차 볼 수 없었습니다. 그들은 두 환자가 검색 토큰을 공유하는지 확인할 수 있었지만 환자 또는 공유 정보가 무엇인지에 대해서는 아무것도 볼 수 없습니다.
예를 들어, 검색 지수가 베트남과 같은 공통 성이있는 국가의 이름에만 구축 된 경우 빈도 분석을 수행하고 성 Nguyen (베트남 인구의 38%)을 가진 환자 수를 파악할 수 있습니다. 이는 현재 데이터 세트에 유효한 이전 (성의 분포)에 의존합니다. 또한 공통 이름에 대해서만 효과적 일 것이며, 이는 식별하지 않고 베트남에서 세 번째로 가장 일반적인 성 (11%, LE)에서 두 번째로 포함 된 문서를 포함하는 문서를 자신있게 구별 할 가능성이 높습니다 (10%).
연령, 고향, 주소, 설명 등과 같은 검색 지수에 자세한 정보가 추가되면 빈도 분석을 수행하는 기능이 사실상 사라집니다.
한 가지 우려 사항은 고유 한 데이터 세트를 저장하지 않을 수 있는데, 여기서 대규모 알려진 일반 텍스트 데이터 세트의 주파수 분석은 합리적인 의심을 넘어서 주어진 장치가 해당 데이터 세트가 인덱싱되었다는 것을 보여줄 수 있습니다. 이것은 권위주의 국가 나 범죄자의 반체제에만 영향을 미칠 것 같습니다. 장치가 꺼져있을 때 완전 디스크 암호화에 의해 완화 될 수 있습니다.
d1 토큰 t1 의 문서로하자. t2 가 해시가 t1 과 충돌하고 문서 d1 의 토큰이 아닌 토큰이되도록하십시오.
검색 결과에 추가 관련이없는 결과가 포함 된 오 탐지는 검색에 t2 아닌 t1 포함 된 경우 d1 에 발생할 수 있습니다.
검색 결과에서 관련 결과가 생략 된 False Negatives는 충돌 토큰 중 하나가 문서에 대해 삭제 된 경우에만 발생할 수 있습니다. 이로 인해 다른 토큰도 "삭제"됩니다.
거짓 양성 또는 네거티브는 다른 충돌 토큰이 검색 쿼리에있을 때 충돌 토큰 중 하나가있는 문서에만 적용됩니다. 이것은 그러한 충돌의 지분을 매우 낮게 만듭니다.
충돌의 실제 위험은 128 비트 해시의 경우 코믹하게 작습니다 (Wikipedia의 생일 문제 참조).
64 비트 암호화는 매우 큰 인덱스에 대해 몇 메가 바이트의 공간 절약을 초래합니다. 영어는 약 1,000,000 단어와 토큰이 적습니다. 6 천 6 백만 비트는 8MB에 불과합니다. 상위 백 명 정도의 단어가 빈도의 절반을 포함 할 수있는 언어로 표시되는 전력 법률 유형 분포를 고려할 때 실제 절약은 상당히 적습니다.