Always Encrypted használata az SQL Server ODBC-illesztőprogramjával

ODBC-illesztőprogram letöltése

A

  • ODBC Driver 13.1+ az SQL Serverhez

Bevezetés

Ez a cikk bemutatja, hogyan fejleszthet ODBC-alkalmazásokat az Always Encrypted (Adatbázismotor) vagy az Always Encrypted használatával biztonságos enklávékkal és az SQL Server ODBC-illesztőprogramjával.

Az Always Encrypted lehetővé teszi az ügyfélalkalmazások számára a bizalmas adatok titkosítását, és soha nem fedik fel az ADATOKAT vagy a titkosítási kulcsokat az SQL Server vagy az Azure SQL Database számára. Az Always Encrypted-kompatibilis illesztőprogramok, például az SQL Server ODBC-illesztőprogramja, ezt a biztonságot úgy érik el, hogy transzparensen titkosítják és visszafejtik a bizalmas adatokat az ügyfélalkalmazásban. Az illesztő automatikusan meghatározza, hogy mely lekérdezési paraméterek felelnek meg a bizalmas adatbázisoszlopoknak (always encrypted használatával védve), és titkosítja ezeknek a paramétereknek az értékeit, mielőtt továbbítanák az adatokat az SQL Servernek vagy az Azure SQL Database-nek. Hasonlóképpen, az illesztőprogram transzparensen visszafejti a titkosított adatbázis oszlopaiból lekért adatokat a lekérdezési eredményekben. Az Always Encrypted biztonságos enklávékkal bővíti ezt a funkciót, hogy a bizalmas adatokon gazdagabb funkciókat biztosítson, miközben az adatok bizalmasak maradnak.

További információ: Always Encrypted (Adatbázismotor) és Always Encrypted biztonságos enklávékkal.

Előfeltételek

Konfigurálja az Always Encryptedt az adatbázisban. Ez a folyamat magában foglalja az Always Encrypted kulcsok kiépítését és a kijelölt adatbázisoszlopok titkosításának beállítását. Ha még nem rendelkezik Always Encrypteddel konfigurált adatbázissal, kövesse az oktatóanyag útmutatását : Az Always Encrypted használatának első lépései. Az adatbázisnak különösen tartalmaznia kell egy oszlopmintakulcs (CMK), egy oszloptitkosítási kulcs (CEK) metaadat-definícióit, valamint egy olyan táblát, amely egy vagy több, a CEK használatával titkosított oszlopot tartalmaz.

Ha az Always Encryptedt biztonságos enklávékkal használja, további előfeltételekért tekintse meg az Always Encrypted és biztonságos enklávék használatával végzett alkalmazások fejlesztése című témakört.

Always Encrypted engedélyezése ODBC-alkalmazásban

A paramétertitkosítás és az eredményhalmaz titkosított oszlopvisszafejtésének engedélyezésének legegyszerűbb módja a kapcsolati sztring kulcsszó értékének ColumnEncryptionEngedélyezve értékre állítása. Az alábbi kód egy példa az Always Encryptedt engedélyező kapcsolati sztringre:

SQLWCHAR *connString = L"Driver={ODBC Driver 18 for SQL Server};Server={myServer};Encrypt=yes;Trusted_Connection=yes;ColumnEncryption=Enabled;";

Az "Always Encrypted" a DSN-konfigurációban is engedélyezhető ugyanezzel a kulccsal és értékkel (amelyet a kapcsolati karakterlánc beállítása felülír, ha létezik), vagy programozottan a SQL_COPT_SS_COLUMN_ENCRYPTION kapcsolat előtti attribútummal. Ha így állítja be, felülbírálja a kapcsolati sztringben vagy a DSN-ben beállított értéket:

 SQLSetConnectAttr(hdbc, SQL_COPT_SS_COLUMN_ENCRYPTION, (SQLPOINTER)SQL_COLUMN_ENCRYPTION_ENABLE, 0);

Ha engedélyezve van a kapcsolat, az Always Encrypted viselkedése módosítható az egyes lekérdezésekhez. További információ: Az Always Encrypted teljesítményhatásának szabályozása alább.

Az Always Encrypted engedélyezése önmagában nem elegendő a titkosítás vagy a visszafejtés sikerességéhez; győződjön meg arról is, hogy:

  • Az alkalmazás rendelkezik a VIEW ANY COLUMN MASTER KEY DEFINITION és VIEW ANY COLUMN ENCRYPTION KEY DEFINITION adatbázis engedélyekkel, amely az adatbázisban lévő Always Encrypted kulcsok metaadatainak eléréséhez szükséges. További részletekért lásd: Adatbázis-engedélyek.

  • Az alkalmazás hozzáférhet a lekérdezett titkosított oszlopok CEK-jait védő CMK-hoz. Ez a viselkedés a CMK-t tároló kulcstár-szolgáltatótól függ. További információ: Az oszlop főkulcstárolóinak használata.

Az Always Encrypted engedélyezése biztonságos enklávékkal

Megjegyzés:

Linux és macOS rendszeren az OpenSSL 1.0.1-es vagy újabb verziója szükséges az Always Encrypted biztonságos enklávékkal való használatához.

A 17.4-es verziótól kezdve az illesztőprogram biztonságos enklávékkal támogatja az Always Encryptedt. Ha engedélyezni szeretné az enklávé használatát egy adatbázishoz való csatlakozáskor, állítsa a DSN-kulcsot, a ColumnEncryption kapcsolati sztring kulcsszót vagy a kapcsolati attribútumot a következő értékre: <attestation protocol>,<attestation URL>, ahol:

  • <attestation protocol> - az enklávéigazoláshoz használt protokollt adja meg.

    • Ha az SQL Servert és a Host Guardian Service-t (HGS) használja, <attestation protocol> kell legyen VBS-HGS.
    • Ha az Azure SQL-adatbázist és a Microsoft Azure Attestation szolgáltatást használja, akkor a(z) <attestation protocol> legyen SGX-AAS.
    • Ha nem igényel igazolást, <attestation-protocol> legyen VBS-NONE. (18.1-es verzió+)
  • <attestation URL> - egy igazolási URL-címet (egy igazolási szolgáltatás végpontját) határoz meg. Be kell szereznie a környezet igazolási URL-címét az igazolási szolgáltatás rendszergazdájától.

Példák az adatbázis-kapcsolatok enklávészámítását lehetővé tevő kapcsolati sztringekre:

  • SQL Server:

    "Driver=ODBC Driver 18 for SQL Server;Server=myServer.myDomain;Encrypt=yes;Database=myDataBase;Trusted_Connection=Yes;ColumnEncryption=VBS-HGS,http://myHGSServer.myDomain/Attestation"
    
  • Azure SQL Database:

    "Driver=ODBC Driver 18 for SQL Server;Server=myServer.database.windows.net;Database=myDataBase;Uid=myUsername;Pwd=<password>;Encrypt=yes;ColumnEncryption=SGX-AAS,https://myAttestationProvider.uks.attest.azure.net/"
    
  • Nincs igazolás (v18.1+):

    "Driver=ODBC Driver 18 for SQL Server;Server=myServer.database.windows.net;Database=myDataBase;Uid=myUsername;Pwd=<password>;Encrypt=yes;ColumnEncryption=VBS-NONE"
    

Ha a kiszolgáló és az attestációs szolgáltatás megfelelően van konfigurálva, valamint enklávé-kompatibilis CMK-kal és CEK-kel a titkosított oszlopokhoz, az Always Encrypted által biztosított meglévő funkciók mellett olyan lekérdezéseket is végrehajthat, amelyek az enklávé használatát is igénylik, például a helyben történő titkosítást és az összetett számításokat. További információért lásd: Always Encrypted konfigurálása biztonságos enklávékkal.

Adatok beolvasása és módosítása titkosított oszlopokban

Miután engedélyezte az Always Encryptedt egy kapcsolaton, szabványos ODBC API-kat használhat. Az ODBC API-k titkosított adatbázisoszlopokban tudják lekérni vagy módosítani az adatokat. A következő dokumentációelemek hasznosak lehetnek:

Az alkalmazásnak rendelkeznie kell a szükséges adatbázis-engedélyekkel, és hozzá kell férnie az oszlop főkulcsához. Ezután az illesztőprogram titkosítja a titkosított oszlopokat célzó lekérdezési paramétereket. Az illesztőprogram visszafejti a titkosított oszlopokból lekért adatokat is. Az illesztőprogram a forráskód segítsége nélkül végzi el a titkosítást és a visszafejtést. A programod számára olyan, mintha az oszlopok nem lennének titkosítva.

Ha az Always Encrypted nincs engedélyezve, a titkosított oszlopokat megcélzott paraméterekkel rendelkező lekérdezések sikertelenek lesznek. Az adatok továbbra is lekérhetők titkosított oszlopokból, amennyiben a lekérdezés nem tartalmaz titkosított oszlopokat célzó paramétereket. Az illesztő azonban nem próbál visszafejtést, és az alkalmazás megkapja a bináris titkosított adatokat (bájttömbökként).

