빠른 시작
이 페이지의 내용
개요
이 가이드에서는 자동 Queryable Encryption 및 MongoDB 드라이버를 사용하여 문서를 암호화하는 방법을 보여줍니다.
이 가이드를 완료한 후에는 다음 지식과 소프트웨어를 갖게 됩니다.
문서의 필드를 암호화하도록 드라이버를 구성하는 단계를 이해합니다.
자동 Queryable Encryption을 활용하는, 작동하지만 프로덕션 환경에서는 사용할 수 없는 클라이언트 애플리케이션입니다.
중요
이 애플리케이션을 프로덕션 환경에서는 사용하지 마세요.
이 예제 애플리케이션은 애플리케이션의 파일 시스템에 암호화 키를 저장하므로 키에 무단으로 액세스하거나 데이터를 해독하기 위한 키를 분실할 위험이 있습니다.
To view a tutorial that demonstrates how to create a Queryable Encryption enabled application that uses a remote Key Management System, see Tutorials.
시작하기 전에
이 가이드의 코드를 완료하고 실행하려면 설치 요구 사항 페이지에 표시된 대로 개발 환경을 설정해야 합니다.
팁
참조: 전체 적용
이 가이드에서 만든 애플리케이션의 전체 코드를 보려면 프로그래밍 언어에 해당하는 탭을 선택하고 제공된 링크를 따라가세요.
절차
고객 마스터 키 생성
Queryable Encryption을 수행하려면 고객 마스터 키(CMK)를 생성해야 합니다.
96바이트 고객 마스터 키를 생성하여 파일 시스템에 master-key.txt
으)로 저장합니다.
openssl rand 96 > master-key.txt
참고
프로그래밍 언어를 사용하여 고객 마스터 키 생성
선호하는 프로그래밍 언어를 사용하여 CMK 를 생성하려는 경우 GitHub에서이 가이드의 지원되는 각 언어로 고객 마스터 키를 생성하는 방법을 보여주는 코드 스니펫을 볼 수 있습니다.
경고
프로덕션 환경에서 로컬 키 파일을 사용하지 마세요.
파일 시스템의 로컬 키 파일은 안전하지 않으므로 프로덕션에 권장되지 않습니다 . 대신 원격 키 관리 시스템 에 고객 마스터 키를 저장해야 합니다. (KMS).
Queryable Encryption 구현에서 원격 KMS를 사용하는 방법을 알아보려면 튜토리얼 가이드를 참조하세요.
데이터 암호화 키 및 암호화된 collection 만들기
고객 마스터 키 읽기 및 KMS 제공자 설정 지정
이 가이드의 고객 마스터 키 생성 단계에서 생성한 고객 마스터 키 파일의 내용을 조회합니다.
고객 마스터 키 값을 KMS 제공자 설정으로 전달합니다. 클라이언트는 이러한 설정을 사용하여 고객 마스터 키 를 검색합니다. 제공자 이름을 local
로 설정하여 로컬 키 제공자를 사용하고 있음을 드라이버에 알립니다.
선호하는 MongoDB 드라이버에 해당하는 탭을 선택합니다:
데이터 암호화 키 만들기
MongoDB 연결 문자열과 키 볼트 컬렉션 네임스페이스를 사용하여 클라이언트를 구성하고 데이터 암호화 키를 만듭니다.
참고
키 볼트 컬렉션 네임스페이스 권한
이 가이드의 키 볼트 컬렉션은 encryption
데이터베이스의 __keyVault
컬렉션입니다. 애플리케이션에서 MongoDB에 연결하는 데 사용하는 데이터베이스 사용자에게 encryption.__keyVault
네임스페이스에 대한 ReadWrite 권한이 있는지 확인합니다.
이 섹션의 코드 출력은 다음과 유사해야 합니다.
Created encrypted collection!
팁
참조: 코드 완성
암호화된 읽기 및 쓰기를 위한 MongoClient 구성
자동 암호화 공유 라이브러리의 위치 지정
참고
자동 암호화 옵션
자동 암호화 옵션은 자동 암호화 공유 라이브러리에 구성 정보를 제공하여 암호화된 필드에 액세스할 때 애플리케이션의 동작을 수정합니다.
자동 암호화 공유 라이브러리에 대한 자세한 내용은 Queryable Encryption을 위한 자동 암호화 공유 라이브러리 페이지에서 확인하세요.
암호화된 필드가 있는 문서 삽입하기
Queryable Encryption이 활성화된 MongoClient
인스턴스를 사용하여 다음 코드 스니펫을 사용하여 암호화된 문서를 medicalRecords.patients
네임스페이스에 삽입합니다.
문서를 삽입하면 Queryable Encryption이 활성화된 클라이언트가 다음과 같이 문서의 필드를 암호화합니다.
{ "_id": { "$oid": "<_id value>" }, "firstName": "Jon", "lastName": "Doe", "patientId": { "$binary": { "base64": "<ciphertext>", "subType": "06" } }, "address": "157 Electric Ave.", "patientRecord": { "ssn": { "$binary": { "base64": "<ciphertext>", "subType": "06" } }, "billing": { "$binary": { "base64": "<ciphertext>", "subType": "06" } } }, "medications": { "$binary": { "base64": "<ciphertext>", "subType": "06" } }, "__safeContent__": [ { "$binary": { "base64": "<ciphertext>", "subType": "00" } }, { "$binary": { "base64": "<ciphertext>", "subType": "00" } } ] }
경고
__safeContent__ 필드를 수정하지 마세요.
__safeContent__
필드는 Queryable Encryption에 반드시 필요합니다. 이 필드의 내용은 수정하지 마세요.
팁
참조: 코드 완성
암호화된 문서 조회
이 가이드의 암호화된 필드가 있는 문서 삽입 단계에서 삽입한 암호화된 문서를 검색합니다.
Queryable Encryption의 기능을 보여주기 위해 다음 코드 스니펫은 자동 Queryable Encryption으로 구성된 클라이언트와 자동 Queryable Encryption이 구성되지 않은 클라이언트를 사용하여 문서를 쿼리합니다.
이전 코드 스니펫의 출력은 다음과 같아야 합니다.
Finding a document with regular (non-encrypted) client. { _id: new ObjectId("628eabeb37590e84ea742665"), firstName: 'Jon', lastName: 'Doe', patientId: new Binary(Buffer.from("0798810acc0f4f46c9a76883cee80fca12102e9ddcbcdae46a821fa108a8155a850f2d0919475b6531ada68973d436a199b537a05a98a708c36d2bfec4979d59cbe66878865ce19e392d3e4789d309bdacc336e32efcc851806ae0a41b355288c10d01e39147e1c40d919c41913a0c9d2d3fad0d0d1d2873c4fc82c6c22f27b517df5f3131b331b96ed16a7c5cf89e09082a2d898c2dcd73da91d08760ba74a70077b2d0fdbbe1eea75655a19fcc397812325ad40b102cbd16b8d36b22e11e3f93404f24a8ff68cfdec3c22b0e787cb30078a5227b2a", "hex"), 6), address: '157 Electric Ave.', patientRecord: { ssn: new Binary(Buffer.from("07e8b69630c32f4a00a542af768f8abcf50223edd812ff20b0ecb046ee1a9f5a0eef8d85d99cd26076411129942752516ee605c55aadce73f3d44d81ea6ddbbb8134b108a9deb40d8cab9cb4f08ef210ab0c9d2ea4347f9d235b861baf29751e60abcf059eb5c120305bd5ac05a4e07ac8ccfa6d37283f4cdbfeb7a8accb65b71857d486b5cf55e354d6a95e287d9e2dd65f3f9d9c4c9d0bdb1f26c4bd549d7be77db81796be293e08b2223bac67b212423c4e06568578b5bd7a3c33cedc1b291bcda0b27e005144d344563711a489f24b8e9b65bbb721d3a0e9d9b227a0cec0cbad", "hex"), 6), billing: new Binary(Buffer.from("06808ae69d4caa49cf90bb688f386f097f03f870a7b8fcebb1980c9ee5488b1f0f68558fc2163adcd92d00ea5f349f56ed34e7b391f54c48ed2760b4bde73022fc818dc7486a4e046b92ce9c82e00333c7779d9d6bb476713a20632b593b7de54812662cfc4d174d05451d3f4195514e12edba", "hex"), 6) }, medications: new Binary(Buffer.from("06665ec15d38254dc4aa16da856789d33404f27bfea53e0d2fa4deaff166989ab33f469644d89c29112d33b41dbe54ec2d89c43f3de52cdc5d454e8694046216f533614fa7b42b7c5406d6518f7ed8f9e3ce52fda6c8b2146d0f8cc51e21a3467183697e1735a9f60c18e173c1916101", "hex"), 6), __safeContent__: [ new Binary(Buffer.from("3044b134ad0f7c8a90dab1e05bb8b296a8ede540796bd7403ab47693cdba1b26", "hex"), 0), new Binary(Buffer.from("a22ddf9a5657cdd56bef72febbba44371899e6486962a1c07d682082c4e65712", "hex"), 0) ] } Finding a document with encrypted client, searching on an encrypted field { _id: new ObjectId("628eaca1dcf9b63e2f43162d"), firstName: 'Jon', lastName: 'Doe', patientId: 12345678, address: '157 Electric Ave.', patientRecord: { ssn: '987-65-4320', billing: { type: 'Visa', number: '4111111111111111' } }, medications: [ 'Atorvastatin', 'Levothyroxine' ], __safeContent__: [ new Binary(Buffer.from("fbdc6cfe3b4659693650bfc60baced27dcb42b793efe09da0ded54d60a9d5a1f", "hex"), 0), new Binary(Buffer.from("0f92ff92bf904a858ef6fd5b1e508187f523e791f51d8b64596461b38ebb1791", "hex"), 0) ] }
팁
참조: 코드 완성
자세히 알아보기
원격 KMS를 사용한 프로덕션 환경에서 사용할 수 있는 Queryable Encryption에 대한 튜토리얼을 보려면 튜토리얼을 참조하세요.
Queryable Encryption의 작동 방식을 알아보려면 기본 사항을 참조하세요.
이 가이드에 언급된 주제에 대해 자세히 알아보려면 다음 링크를 참조하세요: