ENCRYPTBYKEY(Transact-SQL)ENCRYPTBYKEY (Transact-SQL)

이 항목은 다음에 적용됩니다.예SQL Server(2008부터)예Azure SQL Database아니요Azure SQL Data Warehouse 아니요병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

대칭 키를 사용하여 데이터를 암호화합니다.Encrypts data by using a symmetric key.

항목 링크 아이콘 Transact-SQL 구문 규칙Topic link icon Transact-SQL Syntax Conventions

구문Syntax


EncryptByKey ( key_GUID , { 'cleartext' | @cleartext }  
    [, { add_authenticator | @add_authenticator }  
     , { authenticator | @authenticator } ] )  

인수Arguments

key_GUIDkey_GUID
암호화 하는 데 사용할 키의 guid는 보냄합니다.Is the GUID of the key to be used to encrypt the cleartext. uniqueidentifier합니다.uniqueidentifier.

'보냄''cleartext'
키로 암호화할 데이터입니다.Is the data that is to be encrypted with the key.

@cleartext
형식의 변수는 nvarchar, char, varchar, 이진, varbinary, 또는 nchar 키로 암호화 될 데이터가 들어 있는입니다.Is a variable of type nvarchar, char, varchar, binary, varbinary, or nchar that contains data that is to be encrypted with the key.

add_authenticatoradd_authenticator
인증 자가와 함께 암호화 될 지 여부를 나타냅니다는 보냄합니다.Indicates whether an authenticator will be encrypted together with the cleartext. 인증자를 사용하는 경우 1이어야 합니다.Must be 1 when using an authenticator. int합니다.int.

@add_authenticator
인증 자가와 함께 암호화 될 지 여부를 나타냅니다는 보냄합니다.Indicates whether an authenticator will be encrypted together with the cleartext. 인증자를 사용하는 경우 1이어야 합니다.Must be 1 when using an authenticator. int합니다.int.

인증자authenticator
인증자가 파생될 데이터입니다.Is the data from which to derive an authenticator. sysname합니다.sysname.

@authenticator
인증자가 파생될 데이터를 포함하는 변수입니다.Is a variable that contains data from which to derive an authenticator.

반환 형식Return Types

varbinary 최대 크기가 8, 000 바이트입니다.varbinary with a maximum size of 8,000 bytes.

키가 열리지 않거나, 존재하지 않거나, 더 이상 사용되지 않는 RC4 키이며 데이터베이스 호환성 수준이 110 이상이 아닐 경우 Null을 반환합니다.Returns NULL if the key is not open, if the key does not exist, or if the key is a deprecated RC4 key and the database is not in compatibility level 110 or higher.

주의Remarks

EncryptByKey는 대칭 키를 사용합니다.EncryptByKey uses a symmetric key. 이 키는 열려 있어야 합니다.This key must be open. 대칭 키가 현재 세션에서 이미 열려 있으면 쿼리 컨텍스트에서 다시 열지 않아도 됩니다.If the symmetric key is already open in the current session, you do not have to open it again in the context of the query.

인증자는 암호화된 필드의 정수 값 대체를 막는 데 유용합니다.The authenticator helps you deter whole-value substitution of encrypted fields. 예를 들어 급여 데이터로 이루어진 다음 테이블을 살펴봅니다.For example, consider the following table of payroll data.

Employee_IDEmployee_ID Standard_TitleStandard_Title Base_PayBase_Pay
345345 Copy Room AssistantCopy Room Assistant Fskj%7^edhn00Fskj%7^edhn00
697697 Chief Financial OfficerChief Financial Officer M0x8900f56543M0x8900f56543
694694 Data Entry SupervisorData Entry Supervisor Cvc97824%^34fCvc97824%^34f

악의적인 사용자는 암호화 텍스트 저장 컨텍스트에서 암호화를 해제하지 않고도 상당한 정보를 추론할 수 있습니다.Without breaking the encryption, a malicious user can infer significant information from the context in which the ciphertext is stored. Chief Financial Officer는 Copy Room Assistant보다 더 많은 급여를 받으므로 M0x8900f56543으로 암호화된 값이 Fskj%7^edhn00으로 암호화된 값보다 커야 합니다.Because a Chief Financial Officer is paid more than a Copy Room Assistant, it follows that the value encrypted as M0x8900f56543 must be greater than the value encrypted as Fskj%7^edhn00. 이 경우 테이블에 대해 ALTER 권한을 갖는 모든 사용자는 자신의 Base_Pay 필드 데이터를 Chief Financial Officer의 Base_Pay 필드에 저장된 데이터 복사본으로 바꾸어 Copy Room Assistant의 급여를 올릴 수 있습니다.If so, any user with ALTER permission on the table can give the Copy Room Assistant a raise by replacing the data in his Base_Pay field with a copy of the data stored in the Base_Pay field of the Chief Financial Officer. 이러한 전체 값 대체 공격은 암호화를 무시합니다.This whole-value substitution attack bypasses encryption altogether.