Az alábbi táblázat összefoglalja a lekérdezések viselkedését attól függően, hogy az Always Encrypted engedélyezve van-e vagy sem:

Lekérdezési jellemző Az Always Encrypted engedélyezve van, és az alkalmazás hozzáférhet a kulcsokhoz és a kulcs metaadataihoz Az Always Encrypted engedélyezve van, és az alkalmazás nem tudja elérni a kulcsokat vagy a kulcs metaadatait Az "Always Encrypted" funkció le van tiltva.
Titkosított oszlopokat célzó paraméterek. A paraméterértékek transzparensen titkosítva vannak. Error Error
Adatok lekérése titkosított oszlopokból, a titkosított oszlopokat célzó paraméterek nélkül. A titkosított oszlopok eredményei transzparensen visszafejthetők. Az alkalmazás egyszerű szöveges oszlopértékeket fogad. Error A titkosított oszlopok eredményei nem lesznek visszafejtve. Az alkalmazás bájttömbökként kapja meg a titkosított értékeket.

Az alábbi példák az adatok titkosított oszlopokban való beolvasását és módosítását szemléltetik. A példák a következő sémával rendelkező táblát feltételezik. Az SSN- és BirthDate-oszlopok titkosítva vannak.

CREATE TABLE [dbo].[Patients](
 [PatientId] [int] IDENTITY(1,1),
 [SSN] [char](11) COLLATE Latin1_General_BIN2
 ENCRYPTED WITH (ENCRYPTION_TYPE = DETERMINISTIC,
 ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256',
 COLUMN_ENCRYPTION_KEY = CEK1) NOT NULL,
 [FirstName] [nvarchar](50) NULL,
 [LastName] [nvarchar](50) NULL,
 [BirthDate] [date]
 ENCRYPTED WITH (ENCRYPTION_TYPE = RANDOMIZED,
 ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256',
 COLUMN_ENCRYPTION_KEY = CEK1) NOT NULL
 PRIMARY KEY CLUSTERED ([PatientId] ASC) ON [PRIMARY] )
 GO

Példa adatszúrásra

Ez a példa beszúr egy sort a Betegek táblába. Jegyezze fel a következő részleteket:

  • A mintakód nem tartalmaz titkosítást. Az illesztőprogram automatikusan észleli és titkosítja az SSN és a dátumparaméterek értékeit, amelyek titkosított oszlopokat céloznak meg. Ez a viselkedés transzparenssé teszi a titkosítást az alkalmazás számára.

  • Az adatbázisoszlopokba beszúrt értékek, beleértve a titkosított oszlopokat is, kötött paraméterekként lesznek átadva (lásd : SQLBindParameter függvény). A paraméterek használata nem kötelező, ha az értékeket nem titkosított oszlopokba küldi (bár erősen ajánlott, mert segít megelőzni az SQL-injektálást), a titkosított oszlopokat megcélzó értékekhez szükséges. Ha az SSN- vagy BirthDate-oszlopokba beszúrt értékeket a lekérdezési utasításba beágyazott literálként adná át, a lekérdezés meghiúsulna, mert az illesztőprogram nem próbálja meg a lekérdezésekben lévő literálok titkosítását vagy más módon történő feldolgozását. Ennek eredményeképpen a kiszolgáló elutasítja őket, mivel nem kompatibilisek a titkosított oszlopokkal.

  • Az SSN-oszlopba beszúrt paraméter SQL-típusa SQL_CHAR, amely a karakteres SQL Server-adattípusra (rc = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 11, 0, (SQLPOINTER)SSN, 0, &cbSSN);) van leképezve. Ha a paraméter típusa SQL_WCHAR értékre van állítva, amely nchar értékre van leképezve, a lekérdezés sikertelen lesz, mivel az Always Encrypted nem támogatja a kiszolgálóoldali átalakításokat titkosított nchar értékekről titkosított karakterértékekre. Az adattípus-megfeleltetésekkel kapcsolatos információkért tekintse meg az ODBC programozói referenciája: D függelék - Adattípusok.

    SQL_DATE_STRUCT date;
    SQLLEN cbdate;   // size of date structure  

    SQLCHAR SSN[12];
    strcpy_s((char*)SSN, _countof(SSN), "795-73-9838");

    SQLWCHAR* firstName = L"Catherine";
    SQLWCHAR* lastName = L"Abel";
    SQLINTEGER cbSSN = SQL_NTS, cbFirstName = SQL_NTS, cbLastName = SQL_NTS;

    // Initialize the date structure  
    date.day = 10;
    date.month = 9;
    date.year = 1996;

    // Size of structures   
    cbdate = sizeof(SQL_DATE_STRUCT);

    SQLRETURN rc = 0;

    string queryText = "INSERT INTO [dbo].[Patients] ([SSN], [FirstName], [LastName], [BirthDate]) VALUES (?, ?, ?, ?) ";

    rc = SQLPrepare(hstmt, (SQLCHAR *)queryText.c_str(), SQL_NTS);

    //SSN
    rc = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 11, 0, (SQLPOINTER)SSN, 0, &cbSSN);
    //FirstName
    rc = SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_WCHAR, SQL_WCHAR, 50, 0, (SQLPOINTER)firstName, 0, &cbFirstName);
    //LastName
    rc = SQLBindParameter(hstmt, 3, SQL_PARAM_INPUT, SQL_C_WCHAR, SQL_WCHAR, 50, 0, (SQLPOINTER)lastName, 0, &cbLastName);
    //BirthDate
    rc = SQLBindParameter(hstmt, 4, SQL_PARAM_INPUT, SQL_C_TYPE_DATE, SQL_TYPE_DATE, 10, 0, (SQLPOINTER)&date, 0, &cbdate);

    rc = SQLExecute(hstmt);

Egyszerű szöveges adatlekérési példa

Az alábbi példa bemutatja az adatok titkosított értékeken alapuló szűrését és egyszerű szöveges adatok titkosított oszlopokból való lekérését. Jegyezze fel a következő részleteket:

  • Az SSN-oszlopra való szűréshez használt WHERE záradékban használt értéket az SQLBindParameter használatával kell átadni, hogy az illesztőprogram transzparensen titkosíthassa, mielőtt elküldené azt a kiszolgálónak.

  • A program által kinyomtatott összes érték egyszerű szöveges lesz, mivel az illesztőprogram transzparensen visszafejti az SSN és a BirthDate oszlopokból lekért adatokat.

Megjegyzés:

A lekérdezések csak akkor végezhetnek egyenlőség-összehasonlítást titkosított oszlopokon, ha a titkosítás determinisztikus, vagy ha a biztonságos enklávé engedélyezve van.

SQLCHAR SSN[12];
strcpy_s((char*)SSN, _countof(SSN), "795-73-9838");

SQLWCHAR* firstName = L"Catherine";
SQLWCHAR* lastName = L"Abel";
SQLINTEGER cbSSN = SQL_NTS, cbFirstName = SQL_NTS, cbLastName = SQL_NTS;

SQLRETURN rc = 0;
string empty = "";
string queryText = "SELECT [SSN], [FirstName], [LastName], [BirthDate] " + empty +
    "FROM  [dbo].[Patients]" +
    "WHERE " +
    "[SSN] = ? ";

rc = SQLPrepare(hstmt, (SQLCHAR *)queryText.c_str(), SQL_NTS);

//SSN
rc = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 11, 0, (SQLPOINTER)SSN, 0, &cbSSN);

rc = SQLExecute(hstmt);
HandleDiagnosticRecord(hstmt, SQL_HANDLE_STMT, rc);

SQL_DATE_STRUCT dateVal;
SQLWCHAR firstNameVal[50];
SQLWCHAR lastNameVal[50];
SQLCHAR SSNVal[12];
SQLLEN cbdate;   // size of date structure  

int rowcount = 0;
while (SQL_SUCCEEDED(SQLFetch(hstmt)))
{
    rowcount++;
    SQLGetData(hstmt, 1, SQL_C_CHAR, &SSNVal, 11, &cbSSN);
    SQLGetData(hstmt, 2, SQL_C_WCHAR, &firstNameVal, 50, &cbFirstName);
    SQLGetData(hstmt, 3, SQL_C_WCHAR, &lastNameVal, 50, &cbLastName);
    SQLGetData(hstmt, 4, SQL_C_TYPE_DATE, &dateVal, 10, &cbdate);        
}

A rejtjelezett adat visszanyerés példája

Ha az Always Encrypted nincs engedélyezve, a lekérdezések továbbra is lekérhetik az adatokat titkosított oszlopokból, feltéve, hogy a lekérdezés nem tartalmaz titkosított oszlopokat célzó paramétereket.

Az alábbi példa a bináris titkosított adatok titkosított oszlopokból való lekérését mutatja be. Jegyezze fel a következő részleteket:

  • Mivel az Always Encrypted nincs engedélyezve a kapcsolati sztringben, a lekérdezés az SSN és a BirthDate titkosított értékeit adja vissza bájttömbökként (a program sztringekké alakítja az értékeket).
  • Az Always Encrypted letiltott titkosított oszlopaiból adatokat lekérő lekérdezésnek lehetnek paraméterei, feltéve, hogy egyik paraméter sem céloz meg titkosított oszlopot. A fenti lekérdezés a LastName szerint szűr, amely nincs titkosítva az adatbázisban. Ha a lekérdezésT SSN vagy BirthDate szűri, a lekérdezés sikertelen lesz.
SQLCHAR SSN[12];
strcpy_s((char*)SSN, _countof(SSN), "795-73-9838");

SQLWCHAR* firstName = L"Catherine";
SQLWCHAR* lastName = L"Abel";
SQLINTEGER cbSSN = SQL_NTS, cbFirstName = SQL_NTS, cbLastName = SQL_NTS;

SQLRETURN rc = 0;
string empty = "";
string queryText = "SELECT [SSN], [FirstName], [LastName], [BirthDate] " + empty +
    "FROM  [dbo].[Patients]" +
    "WHERE " +
    "[LastName] = ?";

rc = SQLPrepare(hstmt, (SQLCHAR *)queryText.c_str(), SQL_NTS);

//LastName
rc = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_WCHAR, SQL_WCHAR, 50, 0, (SQLPOINTER)lastName, 0, &cbLastName);

rc = SQLExecute(hstmt);
HandleDiagnosticRecord(hstmt, SQL_HANDLE_STMT, rc);

SQL_DATE_STRUCT dateVal;
SQLWCHAR firstNameVal[50];
SQLWCHAR lastNameVal[50];
SQLCHAR SSNVal[12];
SQLLEN cbdate;   // size of date structure  

int rowcount = 0;
while (SQL_SUCCEEDED(SQLFetch(hstmt)))
{
    rowcount++;
    SQLGetData(hstmt, 1, SQL_C_CHAR, &SSNVal, 11, &cbSSN);
    SQLGetData(hstmt, 2, SQL_C_WCHAR, &firstNameVal, 50, &cbFirstName);
    SQLGetData(hstmt, 3, SQL_C_WCHAR, &lastNameVal, 50, &cbLastName);
    SQLGetData(hstmt, 4, SQL_C_TYPE_DATE, &dateVal, 10, &cbdate);        
}

Money/SmallMoney titkosítás

Az illesztőprogram 17.7-es verziójától kezdve az Always Encrypted használható a MONEY és SMALLMONEY típusokkal. Vannak azonban további lépések is. Titkosított MONEY vagy SMALLMONEY oszlopokba való beszúráskor használja az alábbi C-típusok egyikét:

SQL_C_CHAR
SQL_C_WCHAR
SQL_C_SHORT
SQL_C_LONG
SQL_C_FLOAT
SQL_C_DOUBLE
SQL_C_BIT
SQL_C_TINYINT
SQL_C_SBIGINT
SQL_C_NUMERIC

vagy egy SQL-típust SQL_NUMERIC vagy SQL_DOUBLE (a pontosság elveszhet, ha ezt a típust használja).

A változó kötése

Ha egy MONEY/SMALLMONEY változót titkosított oszlopban köt meg, a következő leírómező(ke)t kell beállítani:

// n is the descriptor record of the MONEY/SMALLMONEY parameter
// the type is assumed to be SMALLMONEY if isSmallMoney is true and MONEY otherwise

SQLHANDLE ipd = 0;
SQLGetStmtAttr(hStmt, SQL_ATTR_IMP_PARAM_DESC, (SQLPOINTER)&ipd, SQL_IS_POINTER, NULL);
SQLSetDescField(ipd, n, SQL_CA_SS_SERVER_TYPE, isSmallMoney ? (SQLPOINTER)SQL_SS_TYPE_SMALLMONEY :
                                                              (SQLPOINTER)SQL_SS_TYPE_MONEY, SQL_IS_INTEGER);

// If the variable is bound as SQL_NUMERIC, additional descriptor fields have to be set
// var is SQL_NUMERIC_STRUCT containing the value to be inserted

SQLHDESC   hdesc = NULL;
SQLGetStmtAttr(hStmt, SQL_ATTR_APP_PARAM_DESC, &hdesc, 0, NULL);
SQLSetDescField(hdesc, n, SQL_DESC_PRECISION, (SQLPOINTER)(var.precision), 0);
SQLSetDescField(hdesc, n, SQL_DESC_SCALE, (SQLPOINTER)(var.scale), 0);
SQLSetDescField(hdesc, n, SQL_DESC_DATA_PTR, &var, 0);

A titkosított oszlopok lekérdezésével kapcsolatos gyakori problémák elkerülése

Ez a szakasz az ODBC-alkalmazások titkosított oszlopainak lekérdezésekor előforduló gyakori hibakategóriákat ismerteti, valamint néhány útmutatást az elkerülésükhöz.

Nem támogatott adattípus-konverziós hibák

Az Always Encrypted kevés konverziót támogat a titkosított adattípusokhoz. A támogatott típuskonverziók részletes listáját az Always Encrypted (adatbázismotor) című témakörben találja. Az adattípusok konvertálási hibáinak elkerülése érdekében győződjön meg arról, hogy az SQLBindParameter titkosított oszlopokat célzó paraméterekkel való használatakor a következő pontokat figyeli meg:

  • A paraméter SQL-típusa pontosan megegyezik a megcélzott oszlop típusával, vagy az SQL-típusról az oszlop típusára való konvertálás támogatott.

  • Az decimal és numeric SQL Server-adattípusok oszlopait megcélzó paraméterek pontossága és skálája megegyezik a céloszlophoz konfigurált pontossági és méretezési adatokkal.

  • A céloszlopot módosító lekérdezésekben az , datetime2, vagy datetimeoffset SQL Server-adattípusok oszlopait timemegcélzó paraméterek pontossága nem nagyobb, mint a céloszlop pontossága.

A titkosított értékek helyett egyszerű szöveg átadása miatti hibák

Minden olyan értéket, amely egy titkosított oszlopot céloz meg, titkosítva kell lennie, mielőtt elküldené őket a kiszolgálónak. Ha egy titkosított oszlop egyszerű szöveges értéke alapján próbál meg beszúrni, módosítani vagy szűrni, az hibát fog eredményezni. Az ilyen hibák elkerülése érdekében győződjön meg arról, hogy:

  • Az Always Encrypted engedélyezve van (a DSN-ben, a kapcsolati sztringben, a csatlakozás előtt egy adott kapcsolathoz tartozó kapcsolati attribútum beállításávalSQL_COPT_SS_COLUMN_ENCRYPTION, vagy egy adott utasításhoz tartozó utasításattribútum beállításávalSQL_SOPT_SS_COLUMN_ENCRYPTION).

  • Az SQLBindParameter használatával titkosított oszlopokat célzó adatokat küldhet. Az alábbi példában egy olyan lekérdezés látható, amely helytelenül szűr egy konstans/állandó által egy titkosított oszlopon (SSN- n) ahelyett, hogy argumentumként adná át a literált az SQLBindParameternek.

string queryText = "SELECT [SSN], [FirstName], [LastName], [BirthDate] FROM [dbo].[Patients] WHERE SSN='795-73-9838'";

Óvintézkedések az SQLSetPos és az SQLMoreResults használatakor

SQLSetPos

Az SQLSetPos API lehetővé teszi az alkalmazás számára, hogy az eredményhalmaz sorait az SQLBindCol-hoz kötött pufferek használatával frissítse, amelyekbe korábban beolvasták a soradatokat. A titkosított rögzített hosszúságú típusok aszimmetrikus párnázási viselkedése miatt előfordulhat, hogy váratlanul módosítják ezeknek az oszlopoknak az adatait, miközben frissítéseket végeznek a sor többi oszlopán. Az AE esetén a rögzített hosszúságú karakterértékek ki lesznek jelölve, ha az érték kisebb, mint a puffer mérete.

A viselkedés mérséklése érdekében használja a SQL_COLUMN_IGNORE zászlót azon oszlopok figyelmen kívül hagyására, amelyeket nem frissítenek a SQLBulkOperations részeként és amikor a SQLSetPos-t kurzoralapú frissítésekhez használják. Az alkalmazás által közvetlenül nem módosított összes oszlopot figyelmen kívül kell hagyni mind a teljesítmény, mind a tényleges (DB) méretnél kisebb pufferhez kötött oszlopok csonkolásának elkerülése érdekében. További információ: SQLSetPos függvényhivatkozás.

SQLMoreResults > SQLDescribeCol