암호화하기 전에 컨텍스트 정보를 일반 텍스트에 추가하여 전체 값 대체 공격을 방지할 수 있습니다.Whole-value substitution attacks can be thwarted by adding contextual information to the plaintext before encrypting it. 이러한 컨텍스트 정보는 일반 텍스트 데이터가 이동되지 않았는지 확인하는 데 사용됩니다.This contextual information is used to verify that the plaintext data has not been moved.

데이터 암호화 시 인증자 매개 변수가 지정된 경우 DecryptByKey를 사용하여 데이터의 암호를 해독하려면 같은 인증자가 필요합니다.If an authenticator parameter is specified when data is encrypted, the same authenticator is required to decrypt the data by using DecryptByKey. 암호화 시 인증자의 해시는 일반 텍스트와 함께 암호화됩니다.At encryption time, a hash of the authenticator is encrypted together with the plaintext. 암호 해독 시 같은 인증자가 DecryptByKey에 전달되어야 합니다.At decryption time, the same authenticator must be passed to DecryptByKey. 두 값이 일치하지 않으면 해독에 실패합니다.If the two do not match, the decryption will fail. 이것은 암호화 이후에 해당 값이 이동되었음을 의미합니다.This indicates that the value has been moved since it was encrypted. 변화지 않는 고유한 값이 포함된 열을 인증자로 사용하는 것이 좋습니다.We recommend using a column containing a unique and unchanging value as the authenticator. 인증자 값이 변경되면 데이터에 액세스하지 못할 수 있습니다.If the authenticator value changes, you might lose access to the data.

대칭 암호화 및 암호 해독은 비교적 속도가 빠르며 대량의 데이터 작업 시 적합합니다.Symmetric encryption and decryption is relatively fast, and is suitable for working with large amounts of data.

중요

SQL ServerSQL Server 암호화 함수를 ANSI_PADDING OFF 설정과 함께 사용하면 암시적 변환으로 인해 데이터가 손실될 수 있습니다.Using the SQL ServerSQL Server encryption functions together with the ANSI_PADDING OFF setting could cause data loss because of implicit conversions. ANSI_PADDING에 대 한 자세한 내용은 참조 SET ansi_padding( Transact SQL ) .For more information about ANSI_PADDING, see SET ANSI_PADDING (Transact-SQL).

Examples

다음 예에 설명 하는 기능 키에 의존 하며 인증서에서 만든 방법: 데이터 열 암호화합니다.The functionality illustrated in the following examples relies on keys and certificates created in How To: Encrypt a Column of Data.

1.A. 대칭 키로 문자열 암호화Encrypting a string with a symmetric key

다음 예에서는 Employee 테이블에 열을 추가한 다음 NationalIDNumber 열에 저장되는 주민 등록 번호의 값을 암호화합니다.The following example adds a column to the Employee table, and then encrypts the value of the Social Security number that is stored in column NationalIDNumber.

USE AdventureWorks2012;  
GO  

-- Create a column in which to store the encrypted data.  
ALTER TABLE HumanResources.Employee  
    ADD EncryptedNationalIDNumber varbinary(128);   
GO  

-- Open the symmetric key with which to encrypt the data.  
OPEN SYMMETRIC KEY SSN_Key_01  
   DECRYPTION BY CERTIFICATE HumanResources037;  

-- Encrypt the value in column NationalIDNumber with symmetric key  
-- SSN_Key_01. Save the result in column EncryptedNationalIDNumber.  
UPDATE HumanResources.Employee  
SET EncryptedNationalIDNumber  
    = EncryptByKey(Key_GUID('SSN_Key_01'), NationalIDNumber);  
GO  

2.B. 인증 값과 함께 레코드 암호화Encrypting a record together with an authentication value

USE AdventureWorks2012;  

-- Create a column in which to store the encrypted data.  
ALTER TABLE Sales.CreditCard.   
    ADD CardNumber_Encrypted varbinary(128);   
GO  

-- Open the symmetric key with which to encrypt the data.  
OPEN SYMMETRIC KEY CreditCards_Key11  
    DECRYPTION BY CERTIFICATE Sales09;  

-- Encrypt the value in column CardNumber with symmetric   
-- key CreditCards_Key11.  
-- Save the result in column CardNumber_Encrypted.    
UPDATE Sales.CreditCard  
SET CardNumber_Encrypted = EncryptByKey(Key_GUID('CreditCards_Key11'),   
    CardNumber, 1, CONVERT( varbinary, CreditCardID) );  
GO  

관련 항목:See Also

Decryptbykey( Transact SQL ) DECRYPTBYKEY (Transact-SQL)
CREATE SYMMETRIC KEY (Transact-SQL) CREATE SYMMETRIC KEY (Transact-SQL)
ALTER SYMMETRIC KEY(Transact-SQL) ALTER SYMMETRIC KEY (Transact-SQL)
DROP SYMMETRIC KEY(Transact-SQL) DROP SYMMETRIC KEY (Transact-SQL)
암호화 계층 Encryption Hierarchy
HASHBYTES ( Transact SQL )HASHBYTES (Transact-SQL)