Az alkalmazásprogramok meghívhatják az SQLDescribeColt , hogy metaadatokat adjanak vissza az előkészített utasítások oszlopairól. Ha az Always Encrypted engedélyezve van, akkor a SQLMoreResultselőtt végzett hívás SQLDescribeColsp_describe_first_result_set hívást eredményez, ami nem adja vissza helyesen a titkosított oszlopok nyílt szöveges metaadatát. A probléma elkerülése érdekében hívja meg az előkészített utasításokat SQLDescribeCol a hívás előttSQLMoreResults.

Az Always Encrypted teljesítményhatásának szabályozása

Mivel az Always Encrypted egy ügyféloldali titkosítási technológia, a teljesítményterhelés nagy része az ügyféloldalon figyelhető meg, nem az adatbázisban. A titkosítási és visszafejtési műveletek költségein kívül az ügyféloldali teljesítmény egyéb többletterhelési forrásai a következők:

  • A lekérdezési paraméterek metaadatainak lekéréséhez további oda-vissza utak az adatbázisba.

  • Egy oszlop főkulcstárának hívása az oszlop főkulcsának eléréséhez.

Ez a szakasz az SQL Server ODBC-illesztőprogramjának beépített teljesítményoptimalizálásait és a fenti két tényező teljesítményre gyakorolt hatását ismerteti.

Az adatlekérések szabályozása a lekérdezési paraméterek metaadatainak lekéréséhez

Ha az Always Encrypted engedélyezve van egy kapcsolathoz, az illesztőprogram alapértelmezés szerint meghívja sys.sp_describe_parameter_encryption minden paraméteres lekérdezéshez, és átadja a lekérdezési utasítást (paraméterértékek nélkül) az SQL Servernek. Ez a tárolt eljárás elemzi a lekérdezési utasítást annak kiderítéséhez, hogy szükséges-e a paraméterek titkosítása, és ha igen, az egyes paraméterek titkosítással kapcsolatos adatait adja vissza, hogy az illesztőprogram titkosíthassa őket. A fenti viselkedés magas szintű átláthatóságot biztosít az ügyfélalkalmazás számára: Az alkalmazásnak (és az alkalmazásfejlesztőnek) nem kell tudnia, hogy mely lekérdezések férnek hozzá a titkosított oszlopokhoz, feltéve, hogy a titkosított oszlopokat megcélzó értékeket a rendszer a paraméterekben átadja az illesztőprogramnak.

A 17.6-os verziótól kezdve az illesztőprogram az előkészített utasítások titkosítási metaadatait is gyorsítótárazza, ami javítja a teljesítményt azáltal, hogy lehetővé teszi a jövőbeli hívások számára, hogy SQLExecute ne igényeljenek további oda-vissza utazást a titkosítási metaadatok lekéréséhez.

Az utasításonkénti Always Encrypted viselkedés

A paraméteres lekérdezések titkosítási metaadatainak lekérése teljesítményhatásának szabályozásához módosíthatja az Always Encrypted viselkedését az egyes lekérdezések esetében, ha engedélyezve van a kapcsolaton. Így biztosíthatja, hogy sys.sp_describe_parameter_encryption csak olyan lekérdezések esetén legyen meghívva, amelyekről tudja, hogy vannak olyan paraméterek, amelyek titkosított oszlopokat céloznak. Vegye figyelembe azonban, hogy ezzel csökkenti a titkosítás átláthatóságát: ha több oszlopot titkosít az adatbázisban, előfordulhat, hogy módosítania kell az alkalmazás kódját, hogy igazodjon a séma változásaihoz.

Egy utasítás Always Encrypted viselkedésének szabályozásához hívja meg az SQLSetStmtAttr parancsot, hogy az utasításattribútumot SQL_SOPT_SS_COLUMN_ENCRYPTION az alábbi értékek egyikére állítsa:

Érték Description
SQL_CE_DISABLED (0) Az Always Encrypted le van tiltva az utasításhoz
SQL_CE_RESULTSETONLY (1) Csak visszafejtés. Az eredményhalmazok és a visszatérési értékek visszafejtésre kerülnek, és a paraméterek nincsenek titkosítva.
SQL_CE_ENABLED (3) Az Always Encrypted engedélyezve van, és mind paraméterekhez, mind eredményekhez használható

Az Always Encrypted-kompatibilis kapcsolatból létrehozott új utasításkezelők alapértelmezés szerint SQL_CE_ENABLED. A kapcsolatból létrehozott leírók, ha azok le vannak tiltva, alapértelmezés szerint az SQL_CE_DISABLED állapotra kerülnek, és az Always Encrypted nem engedélyezhető rajtuk.

Ha az ügyfélalkalmazás legtöbb lekérdezése titkosított oszlopokat ér el, a következő pontok használata ajánlott:

  • Állítsa a kapcsolati sztring ColumnEncryption kulcsszót Enabled-re.

  • Állítsa be az SQL_SOPT_SS_COLUMN_ENCRYPTION attribútumot SQL_CE_DISABLED olyan utasításokhoz, amelyek nem férnek hozzá a titkosított oszlopokhoz. Ez a beállítás letiltja a sys.sp_describe_parameter_encryption hívásokat és az eredményhalmaz értékeinek visszafejtésére tett kísérleteket is.

  • Állítsa be az SQL_SOPT_SS_COLUMN_ENCRYPTION attribútumot olyan utasításokra SQL_CE_RESULTSETONLY , amelyek nem rendelkeznek titkosítást igénylő paraméterekkel, de titkosított oszlopokból kérnek le adatokat. Ez a beállítás letiltja a hívás- sys.sp_describe_parameter_encryption és paramétertitkosítást. A titkosított oszlopokat tartalmazó eredmények visszafejtése továbbra is megtörténik.

  • Használjon előkészített utasításokat olyan lekérdezésekhez, amelyek többször lesznek végrehajtva; készítse elő a lekérdezést SQLPrepare és mentse az utasításkezelőt, és SQLExecute minden egyes végrehajtáskor újrahasználja. Ez a módszer a teljesítmény előnyben részesített megközelítése akkor is, ha nincsenek titkosított oszlopok, és lehetővé teszi az illesztőprogram számára, hogy kihasználja a gyorsítótárazott metaadatok előnyeit.

Always Encrypted biztonsági beállítások

Kényszerítse az oszloptitkosítást

Egy paraméter titkosításának kényszerítéséhez állítsa be a SQL_CA_SS_FORCE_ENCRYPT implementációs paraméterleíró (IPD) mezőt az SQLSetDescField függvény hívásával. A nem nulla érték miatt az illesztő hibát ad vissza, ha nem ad vissza titkosítási metaadatokat a társított paraméterhez.

SQLHDESC ipd;
SQLGetStmtAttr(hStmt, SQL_ATTR_IMP_PARAM_DESC, &ipd, 0, 0);
SQLSetDescField(ipd, paramNum, SQL_CA_SS_FORCE_ENCRYPT, (SQLPOINTER)TRUE, SQL_IS_SMALLINT);   

Ha az SQL Server tájékoztatja az illesztőprogramot, hogy a paramétert nem kell titkosítani, a paramétert használó lekérdezések sikertelenek lesznek. Ez a viselkedés további védelmet nyújt az olyan biztonsági támadások ellen, amelyek egy sérült SQL Servert érintenek, amely helytelen titkosítási metaadatokat biztosít az ügyfélnek, ami adatfeltárást eredményezhet.

Oszloptitkosítási kulcs gyorsítótárazása

Az oszloptitkosítási kulcsok visszafejtéséhez az oszlop főkulcstárolójába irányuló hívások számának csökkentése érdekében az illesztőprogram gyorsítótárazza a memória egyszerű szöveges CEK-jait. A CEK-gyorsítótár globális az illesztőprogram számára, és nincs egyetlen kapcsolathoz társítva. Miután megkapta az ECEK-et az adatbázis metaadataiból, az illesztőprogram először megpróbálja megtalálni a gyorsítótár titkosított kulcsértékének megfelelő egyszerű szöveges CEK-et. Az illesztőprogram csak akkor hívja meg a CMK-t tartalmazó kulcstárolót, ha nem találja a megfelelő egyszerű szöveges CEK-et a gyorsítótárban.

Megjegyzés:

Az SQL Server ODBC-illesztőprogramjában a gyorsítótár bejegyzései két órás időtúllépés után törlődnek. Ez a viselkedés azt jelenti, hogy egy adott ECEK esetében az illesztőprogram csak egyszer lép kapcsolatba a kulcstárolóval az alkalmazás élettartama alatt, vagy két óránként, attól függően, hogy melyik kevesebb.

Az SQL Server ODBC Driver 17.1-es verziójától kezdve a CEK-gyorsítótár időtúllépése a kapcsolatattribútummal SQL_COPT_SS_CEKCACHETTL módosítható, amely meghatározza, hogy a CEK hány másodpercig maradjon a gyorsítótárban. A gyorsítótár globális jellege miatt ez az attribútum az illesztőre érvényes bármely kapcsolati leíróból módosítható. A gyorsítótár TTL-jének csökkentésekor az új TTL-t meghaladó meglévő CEK-k is törlődnek. Ha 0, akkor a rendszer nem gyorsítótárazza a CEK-eket.

Megbízható kulcs elérési útjai

Az SQL Server ODBC Driver 17.1-től kezdve a SQL_COPT_SS_TRUSTEDCMKPATHS kapcsolati attribútum lehetővé teszi, hogy az alkalmazás megkövetelje, hogy az Always Encrypted-műveletek csak a kulcsútvonalak által azonosított CMK-k megadott listáját használják. Alapértelmezés szerint ez az attribútum NULL, ami azt jelenti, hogy az illesztő elfogadja a kulcs elérési útját. A funkció használatához állítson be SQL_COPT_SS_TRUSTEDCMKPATHS egy null-tagolt, nullával lezárt, széles karakterláncra, amely felsorolja az engedélyezett kulcselérési utakat. Az attribútum által mutatott memóriának érvényesnek kell maradnia a titkosítási vagy visszafejtési műveletek során azon a kapcsolati leíróval, amelyen be van állítva, amin az illesztőprogram ellenőrzi, hogy a kiszolgáló metaadatai által megadott CMK-elérési út esetérzéketlenül szerepel-e ebben a listában. Ha a CMK elérési útja nem szerepel a listában, a művelet meghiúsul. Az alkalmazás módosíthatja a memória tartalmát, amely erre az attribútumra mutat, hogy módosítsa a megbízható CMK-k listáját anélkül, hogy újra beállítja az attribútumot.

Az oszlop főkulcs-tárolóinak használata

Az adatok titkosításához vagy visszafejtéséhez az illesztőprogramnak be kell szereznie a céloszlophoz konfigurált CEK-et. A CEK-k titkosított formában (ECEK-k) vannak tárolva az adatbázis metaadataiban. Minden CEK rendelkezik egy megfelelő CMK-val, amelyet a titkosításhoz használtak. Az adatbázis metaadatai nem tárolják a CMK-t; csak a kulcstár nevét és a kulcstár által a CMK megkereséséhez használható információkat tartalmazza.

Az ECEK egyszerű szöveges értékének lekéréséhez az illesztő először a CEK-ről és a hozzá tartozó CMK-ról is lekéri a metaadatokat, majd ezen információk alapján kapcsolatba lép a CMK-t tartalmazó kulcstárkal, és kéri, hogy fejtse vissza az ECEK-et. Az illesztőprogram egy kulcstár-szolgáltató használatával kommunikál egy kulcstárral.

Beépített kulcstár-szolgáltatók

Az SQL Server ODBC-illesztőprogramja a következő beépített kulcstár-szolgáltatókkal rendelkezik:

Név Description Szolgáltató (metaadatok) neve Availability
Azure Key Vault Egy Azure Key Vaultban tárolja a CMK-kat AZURE_KEY_VAULT Windows, macOS, Linux
Windows tanúsítványtároló CMK-k helyi tárolására a Windows-kulcstárban MSSQL_CERTIFICATE_STORE Windows
  • Önnek (vagy a DBA-nak) meg kell győződnie arról, hogy az oszlop főkulcs metaadataiban konfigurált szolgáltatónév helyes, és az oszlop főkulcsának elérési útja megfelel az adott szolgáltató kulcsútvonal-formátumának. Javasoljuk, hogy a kulcsokat olyan eszközökkel konfigurálja, mint az SQL Server Management Studio, amely automatikusan létrehozza az érvényes szolgáltatóneveket és kulcsútvonalakat a CREATE COLUMN MASTER KEY (Transact-SQL) utasítás kiadásakor.

  • Győződjön meg arról, hogy az alkalmazás hozzáfér a kulcshoz a kulcstárban. Ez a folyamat magában foglalhatja az alkalmazás hozzáférésének biztosítását a kulcshoz és/vagy a kulcstárhoz, attól függően, hogy a kulcstár milyen, illetve más kulcstárspecifikus konfigurációs lépések elvégzését. Egy Azure Key Vault eléréséhez például meg kell adnia a megfelelő hitelesítő adatokat a kulcstárhoz.

Az Azure Key Vault-szolgáltató használata

Az Azure Key Vault (AKV) egy kényelmes lehetőség az Always Encrypted oszlop-főkulcsainak tárolására és kezelésére (különösen akkor, ha az alkalmazások az Azure-ban vannak üzemeltetve). A Linuxon, macOS-en és Windowson futó SQL Server ODBC-illesztőprogramja tartalmaz egy beépített oszlop főkulcstár-szolgáltatót az Azure Key Vaulthoz. Az Azure Key Vault Always Encryptedhez való konfigurálásáról további információt az Azure Key Vault – Lépésről lépésre, a Key Vault használatának első lépései és az Oszlop-főkulcsok létrehozása az Azure Key Vaultban című témakörben talál.

Megjegyzés:

Az ODBC-illesztő csak közvetlenül a Microsoft Entra ID (korábbi nevén Azure Active Directory) alapján támogatja az AKV-hitelesítést. Ha Microsoft Entra-hitelesítést használ az AKV-hoz, és a konfigurációhoz hitelesítésre van szükség az Active Directory összevonási szolgáltatások végpontja ellen, a hitelesítés sikertelen lehet. Linuxon és macOS-en a 17.2-es és újabb illesztőprogram-verzióhoz ez a szolgáltató szükséges, libcurl de nem explicit függőség, mivel az illesztőprogrammal végzett egyéb műveletekhez nincs szükség rá. Ha hibába libcurlütközik, győződjön meg arról, hogy telepítve van.

Az illesztőprogram a következő hitelesítő adatok típusok használatával támogatja az Azure Key Vaultba való hitelesítést:

  • Felhasználónév/jelszó – ezzel a módszerrel a hitelesítő adatok egy Microsoft Entra-felhasználó neve és jelszava.

  • Ügyfélazonosító/titkos kód – ezzel a módszerrel a hitelesítő adatok egy alkalmazás ügyfél-azonosítója és egy alkalmazáskulcs.

  • Felügyelt identitás (17.5.2+) – rendszer vagy felhasználó által hozzárendelt; További információt az Azure-erőforrások felügyelt identitásai című témakörben talál.

  • Azure Key Vault Interactive (17.7+ Windows-illesztőprogramok) – ezzel a módszerrel a hitelesítő adatok a Microsoft Entra ID-vel és bejelentkezési ID-vel hitelesítettek.

Ha lehetővé szeretné tenni az illesztőprogram számára, hogy az AKV-ban tárolt CMK-okat használja az oszloptitkosításhoz, használja a következő csak kapcsolati sztringre vonatkozó kulcsszavakat:

Igazolás típusa KeyStoreAuthentication KeyStorePrincipalId KeyStoreSecret
Felhasználónév/jelszó KeyVaultPassword Felhasználói főnév Jelszó
Ügyfélazonosító/titkos kód KeyVaultClientSecret Ügyfélazonosító Titok
Felügyelt identitás KeyVaultManagedIdentity Objektumazonosító (nem kötelező, csak felhasználó által hozzárendelt esetén) (nincs megadva)
AKV Interactive KeyVaultInteractive (nincs beállítva) (nincs beállítva)

A 17.8-as verziótól kezdve a KeystoreAuthentication és a KeystorePrincipalId a DSN konfigurációs felhasználói felületével szerkeszthető az ODBC adatforrás-rendszergazdájában.

Példa kapcsolati sztringekre

Az alábbi kapcsolati sztringek bemutatják, hogyan hitelesíthető az Azure Key Vaultban a két hitelesítő adattípussal:

Ügyfélazonosító/Titok
"DRIVER=ODBC Driver 18 for SQL Server;SERVER=myServer;Encrypt=yes;Trusted_Connection=Yes;DATABASE=myDB;ColumnEncryption=Enabled;KeyStoreAuthentication=KeyVaultClientSecret;KeyStorePrincipalId=<clientId>;KeyStoreSecret=<secret>"
Felhasználónév/jelszó
"DRIVER=ODBC Driver 18 for SQL Server;SERVER=myServer;Encrypt=yes;Trusted_Connection=Yes;DATABASE=myDB;ColumnEncryption=Enabled;KeyStoreAuthentication=KeyVaultPassword;KeyStorePrincipalId=<username>;KeyStoreSecret=<password>"
Felügyelt identitás (rendszer által hozzárendelt)
"DRIVER=ODBC Driver 18 for SQL Server;SERVER=myServer;Encrypt=yes;Trusted_Connection=Yes;DATABASE=myDB;ColumnEncryption=Enabled;KeyStoreAuthentication=KeyVaultManagedIdentity"
Felügyelt identitás (felhasználó által hozzárendelt)
"DRIVER=ODBC Driver 18 for SQL Server;SERVER=myServer;Encrypt=yes;Trusted_Connection=Yes;DATABASE=myDB;ColumnEncryption=Enabled;KeyStoreAuthentication=KeyVaultManagedIdentity;KeyStorePrincipalId=<objectID>"
AKV Interactive
"DRIVER=ODBC Driver 18 for SQL Server;SERVER=myServer;Encrypt=yes;Trusted_Connection=Yes;DATABASE=myDB;ColumnEncryption=Enabled;KeyStoreAuthentication=KeyVaultInteractive;UID=<userID>;PWD=<password>"

Az AKV CMK-tárolóhoz való használatához nincs szükség más ODBC-alkalmazásmódosításra.

Megjegyzés:

Az illesztőprogram tartalmazza a megbízható AKV-végpontok listáját. Az illesztőprogram 17.5.2-es verziójától kezdve ez a lista konfigurálható: állítsa be a tulajdonságot az illesztőprogramban vagy a DSN ODBCINST.INI vagy ODBC.INI beállításkulcsban (Windows), illetve a odbcinst.ini vagy odbc.ini fájlszakaszban (Linux/macOS) pontosvesszővel tagolt listára. A DSN-ben való beállítás elsőbbséget élvez az illesztőprogram egy beállításával szemben. Ha az érték pontosvesszővel kezdődik, kiterjeszti az alapértelmezett listát; ellenkező esetben lecseréli az alapértelmezett listát. Az alapértelmezett lista (17,5-ből) a következő vault.azure.net;vault.azure.cn;vault.usgovcloudapi.net;vault.microsoftazure.de. A 17.7-től kezdődően a lista tartalmazza managedhsm.azure.net;managedhsm.azure.cn;managedhsm.usgovcloudapi.net;managedhsm.microsoftazure.de.

Megjegyzés:

Az ODBC-illesztőprogramba beépített Azure Key Vault-szolgáltató támogatja az Azure Key Vault tárolóit és felügyelt HSM-eit is.

A Windows tanúsítványtároló-szolgáltató használata

A Windows rendszeren futó SQL Server ODBC-illesztőprogramja tartalmaz egy beépített főkulcstároló-szolgáltatót az oszlopok számára a Windows Tanúsítványtárolóhoz, amelynek neve MSSQL_CERTIFICATE_STORE. (Ez a szolgáltató nem érhető el macOS vagy Linux rendszeren.) Ezzel a szolgáltatóval a CMK helyben lesz tárolva az ügyfélszámítógépen, és az alkalmazás nem igényel további konfigurációt az illesztőprogrammal való használatához. Az alkalmazásnak azonban hozzá kell férnie a tanúsítványhoz és annak titkos kulcsához az áruházban. További információ: Oszlop főkulcsainak létrehozása és tárolása (Always Encrypted)

Egyéni kulcstár-szolgáltatók használata

Az SQL Server ODBC-illesztője a CEKeystoreProvider interfészt használó egyéni külső kulcstár-szolgáltatókat is támogatja. Ez a funkció lehetővé teszi, hogy az alkalmazás betöltse, lekérdezhesse és konfigurálja a kulcstár-szolgáltatókat, hogy az illesztőprogram használhassa őket a titkosított oszlopok eléréséhez. Az alkalmazások közvetlenül is kommunikálhatnak egy kulcstárszolgáltatóval a CEK-k SQL Server-tárolók titkosítása érdekében, és a titkosított oszlopok ODBC-vel való elérésén túli feladatokat is végrehajthatnak; További információ: Egyéni kulcstár-szolgáltatók.

A rendszer két kapcsolati attribútumot használ az egyéni kulcstár-szolgáltatókkal való interakcióhoz. Ezek a következők:

  • SQL_COPT_SS_CEKEYSTOREPROVIDER

  • SQL_COPT_SS_CEKEYSTOREDATA

Az előbbi a betöltött kulcstár-szolgáltatók betöltésére és számbavételére szolgál, míg az utóbbi lehetővé teszi az alkalmazásszolgáltatói kommunikációt. Ezek a kapcsolatattribútumok a kapcsolat létrehozása előtt vagy után bármikor használhatók, mivel az alkalmazásszolgáltatói interakció nem jár az SQL Serverrel való kommunikációval. Mivel azonban az illesztő még nincs betöltve, a csatlakozás előtt ezeknek az attribútumoknak a beállítása és lekérése azt eredményezi, hogy az illesztőprogram-kezelő feldolgozta őket, és nem biztos, hogy a várt eredményt adja.

Keystore tároló betöltése

A kapcsolati SQL_COPT_SS_CEKEYSTOREPROVIDER attribútum beállítása lehetővé teszi, hogy az ügyfélalkalmazás betöltse a szolgáltatói kódtárat, és elérhetővé tegye az ott található kulcstár-szolgáltatók használatát.

SQLRETURN SQLSetConnectAttr( SQLHDBC ConnectionHandle, SQLINTEGER Attribute, SQLPOINTER ValuePtr, SQLINTEGER StringLength);
Argument Description
ConnectionHandle [Bemenet] Kapcsolati leíró. Érvényes kapcsolati leírónak kell lennie, de a kapcsolat egyik leírója által betöltött szolgáltatók ugyanazon folyamat bármely más leírójával is elérhetők.
Attribute [Bemenet] Beállítandó attribútum: az SQL_COPT_SS_CEKEYSTOREPROVIDER állandó.
ValuePtr [Bemenet] Mutató egy nullával lezárt karakterláncra, amely a szolgáltatói kódtár fájlnevét adja meg. Az SQLSetConnectAttrA esetében ez az érték egy ANSI (többbájtos) sztring. Az SQLSetConnectAttrW esetében ez az érték Unicode (wchar_t) karakterlánc.
StringLength [Bemenet] A ValuePtr sztring vagy SQL_NTS hossza.

Az illesztőprogram megpróbálja betölteni a ValuePtr paraméter által azonosított kódtárat a platform által definiált dinamikus kódtár betöltési mechanizmusával (dlopen() Linuxon és macOS-en, LoadLibrary() Windows rendszeren), és hozzáadja az ott definiált összes szolgáltatót az illesztőprogram által ismert szolgáltatók listájához. A következő hibák fordulhatnak elő:

Error Description
CE203 A dinamikus kódtár nem tölthető be.
CE203 A "CEKeyStoreProvider" exportált szimbólum nem található a könyvtárban.
CE203 A könyvtárban egy vagy több szolgáltató már be van töltve.

SQLSetConnectAttr A szokásos hiba- vagy sikerértékeket adja vissza, és további információk érhetők el a standard ODBC diagnosztikai mechanizmuson keresztül előforduló hibákról.

Megjegyzés:

Az alkalmazásprogramozónak gondoskodnia kell arról, hogy minden egyéni szolgáltató betöltve legyen, mielőtt bármilyen kapcsolaton keresztül elküldené az őket igénylő lekérdezéseket. Ennek elmulasztása a következő hibát eredményezi:

Error Description
CE200 A kulcstár-szolgáltató %1 nem található. Győződjön meg arról, hogy a megfelelő kulcstár-szolgáltatói kódtár be lett töltve.

Megjegyzés:

A keystore szolgáltatók implementálóinak kerülniük kell az MSSQL használatát az egyedi szolgáltatók nevében. Ez a kifejezés kizárólag Microsoft-használatra van fenntartva, és ütközéseket okozhat a jövőbeli beépített szolgáltatókkal. Ha ezt a kifejezést egy egyéni szolgáltató nevében használja, az ODBC-figyelmeztetést eredményezhet.

A betöltött szolgáltatók listájának lekérése

A kapcsolati attribútum beszerzése lehetővé teszi, hogy az ügyfélalkalmazás meghatározza az illesztőprogramba jelenleg betöltött kulcstár-szolgáltatókat (beleértve a beépített szolgáltatókat is).) Ez a folyamat csak a csatlakozás után hajtható végre.

SQLRETURN SQLGetConnectAttr( SQLHDBC ConnectionHandle, SQLINTEGER Attribute, SQLPOINTER ValuePtr, SQLINTEGER BufferLength, SQLINTEGER * StringLengthPtr);
Argument Description
ConnectionHandle [Bemenet] Kapcsolati kezelő. Érvényes kapcsolati leírónak kell lennie, de az egyik kapcsolati fogóponton keresztül betöltött szolgáltatók elérhetők azonos folyamat bármely más fogópontján keresztül is.
Attribute [Bemenet] Lekérendő attribútum: az SQL_COPT_SS_CEKEYSTOREPROVIDER állandó.
ValuePtr [Kimenet] Egy mutató a memóriában, ahová a következő betöltött szolgáltató nevét vissza kell adni.
BufferLength [Bemenet] A puffer ValuePtr hossza.
StringLengthPtr [Kimenet] Egy puffer mutatója, amelyben visszaadható a *ValuePtr-ben a bájtok teljes száma (kivéve a null-végződtető karaktert). Ha a ValuePtr null mutató, a függvény nem ad vissza hosszt. Ha az attribútum értéke egy karaktersztring, és a visszaadható bájtok száma nagyobb, mint a BufferLength mínusz a nullázáró karakter hossza, akkor a *ValuePtr-ben lévő adatokat a BufferLength mínusz a nullázáró karakter hossza értékig csonkolja, és a meghajtó nullával lezárja.

A teljes lista lekérésének engedélyezéséhez minden Get művelet visszaadja az aktuális szolgáltató nevét, és egy belső számlálót növekményez a következőre. Ha ez a számláló eléri a lista végét, a rendszer egy üres sztringet ("") ad vissza, és a számláló alaphelyzetbe áll; az egymást követő Get műveletek ezt követően ismét a lista elejétől folytatódnak.

Kommunikáció a keystore-szolgáltatókkal

A SQL_COPT_SS_CEKEYSTOREDATA kapcsolatattribútum lehetővé teszi, hogy az ügyfélalkalmazás kommunikáljon a betöltött kulcstár-szolgáltatókkal további paraméterek, kulcsanyag és egyéb beállítások konfigurálására. Az ügyfélalkalmazás és a szolgáltató közötti kommunikáció egy egyszerű kérés-válasz protokollt követ, amely a kérések lekérése és beállítása ezen kapcsolatattribútum használatával történik. A kommunikációt csak az ügyfélalkalmazás kezdeményezi.

Megjegyzés:

Az ODBC-hívások jellege miatt (mint például az SQLGet/SetConnectAttr) a CEKeyStoreProvider az ODBC-felületen csak a kapcsolati kontextusban támogatja az adatok beállítását.

Az alkalmazás az illesztőprogramon keresztül kommunikál a kulcstár-szolgáltatókkal a CEKeystoreData struktúrán keresztül:

typedef struct CEKeystoreData {
wchar_t *name;
unsigned int dataSize;
char data[];
} CEKEYSTOREDATA;
Argument Description
name [Bemenet] A beállítás után annak a szolgáltatónak a neve, amelyhez az adatokat elküldik. A "Get" parancs figyelmen kívül van hagyva. Null-terminált, széles karakterlánc.
dataSize [Bemenet] Az adattömb mérete a struktúrát követve.
data [InOut] A beállítás után a szolgáltatónak küldendő adatok. Ezek az adatok tetszőlegesek lehetnek; az illesztőprogram nem próbálja értelmezni. A puffer a szolgáltatótól beolvasott adatok fogadására szolgál Get esetén.

Adatok írása szolgáltatónak

Az SQLSetConnectAttr attribútumot használó SQL_COPT_SS_CEKEYSTOREDATA hívás adatcsomagot ír a megadott kulcstár-szolgáltatónak.

SQLRETURN SQLSetConnectAttr( SQLHDBC ConnectionHandle, SQLINTEGER Attribute, SQLPOINTER ValuePtr, SQLINTEGER StringLength);
Argument Description
ConnectionHandle [Bemenet] Kapcsolati kezelő. Érvényes kapcsolati leírónak kell lennie, de az egyik kapcsolati fogóponton keresztül betöltött szolgáltatók elérhetők azonos folyamat bármely más fogópontján keresztül is.
Attribute [Bemenet] Beállítandó attribútum: az SQL_COPT_SS_CEKEYSTOREDATA állandó.
ValuePtr [Bemenet] Mutató egy CEKeystoreData-struktúrára. A struktúra névmezője azonosítja azt a szolgáltatót, amelyhez az adatokat szánják.
StringLength [Bemenet] SQL_IS_POINTER állandó

Részletesebb hibainformációk az SQLGetDiacRecen keresztül szerezhetőek be.

Megjegyzés:

A szolgáltató a kapcsolati leíróval társíthatja az írott adatokat egy adott kapcsolathoz, ha úgy kívánja. Ez a funkció hasznos a kapcsolatonkénti konfiguráció implementálásához. Emellett figyelmen kívül hagyhatja a kapcsolati környezetet, és az adatokat ugyanúgy kezelheti, függetlenül az adatok küldéséhez használt kapcsolattól. További információ: Környezeti társítás.

Adatok beolvasása szolgáltatótól

Az attribútum használatára irányuló SQLGetConnectAttr hívás beolvassa az SQL_COPT_SS_CEKEYSTOREDATA adatok "csomagját" az utolsóként írt szolgáltatótól. Ha nem volt ilyen, függvényütemezési hiba lép fel. A Keystore szolgáltató implementálóinak javasoljuk, hogy támogassák a 0 bájtos "dummy írásokat", hogy más mellékhatások nélkül választhassák ki a szolgáltatót olvasási műveletekhez, ha van értelme.

SQLRETURN SQLGetConnectAttr( SQLHDBC ConnectionHandle, SQLINTEGER Attribute, SQLPOINTER ValuePtr, SQLINTEGER BufferLength, SQLINTEGER * StringLengthPtr);
Argument Description
ConnectionHandle [Bemenet] Kapcsolati kezelő. Érvényes kapcsolati leírónak kell lennie, de az egyik kapcsolati fogóponton keresztül betöltött szolgáltatók elérhetők azonos folyamat bármely más fogópontján keresztül is.
Attribute [Bemenet] Lekérendő attribútum: az SQL_COPT_SS_CEKEYSTOREDATA állandó.
ValuePtr [Kimenet] Egy CEKeystoreData-struktúra mutatója, amelyben a szolgáltatótól beolvasott adatok el lesznek helyezve.
BufferLength [Bemenet] SQL_IS_POINTER állandó
StringLengthPtr [Kimenet] Egy olyan pufferre mutató mutató, amelyben a BufferLength értéket adja vissza. Ha a *ValuePtr null mutató, a függvény nem ad vissza hosszt.

A hívónak biztosítania kell, hogy a CEKEYSTOREDATA struktúra után egy megfelelő hosszúságú puffer legyen lefoglalva, amelybe a szolgáltató beírhat. Visszatéréskor a dataSize mező frissül a szolgáltatótól beolvasott adatok tényleges hosszával. Részletesebb hibainformációk az SQLGetDiacRecen keresztül szerezhetőek be.

Ez a felület nem támaszt további követelményeket az alkalmazás és a kulcstár-szolgáltató között továbbított adatok formátumára vonatkozóan. Minden szolgáltató saját protokoll-/adatformátumot határozhat meg az igényeitől függően.

Példa a saját kulcstár-szolgáltató implementálására: Egyéni kulcstár-szolgáltatók

Az ODBC-illesztő korlátozásai az Always Encrypted használatakor

Aszinkron műveletek

Bár az ODBC-illesztő engedélyezi az aszinkron műveletek használatát az Always Encrypted használatával, az Always Encrypted engedélyezése esetén a teljesítmény hatással van a műveletekre. Az utasítás titkosítási metaadatainak meghatározására szolgáló sys.sp_describe_parameter_encryption hívás blokkolva van, és az illesztőprogram megvárja, amíg a kiszolgáló visszaadja a metaadatokat, mielőtt visszatérne SQL_STILL_EXECUTING.

Adatok lekérése részekben az SQLGetData használatával

Az SQL Server ODBC Driver 17-et megelőzően a titkosított karakterek és bináris oszlopok nem kérhetők le az SQLGetData részeiben. Az SQLGetData-ra csak egy hívás indítható, amely elegendő hosszúságú pufferrel rendelkezik a teljes oszlop adatainak tárolásához.

Adatok küldése részekben az SQLPutData használatával

Az SQL Server ODBC Driver 17.3-at megelőzően a beszúrási vagy összehasonlítási adatok nem küldhetők el az SQLPutData-tal rendelkező részekben. Az SQLPutData-ra csak egy hívás indítható, a teljes adatokat tartalmazó pufferrel. A hosszú adatok titkosított oszlopokba való beszúrásához használja a következő szakaszban ismertetett Tömeges másolás API-t egy bemeneti adatfájllal.

Kriptovaluta és aprópénz

A titkosított pénz vagy kisszekció oszlopokat nem lehet paraméterekkel célozni, mivel nincs konkrét ODBC-adattípus, amely megfelelteti ezeket a típusokat, ami operandus típusütközési hibákat eredményez.

Titkosított oszlopok tömeges másolása

Az SQL Bulk Copy függvény és a bcp segédprogram használata az Always Encrypted szolgáltatással támogatott, mivel az SQL Server ODBC Driver 17-et használ. Az szöveges tartalom (a beszúrás során titkosított és a visszafejtés során visszaállított) és a titkosított szöveg (átvitt szó szerinti) is beszúrható és lekérhető a Tömeges másolás (bcp_*) API-k és a bcp segédprogram használatával.

  • Ha varbinary(max) formában szeretné lekérni a rejtjelszöveget (például egy másik adatbázisba való tömeges betöltéshez), csatlakozzon a ColumnEncryption opció nélkül (vagy állítsa Disabled), és hajtson végre egy BCP OUT műveletet.

  • Ha egyszerű szöveget szeretne beszúrni ColumnEncryption és lekérni, és lehetővé szeretné tenni, hogy az illesztőprogram szükség szerint transzparensen végezzen titkosítást és visszafejtést, a beállítás Enabled elegendő. A BCP API működése egyébként változatlan.

  • Ha a rejtjelszöveget varbinary(max) formában szeretné beszúrni (például a fenti módon), állítsa a BCPMODIFYENCRYPTED beállítást IGAZ értékre, és hajtson végre egy BCP IN műveletet. Az eredményként kapott adatok visszafejtéséhez győződjön meg arról, hogy a céloszlop CEK-jének CEK-címe megegyezik azzal, amelyből a rejtjelszöveget eredetileg beszerezték.

A bcp segédprogram használata esetén: A ColumnEncryption beállítás szabályozásához használja a -D beállítást, és adjon meg egy DSN-t, amely tartalmazza a kívánt értéket. A rejtjelszöveg beszúrásához győződjön meg arról, hogy a ALLOW_ENCRYPTED_VALUE_MODIFICATIONS felhasználó beállítása engedélyezve van.

Az alábbi táblázat a titkosított oszlopon végzett műveletek összegzését tartalmazza:

ColumnEncryption BCP iránya Description
Disabled OUT (ügyfél részére) Beolvassa a rejtjelszöveget. A megfigyelt adattípus varbinary(max).
Enabled OUT (az ügyfélnek) Egyszerű szöveg beolvasása. Az illesztőprogram visszafejti az oszlopadatokat.
Disabled IN (kiszolgálóra) Rejtjelszöveg beszúrása. Ez a beállítás a titkosított adatok átlátszatlan áthelyezésére szolgál anélkül, hogy visszafejtést igényelne. A művelet sikertelen lesz, ha a ALLOW_ENCRYPTED_VALUE_MODIFICATIONS beállítás nincs beállítva a felhasználón, vagy a BCPMODIFYENCRYPTED nincs beállítva a kapcsolati leírón. További információkért lásd alább.
Enabled IN (kiszolgálóra) Szimpla szöveg beszúrása. Az illesztőprogram titkosítja az oszlopadatokat.

A BCPMODIFYENCRYPTED opció

Az adatok sérülésének megakadályozása érdekében a kiszolgáló általában nem engedélyezi a rejtjelszöveg közvetlen beszúrását egy titkosított oszlopba, ezért az erre tett kísérletek sikertelenek lesznek; A titkosított adatok BCP API-val történő tömeges betöltése esetén azonban a BCPMODIFYENCRYPTEDbcp_control beállítás IGAZ értékre állítása lehetővé teszi a rejtjelszöveg közvetlen beszúrását, és csökkenti a titkosított adatok sérülésének kockázatát a ALLOW_ENCRYPTED_VALUE_MODIFICATIONS felhasználói fiók beállításával szemben. Ennek ellenére a kulcsoknak meg kell egyeznie az adatokkal, és érdemes a beszúrt adatok írásvédett ellenőrzését elvégezni a tömeges beszúrás után és a további használat előtt.

További információ: Bizalmas adatok migrálása Always Encryptedáltal védett.

Always Encrypted API összefoglalása

Kapcsolati karakterlánc kulcsszavak

Név Description
ColumnEncryption Az elfogadott értékek a következők Enabled/Disabled: .
Enabled - engedélyezi az Always Encrypted funkciót a kapcsolathoz.
Disabled - tiltsa le az Always Encrypted funkciót a kapcsolathoz.
az igazolási protokoll, az igazolás URL-címe – (17.4-es és újabb verzió) lehetővé teszi az Always Encrypted biztonságos enklávéval való használatát a megadott igazolási protokoll és az igazolási URL-cím használatával.

Az alapértelmezett érték a Disabled.
KeyStoreAuthentication Érvényes értékek: KeyVaultPassword, KeyVaultClientSecret, , KeyVaultInteractiveKeyVaultManagedIdentity
KeyStorePrincipalId Amikor KeyStoreAuthentication = KeyVaultPassword, állítsa be ezt az értéket egy érvényes Microsoft Entra felhasználónévre.
Ha KeyStoreAuthentication = KeyVaultClientSecret ezt az értéket egy érvényes Microsoft Entra-alkalmazásügyfél-azonosítóra állítja be
Amikor KeyStoreAuthentication = KeyVaultManagedIdentity, állítsa ezt az értéket egy felhasználó által hozzárendelt felügyelt identitás objektumazonosítójára. Ha nincs megadva érték, a rendszer a rendszer által hozzárendelt felügyelt identitást használja.
KeyStoreSecret Amikor KeyStoreAuthentication = KeyVaultPassword ezt az értéket a megfelelő felhasználónév jelszavára állítja be.
Ha KeyStoreAuthentication = KeyVaultClientSecret ezt az értéket egy érvényes Microsoft Entra-alkalmazásügyfél-azonosítóhoz társított alkalmazástitkra állítja be

Kapcsolati attribútumok

Név Típus Description
SQL_COPT_SS_COLUMN_ENCRYPTION Előcsatlakozás SQL_COLUMN_ENCRYPTION_DISABLE (0) – Az Always Encrypted letiltása
SQL_COLUMN_ENCRYPTION_ENABLE (1) – Always Encrypted engedélyezése
Karaktersorra mutató *attestation protocol*,*attestation URL* – (17.4-es és újabb verzió) biztonságos enklávéval van engedélyezve
SQL_COPT_SS_CEKEYSTOREPROVIDER Csatlakozás utáni [Beállítás] – Kísérlet a CEKeystoreProvider betöltésére
[Get] – CEKeystoreProvider név visszaadása
SQL_COPT_SS_CEKEYSTOREDATA Csatlakozás utáni [Beállítás] – Adatok írása a CEKeystoreProviderbe
[Get] – Adatok olvasása a CEKeystoreProviderből
SQL_COPT_SS_CEKCACHETTL Csatlakozás utáni [Beállítás] – A CEK-gyorsítótár TTL-jének beállítása
[Get] – Az aktuális CEK cache TTL lekérése
SQL_COPT_SS_TRUSTEDCMKPATHS Csatlakozás utáni [Beállítás] – A megbízható CMK-elérési utak mutatójának beállítása
[Get] – Az aktuális megbízható CMK-elérési utak mutatójának lekérése

Kifejezésattribútumok

Név Description
SQL_SOPT_SS_COLUMN_ENCRYPTION SQL_CE_DISABLED (0) – Az Always Encrypted le van tiltva az utasításhoz
SQL_CE_RESULTSETONLY (1) – Csak visszafejtés. Az eredményhalmazok és a visszatérési értékek vissza vannak fejtve, és a paraméterek nincsenek titkosítva.
SQL_CE_ENABLED (3) – Az Always Encrypted engedélyezve van, és mind paraméterekhez, mind eredményekhez használható

Leíró mezők

IPD-mező Méret/típus Alapértelmezett érték Description
SQL_CA_SS_FORCE_ENCRYPT (1236) WORD (2 bájt) 0 Ha 0 (alapértelmezett): a paraméter titkosításának döntését a titkosítási metaadatok rendelkezésre állása határozza meg.

Ha nem nulla: ha titkosítási metaadatok állnak rendelkezésre ehhez a paraméterhez, titkosítva van. Ellenkező esetben a kérés nem sikerül [CE300] [Microsoft][ODBC Driver 17 for SQL Server] hibával: Kötelező titkosítást adtak meg egy paraméterhez, de a kiszolgáló nem biztosított hozzá titkosítási metaadatokat.

bcp_control lehetőségek

Beállítás neve Alapértelmezett érték Description
BCPMODIFYENCRYPTED (21) FALSE Igaz érték esetén a varbináris(max) értékek beszúrhatók egy titkosított oszlopba. HA HAMIS, megakadályozza a beszúrást, kivéve, ha helyes típus- és titkosítási metaadatokat ad meg.

Hibaelhárítás

Ha nehézségekbe ütközik az Always Encrypted használata során, először ellenőrizze a következő pontokat:

  • A kívánt oszlopot titkosító CEK megtalálható és elérhető a kiszolgálón.

  • A CEK-et titkosító CMK elérhető metaadatokkal rendelkezik a kiszolgálón, és az ügyfélről is elérhető.

  • ColumnEncryption engedélyezve van a DSN-ben, a kapcsolati sztringben vagy a kapcsolati attribútumban. Ha a biztonságos enklávét használja, a formátum helyes legyen.

A biztonságos enklávé használatakor az igazolási hibák az igazolási folyamat azon lépését azonosítják, amelyben a hiba történt, az alábbi táblázat szerint:

Step Description
0-99 Érvénytelen igazolási válasz vagy aláírás-ellenőrzési hiba.
100-199 Hiba történt a tanúsítványok igazolási URL-címéről való lekérésekor. Győződjön meg arról <attestation URL>/v2.0/signingCertificates , hogy érvényes és elérhető.
200-299 Az enklávé identitásának váratlan vagy helytelen formátuma.
300-399 Hiba történt a biztonságos csatorna enklávéval való létrehozásakor.

Lásd még