{"id":10334,"date":"2023-11-29T12:10:03","date_gmt":"2023-11-29T11:10:03","guid":{"rendered":"https:\/\/blog.capdata.fr\/?p=10334"},"modified":"2023-12-06T17:28:44","modified_gmt":"2023-12-06T16:28:44","slug":"le-chiffrement-et-sql-server-episode-3-always-encrypted","status":"publish","type":"post","link":"https:\/\/blog.capdata.fr\/index.php\/le-chiffrement-et-sql-server-episode-3-always-encrypted\/","title":{"rendered":"Le chiffrement et SQL Server &#8211; Episode 3 : Always Encrypted"},"content":{"rendered":"<a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-twitter nolightbox\" data-provider=\"twitter\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Twitter\" href=\"https:\/\/twitter.com\/intent\/tweet?url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F10334&#038;text=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"twitter\" title=\"Share on Twitter\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/twitter.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-linkedin nolightbox\" data-provider=\"linkedin\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Linkedin\" href=\"https:\/\/www.linkedin.com\/shareArticle?mini=true&#038;url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F10334&#038;title=Le%20chiffrement%20et%20SQL%20Server%20%E2%80%93%20Episode%203%20%3A%20Always%20Encrypted\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"linkedin\" title=\"Share on Linkedin\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/linkedin.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-mail nolightbox\" data-provider=\"mail\" rel=\"nofollow\" title=\"Share by email\" href=\"mailto:?subject=Le%20chiffrement%20et%20SQL%20Server%20%E2%80%93%20Episode%203%20%3A%20Always%20Encrypted&#038;body=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20:%20https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F10334\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"mail\" title=\"Share by email\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/mail.png\" \/><\/a><p>Comme nous l&#8217;avions vu dans le premier <a href=\"https:\/\/blog.capdata.fr\/index.php\/le-chiffrement-et-sql-server-episode-1-transparent-data-encryption-tde-vs-always-encrypted\/\">\u00e9pisode<\/a> de cette s\u00e9rie sur le chiffrement dans SQL Server, la solution la plus rigoureuse pour le chiffrement des donn\u00e9es reste Always Encrypted. Celle-ci peut s&#8217;appliquer en compl\u00e9ment de <a href=\"https:\/\/blog.capdata.fr\/index.php\/le-chiffrement-et-sql-server-episode-2-mise-en-oeuvre-de-tde\/\">TDE<\/a> qui lui va s&#8217;occuper de prot\u00e9ger l&#8217;int\u00e9gralit\u00e9 des donn\u00e9es et notamment ces backups. Always Encrypted, lui, travaille sur par colonne par colonne et partage les \u00e9l\u00e9ments cryptographique avec le composant applicatif qui veut lire ou \u00e9crire les donn\u00e9es, de mani\u00e8re \u00e0 que SQL Server ne voit pas les donn\u00e9es en clair (ou presque : nous parlerons des Secure Enclaves plus loin)<\/p>\n<h1>Les objets cryptographiques derri\u00e8re Always Encrypted :<\/h1>\n<p>La technologie derri\u00e8re Always Encrypted repose sur des cl\u00e9s de chiffrements.<\/p>\n<p>La premi\u00e8re est la Column Master Key (ou CMK). C&#8217;est une cl\u00e9 RSA de 2048 bits qui sert \u00e0 chiffr\u00e9 les cl\u00e9s de chiffrement de donn\u00e9es. C&#8217;est cette cl\u00e9 que l&#8217;on devra s\u00e9curiser et que l&#8217;on doit administrer avec pr\u00e9caution. C&#8217;est aussi celle-ci que le composant applicatif devra \u00eatre capable de lire pour chiffrer et d\u00e9chiffrer les donn\u00e9es. Cette cl\u00e9 peut-\u00eatre stock\u00e9e soit dans le magasin de certificat Windows, soit le magasin certificat Java si on d\u00e9veloppe avec le driver JDBC, soit dans un Azure Key Vault. Aucun autre support de gestion de cette cl\u00e9 n&#8217;est disponible pour le moment. Si notre composant applicatif est sous Linux on peut cependant utiliser un Azure Key Vault (par exemple, avec le driver PHP : <a href=\"https:\/\/learn.microsoft.com\/fr-fr\/sql\/connect\/php\/using-always-encrypted-php-drivers?view=sql-server-ver16\">https:\/\/learn.microsoft.com\/fr-fr\/sql\/connect\/php\/using-always-encrypted-php-drivers?view=sql-server-ver16<\/a> ) ou le driver JDBC (<a href=\"https:\/\/learn.microsoft.com\/fr-fr\/sql\/connect\/jdbc\/using-always-encrypted-with-the-jdbc-driver?view=sql-server-ver16\">https:\/\/learn.microsoft.com\/fr-fr\/sql\/connect\/jdbc\/using-always-encrypted-with-the-jdbc-driver?view=sql-server-ver16<\/a> ).<\/p>\n<p>Dans cet article, nous nous concentrerons sur l&#8217;Azure Key Vault et le magasin de certificat Windows.<\/p>\n<p>La deuxi\u00e8me est la Column Encryption Key (CEK). Elle sert \u00e0 chiffrer les donn\u00e9es dans la colonne de notre base. Le chiffrement des donn\u00e9es se fait par un algorithme publique et reconnu : <strong>AEAD_AES_256_CBC_HMAC_SHA_256<\/strong> , qui est document\u00e9 par l&#8217;IETF. Cela veut dire qu&#8217;\u00e0 partir que si le stockage de la cl\u00e9 est s\u00e9curis\u00e9, on peut avoir confiance en ce chiffrement. Dans le cas o\u00f9 la CMK est stock\u00e9e dans l&#8217;Azure Key Vault, Microsoft (et donc le gouvernement am\u00e9ricain, m\u00eame si la zone Azure est en France, dans le cadre du <a href=\"https:\/\/fr.wikipedia.org\/wiki\/CLOUD_Act\">Cloud Act<\/a> ) pourrait donc d\u00e9chiffrer nos donn\u00e9es, en th\u00e9orie.<\/p>\n<p>La CEK va donc chiffrer les donn\u00e9es par colonne et va affecter la taille de celles-ci. Avec l&#8217;algorithme AEAD_AES_256_CBC_HMAC_SHA_256, on obtient donc le tableau des tailles suivantes par type :<\/p>\n<table width=\"416\" aria-label=\"Table 1\">\n<tbody>\n<tr>\n<td width=\"110\"><strong>Data Type<\/strong><\/td>\n<td width=\"306\"><strong>Longueur en octet<\/strong><\/td>\n<\/tr>\n<tr>\n<td width=\"110\">bigint<\/td>\n<td width=\"306\">65<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">binary<\/td>\n<td width=\"306\">Variable se r\u00e9f\u00e9rer \u00e0 la documentation de l&#8217;algo<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">bit<\/td>\n<td width=\"306\">65<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">char<\/td>\n<td width=\"306\">Variable se r\u00e9f\u00e9rer \u00e0 la documentation de l&#8217;algo<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">date<\/td>\n<td width=\"306\">65<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">datetime<\/td>\n<td width=\"306\">65<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">datetime2<\/td>\n<td width=\"306\">65<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">datetimeoffset<\/td>\n<td width=\"306\">65<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">decimal<\/td>\n<td width=\"306\">81<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">float<\/td>\n<td width=\"306\">65<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">geography<\/td>\n<td width=\"306\">non support\u00e9<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">geometry<\/td>\n<td width=\"306\">non support\u00e9<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">hierarchyid<\/td>\n<td width=\"306\">non support\u00e9<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">image<\/td>\n<td width=\"306\">non support\u00e9<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">int<\/td>\n<td width=\"306\">65<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">money<\/td>\n<td width=\"306\">65<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">nchar<\/td>\n<td width=\"306\">Variable se r\u00e9f\u00e9rer \u00e0 la documentation de l&#8217;algo<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">ntext<\/td>\n<td width=\"306\">non support\u00e9<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">numeric<\/td>\n<td width=\"306\">81<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">nvarchar<\/td>\n<td width=\"306\">Variable se r\u00e9f\u00e9rer \u00e0 la documentation de l&#8217;algo<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">real<\/td>\n<td width=\"306\">65<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">smalldatetime<\/td>\n<td width=\"306\">65<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">smallint<\/td>\n<td width=\"306\">65<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">smallmoney<\/td>\n<td width=\"306\">65<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">sql_variant<\/td>\n<td width=\"306\">non support\u00e9<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">sysname<\/td>\n<td width=\"306\">non support\u00e9<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">text<\/td>\n<td width=\"306\">non support\u00e9<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">time<\/td>\n<td width=\"306\">65<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">timestamp<br \/>\n(rowversion)<\/td>\n<td width=\"306\">non support\u00e9<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">tinyint<\/td>\n<td width=\"306\">65<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">uniqueidentifier<\/td>\n<td width=\"306\">81<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">varbinary<\/td>\n<td width=\"306\">Variable se r\u00e9f\u00e9rer \u00e0 la documentation de l&#8217;algo<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">varchar<\/td>\n<td width=\"306\">Variable se r\u00e9f\u00e9rer \u00e0 la documentation de l&#8217;algo<\/td>\n<\/tr>\n<tr>\n<td width=\"110\">xml<\/td>\n<td width=\"306\">non support\u00e9<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>On comprend donc que le chiffrement implique forc\u00e9ment de consommer plus d&#8217;espace : <strong>un integer consomme 4 octets, mais une fois chiffr\u00e9 il en consomme 65.<\/strong><\/p>\n<p>Dans la documentation disponible <a href=\"https:\/\/learn.microsoft.com\/en-us\/sql\/relational-databases\/security\/encryption\/always-encrypted-cryptography?view=sql-server-ver16\">ici<\/a>, on a la formule suivante qui nous permet de d\u00e9terminer la taille en octet d&#8217;un contenu :<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n1 + 32 + 16 + (FLOOR(DATALENGTH(cell_data)\/16) + 1) * 16  \r\n<\/pre>\n<p>Ainsi par exemple avec une chaine de caract\u00e8re de 76 caract\u00e8res telle que &#8220;Par exemple du texte l\u00e0 qui peut \u00eatre assez long finalement si on est bavard&#8221;, dans SQL Server je fais le calcul suivant :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-10338\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/always_encrypted_size-300x39.png\" alt=\"\" width=\"892\" height=\"116\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/always_encrypted_size-300x39.png 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/always_encrypted_size-768x99.png 768w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/always_encrypted_size.png 1002w\" sizes=\"auto, (max-width: 892px) 100vw, 892px\" \/><\/p>\n<p>On a doc 129 octets pour ce varchar(76). Si c&#8217;\u00e9tait du nvarchar(76), cela prendrait 209 octets chiffr\u00e9s au lieu de 152. L&#8217;impact est donc non-n\u00e9gligeable d\u00e8s que l&#8217;on arrive sur des grosses volum\u00e9tries.<\/p>\n<p>&nbsp;<\/p>\n<h1>Usage et limitation :<\/h1>\n<p>Le chiffrement par Always Encrypted doit \u00eatre consid\u00e9r\u00e9 uniquement pour des colonnes stockant des informations tr\u00e8s sensibles. Si les informations tr\u00e8s sensibles n&#8217;ont pas \u00e9t\u00e9 tr\u00e8s bien identifi\u00e9es par le m\u00e9tier, Microsoft propose de l&#8217;outillage et de la m\u00e9thodologie afin de les identifier. cela peut se faire soit dans le Portail Azure, soit dans SSMS (<a href=\"https:\/\/learn.microsoft.com\/en-us\/sql\/relational-databases\/security\/sql-data-discovery-and-classification?view=sql-server-ver16&amp;tabs=t-sql\">https:\/\/learn.microsoft.com\/en-us\/sql\/relational-databases\/security\/sql-data-discovery-and-classification?view=sql-server-ver16&amp;tabs=t-sql<\/a> ).<\/p>\n<p>Une fois les colonnes identifi\u00e9es, il faut \u00e9galement comprendre que leur chiffrement va impacteur leur usage. Dans le meilleur des cas (avec un chiffrement d\u00e9terministe), on ne pourra faire que des recherches d&#8217;\u00e9galit\u00e9 dans nos requ\u00eates ( SELECT =\u00a0 \/ IN\u00a0 \/ GROUP BY \/ DISTINCT). On ne peut pas non plus comparer les valeurs non-chiffr\u00e9es et chiffr\u00e9es directement. Il faut imp\u00e9rativement utiliser la <a href=\"https:\/\/learn.microsoft.com\/en-us\/sql\/relational-databases\/security\/encryption\/develop-using-always-encrypted-with-net-framework-data-provider?view=sql-server-ver16\">param\u00e9trisation<\/a>.<\/p>\n<p>La liste des limitations \u00e9tant longue, il vaut mieux se reporter \u00e0 la documentation pour v\u00e9rifier si l&#8217;usage envisag\u00e9 est compatible :\u00a0 <a href=\"https:\/\/learn.microsoft.com\/en-us\/sql\/relational-databases\/security\/encryption\/always-encrypted-database-engine?view=sql-server-ver16&amp;source=docs#limitations\">https:\/\/learn.microsoft.com\/en-us\/sql\/relational-databases\/security\/encryption\/always-encrypted-database-engine?view=sql-server-ver16&amp;source=docs#limitations<\/a><\/p>\n<h1>S\u00e9paration des r\u00f4les lors de la mise en \u0153uvre :<\/h1>\n<p>Le but du chiffrement Always Encrypted est d\u00e9porter les activit\u00e9s de chiffrements et de d\u00e9chiffrements au driver SQL. Cela implique donc une responsabilit\u00e9 sur la d\u00e9tention de la paire de cl\u00e9s (CEK) : qui doit les poss\u00e9der ? les mettre en oeuvre ? Microsoft r\u00e9pond \u00e0 cela en consid\u00e9rant qu&#8217;il y a deux fonctions diff\u00e9rentes :<\/p>\n<p>Le <strong>DBA<\/strong> qui g\u00e8re les m\u00e9tadonn\u00e9es des cl\u00e9s dans la base de donn\u00e9es : c&#8217;est \u00e0 dire qu&#8217;il va voir des informations dans certaines DMV relatives \u00e0 la gestion de ces cl\u00e9s, y compris l&#8217;emplacement de ces cl\u00e9s (magasin de certificat ou bien URL Azure Key Vault), mais il ne verra pas la CMK directement.<\/p>\n<p>Le &#8220;<strong>Security Administrator<\/strong>&#8221; aura pour r\u00f4le de g\u00e9n\u00e9rer la CMK et de les placer dans le magasin de certificat ou l&#8217;Azure Key Vault, mais il n&#8217;aura pas forc\u00e9ment besoin d&#8217;un acc\u00e8s direct \u00e0 la base de donn\u00e9es. Il aura aussi potentiellement \u00e0 appliquer une rotation des cl\u00e9s si cela fait partie de la strat\u00e9gie d&#8217;entreprise ou bien si une risque de vol de la CMK a eu lieu.<\/p>\n<p>Cette s\u00e9paration n&#8217;est pas indispensable, mais elle repr\u00e9sente l&#8217;aboutissement du besoin de cacher les donn\u00e9es \u00e0 des utilisateurs non-autoris\u00e9s, surtout si le r\u00f4le de DBA est d\u00e9l\u00e9gu\u00e9 \u00e0 un prestataire ou \u00e0 un op\u00e9rateur de cloud par exemple.<\/p>\n<h1>Mise en oeuvre d&#8217;Always Encrypted :<\/h1>\n<p>Always Encrypted peut \u00eatre mis en \u0153uvre par deux outils\u00a0 :<\/p>\n<ul>\n<li>SQL Server Management Studio<\/li>\n<li>PowerShell<\/li>\n<\/ul>\n<p>SSMS encapsule beaucoup les t\u00e2ches et ne laisse pas beaucoup de marge de man\u0153uvre pour le nommage des cl\u00e9s en particulier. L&#8217;utilisation de PowerShell est donc recommand\u00e9e.<\/p>\n<p>Par ailleurs, il y a deux cadres d&#8217;utilisation \u00e0 consid\u00e9rer \u00e0 notre \u00e9poque : le composant applicatif est h\u00e9berg\u00e9 sur un serveur On-Prem (et dispose donc d&#8217;un magasin de certificats ) ou bien il est h\u00e9berg\u00e9 dans le Cloud et voudra acc\u00e9der \u00e0 l&#8217;Azure Key Vault.<\/p>\n<h2>Dans le cadre Azure (avec le Key Vault) :<\/h2>\n<p>Deux modules PowerShell sont n\u00e9cessaire pour travailler sur ces t\u00e2ches : SqlServer et Az.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nInstall-Module SqlServer -allowclobber\r\nInstall-Module Az\r\n<\/pre>\n<p>On peut ensuite cr\u00e9er la CMK. Si on veut travailler avec Azure et son Key vault, on peut utiliser le script ci-dessous :<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n$subscriptionId = &quot;xxxxxxxxxxxxxxxxxxxxxxxxx&quot; #Id de la souscription Azure\r\n$TenantId = &quot;xxxxxxxxxxxxxxxxxxxxxxxxx&quot; #Id du Tenant Azure Active Directory (Entra ID d\u00e9sormais)\r\n$resourceGroup = &quot;Lab1_RG&quot; #Resource Group de l'Azure Key Vault\r\n$keyVaultName = &quot;VDE-KeyVault&quot; #Nom de l'Azure Key Vault\r\n$keyVaultKeyName = &quot;AdventureWorks-CEK&quot;\r\nImport-Module &quot;Az&quot;\r\nConnect-AzAccount -Tenant $TenantId\r\n\r\n# Pour se placer dans le contexte de la souscription souhait\u00e9e\r\nSet-AzContext -SubscriptionId $subscriptionId\r\n\r\n# R\u00e9cup\u00e9ration du nom du key vault name\r\nGet-AzKeyVault-VaultName $keyVaultName-ResourceGroupName $resourceGroup\r\n\r\n# Cr\u00e9ation de la cl\u00e9\r\n$keyVaultKey = Add-AzKeyVaultKey -VaultName $keyVaultName -Name $keyVaultKeyName -Destination &quot;Software&quot;\r\n$keyVaultKey\r\n<\/pre>\n<p>On peut d\u00e9sormais voir la cl\u00e9 dans le Key Vault Azure :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-10350 alignleft\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/KeyVault1-300x161.png\" alt=\"\" width=\"809\" height=\"434\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/KeyVault1-300x161.png 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/KeyVault1-768x412.png 768w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/KeyVault1.png 878w\" sizes=\"auto, (max-width: 809px) 100vw, 809px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>On peut voit le d\u00e9tail de la cl\u00e9, son URL (Key Identifier) et ses permissions ensuite :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-10351 alignleft\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/KeyVault2-187x300.png\" alt=\"\" width=\"512\" height=\"821\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/KeyVault2-187x300.png 187w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/KeyVault2.png 617w\" sizes=\"auto, (max-width: 512px) 100vw, 512px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>L&#8217;URL ici visible sera \u00e0 renseigner dans nos applications cloud. On autorisera l&#8217;applicatif \u00e0 utiliser le r\u00f4le\u00a0 &#8220;Key Vault Crypto Service Encryption User&#8221;.<\/p>\n<p>Il nous reste \u00e0 l&#8217;enregistrer dans notre base de donn\u00e9es. On peut le faire en PowerShell ou bien en SQL. C&#8217;est ici que l&#8217;on peut dessiner la fronti\u00e8re entre le r\u00f4le de &#8220;dba&#8221; et celle de &#8220;security administrator&#8221;. Le &#8220;security administrator&#8221; peut juste donner l&#8217;URL de la cl\u00e9 au dba pour qu&#8217;il l&#8217;int\u00e8gre \u00e0 la base\u00a0 :<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\r\nUSE [AdventureWorks]\r\nGO\r\nCREATE COLUMN MASTER KEY [AdventureWorks-CMK-SQL-Object]\r\nWITH\r\n(\r\nKEY_STORE_PROVIDER_NAME = N'AZURE_KEY_VAULT',\r\nKEY_PATH = N'https:\/\/vde-keyvault.vault.azure.net\/keys\/AdventureWorks-CMK\/9112fb34e3a84051a6ee490bb110a259'\r\n)\r\nGO\r\n\r\n<\/pre>\n<p>Ou bien en PowerShell (attention c&#8217;est plus long, mais on part du principe que cela fait suite au script PowerShell pr\u00e9c\u00e9dent ) :<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\r\nImport-Module SqlServer\r\n\r\n$connectionString = &quot;Data Source=LAB1SQL1;Initial Catalog=AdventureWorks;Integrated Security=True;Connect Timeout=30;Trust Server Certificate=True;Application Name=`&quot;Script PowerShell de d\u00e9ploiement AlwaysEncrypted`&quot;&quot;\r\n$database = Get-SqlDatabase -ConnectionString $connectionString\r\n$database# R\u00e9cup\u00e9ration des param\u00e8tres de la CMK stock\u00e9e dans le Key Vault :\r\n$cmkSettings = New-SqlAzureKeyVaultColumnMasterKeySettings -KeyURL $keyVaultKey.Key.Kid\r\n# D\u00e9claration de la CMK dans SQL Server\r\n$cmkName = &quot;AdventureWorks-CMK-SQL-Object&quot;\r\nNew-SqlColumnMasterKey -Name $cmkName -InputObject $database -ColumnMasterKeySettings $cmkSettings\r\n<\/pre>\n<p>On peut ensuite v\u00e9rifier que notre CMK est bien d\u00e9clar\u00e9e dans SQL Server avec la requ\u00eate suivante :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-10357\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/alwaysencrypted_cmk-300x31.png\" alt=\"\" width=\"1306\" height=\"135\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/alwaysencrypted_cmk-300x31.png 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/alwaysencrypted_cmk-1024x107.png 1024w\" sizes=\"auto, (max-width: 1306px) 100vw, 1306px\" \/><\/p>\n<p>On peut ensuite cr\u00e9e la CEK qui nous servira \u00e0 chiffrer les donn\u00e9es dans les colonnes :<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n$cekName = &quot;AdventureWorks-Person-emailaddress-CEK&quot;\r\nNew-SqlColumnEncryptionKey -Name $cekName -InputObject $database -ColumnMasterKey $cmkName\r\n<\/pre>\n<p>L\u00e0 aussi, on peut v\u00e9rifier la cr\u00e9ation de la CEK en SQL :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-10358\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/alwaysencrypted_cek1-300x56.png\" alt=\"\" width=\"680\" height=\"127\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/alwaysencrypted_cek1-300x56.png 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/alwaysencrypted_cek1.png 691w\" sizes=\"auto, (max-width: 680px) 100vw, 680px\" \/><\/p>\n<p>Une fois la CEK pr\u00e9sente, on peut l&#8217;utiliser pour chiffrer nos colonnes. Imaginons que l&#8217;on souhaite chiffrer la colonne EmailAddress de la table Person.EmailAddress : il faudra choisir entre deux type de chiffrement d\u00e9terministe (Deterministic) ou al\u00e9atoire (Randomized). D\u00e9terministe signifie que deux chaines de caract\u00e8res identiques renverront la m\u00eame valeur une fois chiffr\u00e9e, l\u00e0 o\u00f9 al\u00e9atoire renverra deux valeurs diff\u00e9rentes. L&#8217;avantage de d\u00e9terministe est ainsi de pouvoir faire des indexations et des jointures, contrairement au chiffrement al\u00e9atoire. Par contre, pour un attaquant, le fait d&#8217;avoir du d\u00e9terministe (des valeurs qui se r\u00e9p\u00e8tent dans la table) est une information d\u00e9j\u00e0 int\u00e9ressante.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n\r\n# Cr\u00e9ation des instructions de chiffrements : elles peuvent \u00eatre multiples.\r\n$ces = @()\r\n$ces += New-SqlColumnEncryptionSettings -ColumnName &quot;Person.EmailAddress.Employees.SSN&quot; -EncryptionType &quot;Deterministic&quot; -EncryptionKey $cekName\r\nSet-SqlColumnEncryption -InputObject $database -ColumnEncryptionSettings $ces -LogFileDirectory .\r\n\r\n<\/pre>\n<p>D\u00e9sormais, la lecture des donn\u00e9es sans les privil\u00e8ges d&#8217;acc\u00e8s \u00e0 la cl\u00e9 dans le Key Vault pr\u00e9sentera les donn\u00e9es ainsi :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-10359\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/data_read_without_access-300x108.png\" alt=\"\" width=\"822\" height=\"296\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/data_read_without_access-300x108.png 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/data_read_without_access.png 960w\" sizes=\"auto, (max-width: 822px) 100vw, 822px\" \/><\/p>\n<p>SSMS permet d&#8217;acc\u00e9der \u00e0 des donn\u00e9es chiffr\u00e9es avec Always Encrypted, m\u00eame si la cl\u00e9 est dans un Azure Key Vault (on aura une pop-up d&#8217;authentification, comme avec la commande PowerShell <em>AzConnect<\/em>), pour cela il suffit juste de cliquer sur &#8220;options&#8221; dans la fen\u00eatre d&#8217;ouverture de session et d&#8217;aller cocher &#8220;enable Always Encrypted (column encryption)&#8221; :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-10361\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/ssms-275x300.png\" alt=\"\" width=\"503\" height=\"549\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/ssms-275x300.png 275w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/ssms.png 477w\" sizes=\"auto, (max-width: 503px) 100vw, 503px\" \/> <img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-10363\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/Azure_auth-231x300.png\" alt=\"\" width=\"423\" height=\"549\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/Azure_auth-231x300.png 231w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/Azure_auth.png 568w\" sizes=\"auto, (max-width: 423px) 100vw, 423px\" \/><\/p>\n<p>Apr\u00e8s cela, les donn\u00e9es sont lisibles.<\/p>\n<p>&nbsp;<\/p>\n<h2>Dans le cadre On-Prem (avec le magasin de certificat Windows) :<\/h2>\n<p>Imaginons d\u00e9sormais que notre composant applicatif soit h\u00e9berg\u00e9 sur un serveur Windows et ne souhaite pas utiliser l&#8217;Azure Key Vault. La seule solution aujourd&#8217;hui possible est le magasin de certificat Windows. On peut cr\u00e9er un certificat auto-signer<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n$cert = New-SelfSignedCertificate -Subject &quot;VDE-CMK-WindowsStore&quot; -CertStoreLocation Cert:CurrentUser\\My -KeyExportPolicy Exportable -Type DocumentEncryptionCert -KeyUsage DataEncipherment -KeySpec KeyExchange\r\n<\/pre>\n<p>On pourra voir le certificat dans la branche &#8220;personal&#8221; de CurrentUser (Start\/run\/mmc.exe , on ajoute le composant &#8220;certificats&#8221; pour l&#8217;utilisateur courant).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-10354\" src=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/always-encrypted_cert-300x96.png\" alt=\"\" width=\"663\" height=\"212\" srcset=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/always-encrypted_cert-300x96.png 300w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/always-encrypted_cert-1024x329.png 1024w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/always-encrypted_cert-768x247.png 768w, https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/always-encrypted_cert.png 1105w\" sizes=\"auto, (max-width: 663px) 100vw, 663px\" \/><\/p>\n<p>Attention \u00e0 bien g\u00e9n\u00e9rer le certificat sur une machine autre que celle SQL Server, afin de bien s\u00e9parer les r\u00f4les : la machine SQL Server ne doit pas disposer de la CMK.<\/p>\n<p>Apr\u00e8s, de la m\u00eame mani\u00e8re qu&#8217;avec l&#8217;Azure Key Vault, on peut cr\u00e9er la CEK :<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n$cekName = &quot;AdventureWorks-Person-emailaddress2-CEK&quot;\r\n$cmkName = &quot;AdventureWorks-CMK-SQL-Object2&quot;\r\n$connectionString = &quot;Data Source=LAB1SQL1;Initial Catalog=AdventureWorks;Integrated Security=True;Connect Timeout=30;Trust Server Certificate=True;Application Name=`&quot;Script PowerShell de d\u00e9ploiement AlwaysEncrypted`&quot;&quot;&amp;amp;amp;lt;\/div&amp;amp;amp;gt;&amp;amp;amp;lt;div&amp;amp;amp;gt;$database = Get-SqlDatabase -ConnectionString $connectionString\r\nNew-SqlColumnEncryptionKey -Name $cekName -InputObject $database -ColumnMasterKey $cmkName\r\n<\/pre>\n<p>&nbsp;<\/p>\n<div><\/div>\n<div>Puis on peut chiffrer notre colonne en utilisant cette CEK\u00a0 :<\/div>\n<div>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n$ces = @()\r\n$ces += New-SqlColumnEncryptionSettings -ColumnName &quot;Person.EmailAddress2.EmailAddress&quot; -EncryptionType deterministic -EncryptionKey $cekName\r\nSet-SqlColumnEncryption  -InputObject $database -ColumnEncryptionSettings $ces -LogFileDirectory .\r\n<\/pre>\n<p>Si jamais on voulait retirer le chiffrement sur une colonne :<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\n$ces = @()\r\n$ces += New-SqlColumnEncryptionSettings -ColumnName &quot;Person.EmailAddress2.EmailAddress&quot; -EncryptionType PlainText\r\nSet-SqlColumnEncryption -InputObject $database -ColumnEncryptionSettings $ces -LogFileDirectory .\r\n<\/pre>\n<p>Il est \u00e0 noter qu&#8217;il est possible d&#8217;exporter le certificat dans la MMC des certificats Windows pour ensuite l&#8217;importer dans son Azure Key Vault. L&#8217;inverse n&#8217;est pas possible.<\/p>\n<p>&nbsp;<\/p>\n<h1>Consid\u00e9rations applicatives :<\/h1>\n<\/div>\n<p>Comme on l&#8217;a expliqu\u00e9 lors de ces deux \u00e9pisodes, le bon fonctionnement applicatif repose sur deux points :<\/p>\n<ul>\n<li>La chaine de connexion sp\u00e9cifie &#8220;<code class=\"lang-cs\" data-author-content=\"string connectionString = &quot;Data Source=server63; Initial Catalog=Clinic; Integrated Security=true; Column Encryption Setting=enabled&quot;; SqlConnection connection = new SqlConnection(connectionString); \"><span class=\"hljs-string\">Column Encryption Setting=enabled<\/span><\/code>&#8220;<\/li>\n<li>Le compte d&#8217;ex\u00e9cution de l&#8217;applicatif dispose d&#8217;un acc\u00e8s \u00e0 la Column Master Key.<\/li>\n<\/ul>\n<p>Dans le cas de l&#8217;utilisation d&#8217;un applicatif d\u00e9ploy\u00e9 nativement dans le cloud, les strat\u00e9gies dites RBAC (Role-Based Access Control) sont \u00e0 privil\u00e9gier.<a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/key-vault\/general\/rbac-guide?tabs=azure-cli\"> La documentation Microsoft<\/a> donne d\u00e9taille davantage que cet article les \u00e9l\u00e9ments \u00e0 consid\u00e9rer.<\/p>\n<p>Si notre applicatif est plus classique, et est d\u00e9ploy\u00e9 sur un serveur Windows, on s&#8217;int\u00e9ressera \u00e0 son compte d&#8217;ex\u00e9cution pour utiliser le magasin de certificat appropri\u00e9. Dans le cas de Linux, cela pourra \u00eatre avec le driver JDBC et le Java KeyStore (<a href=\"https:\/\/learn.microsoft.com\/en-us\/sql\/connect\/jdbc\/using-always-encrypted-with-the-jdbc-driver?view=sql-server-ver16\">https:\/\/learn.microsoft.com\/en-us\/sql\/connect\/jdbc\/using-always-encrypted-with-the-jdbc-driver?view=sql-server-ver16<\/a> )<\/p>\n<p>&nbsp;<\/p>\n<p>Les derni\u00e8res versions de SQL Server (que \u00e7a soit dans Azure en PaaS ou bien On-Prem \/ IaaS) proposent cependant ce qu&#8217;ils appellent les Secure Enclaves, pour lever certaines limitations de d\u00e9veloppement d&#8217;Always Encrypted ! Peut-\u00eatre l&#8217;objet d&#8217;un nouvel \u00e9pisode ?<\/p>\n<p>&nbsp;<\/p>\n<a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-twitter nolightbox\" data-provider=\"twitter\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Twitter\" href=\"https:\/\/twitter.com\/intent\/tweet?url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F10334&#038;text=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"twitter\" title=\"Share on Twitter\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/twitter.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-linkedin nolightbox\" data-provider=\"linkedin\" target=\"_blank\" rel=\"nofollow\" title=\"Share on Linkedin\" href=\"https:\/\/www.linkedin.com\/shareArticle?mini=true&#038;url=https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F10334&#038;title=Le%20chiffrement%20et%20SQL%20Server%20%E2%80%93%20Episode%203%20%3A%20Always%20Encrypted\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px;margin-right:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"linkedin\" title=\"Share on Linkedin\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/linkedin.png\" \/><\/a><a class=\"synved-social-button synved-social-button-share synved-social-size-24 synved-social-resolution-single synved-social-provider-mail nolightbox\" data-provider=\"mail\" rel=\"nofollow\" title=\"Share by email\" href=\"mailto:?subject=Le%20chiffrement%20et%20SQL%20Server%20%E2%80%93%20Episode%203%20%3A%20Always%20Encrypted&#038;body=Article%20sur%20le%20blog%20de%20la%20Capdata%20Tech%20Team%20%3A%20:%20https%3A%2F%2Fblog.capdata.fr%2Findex.php%2Fwp-json%2Fwp%2Fv2%2Fposts%2F10334\" style=\"font-size: 0px;width:24px;height:24px;margin:0;margin-bottom:5px\"><img loading=\"lazy\" decoding=\"async\" alt=\"mail\" title=\"Share by email\" class=\"synved-share-image synved-social-image synved-social-image-share\" width=\"24\" height=\"24\" style=\"display: inline;width:24px;height:24px;margin: 0;padding: 0;border: none;box-shadow: none\" src=\"https:\/\/blog.capdata.fr\/wp-content\/plugins\/social-media-feather\/synved-social\/image\/social\/regular\/48x48\/mail.png\" \/><\/a>","protected":false},"excerpt":{"rendered":"<p>Comme nous l&#8217;avions vu dans le premier \u00e9pisode de cette s\u00e9rie sur le chiffrement dans SQL Server, la solution la plus rigoureuse pour le chiffrement des donn\u00e9es reste Always Encrypted. Celle-ci peut s&#8217;appliquer en compl\u00e9ment de TDE qui lui va&hellip; <a href=\"https:\/\/blog.capdata.fr\/index.php\/le-chiffrement-et-sql-server-episode-3-always-encrypted\/\" class=\"more-link\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":10376,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[282,5],"tags":[464,467,458,468,465],"class_list":["post-10334","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-azure","category-sqlserver","tag-always-encrypted","tag-certificat","tag-chiffrement","tag-cypher","tag-key-vault"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Le chiffrement et SQL Server - Episode 3 : Always Encrypted - Capdata TECH BLOG<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.capdata.fr\/index.php\/le-chiffrement-et-sql-server-episode-3-always-encrypted\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Le chiffrement et SQL Server - Episode 3 : Always Encrypted - Capdata TECH BLOG\" \/>\n<meta property=\"og:description\" content=\"Comme nous l&#8217;avions vu dans le premier \u00e9pisode de cette s\u00e9rie sur le chiffrement dans SQL Server, la solution la plus rigoureuse pour le chiffrement des donn\u00e9es reste Always Encrypted. Celle-ci peut s&#8217;appliquer en compl\u00e9ment de TDE qui lui va&hellip; Continuer la lecture &rarr;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.capdata.fr\/index.php\/le-chiffrement-et-sql-server-episode-3-always-encrypted\/\" \/>\n<meta property=\"og:site_name\" content=\"Capdata TECH BLOG\" \/>\n<meta property=\"article:published_time\" content=\"2023-11-29T11:10:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-12-06T16:28:44+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/alwaysencrypted_logo.png\" \/>\n\t<meta property=\"og:image:width\" content=\"372\" \/>\n\t<meta property=\"og:image:height\" content=\"277\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Capdata team\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Capdata team\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/le-chiffrement-et-sql-server-episode-3-always-encrypted\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/le-chiffrement-et-sql-server-episode-3-always-encrypted\/\"},\"author\":{\"name\":\"Capdata team\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/person\/bfd9395c8ba4fa125792a543377035e9\"},\"headline\":\"Le chiffrement et SQL Server &#8211; Episode 3 : Always Encrypted\",\"datePublished\":\"2023-11-29T11:10:03+00:00\",\"dateModified\":\"2023-12-06T16:28:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/le-chiffrement-et-sql-server-episode-3-always-encrypted\/\"},\"wordCount\":2436,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/blog.capdata.fr\/#organization\"},\"keywords\":[\"always encrypted\",\"certificat\",\"chiffrement\",\"cypher\",\"Key Vault\"],\"articleSection\":[\"Azure\",\"SQL Server\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.capdata.fr\/index.php\/le-chiffrement-et-sql-server-episode-3-always-encrypted\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/le-chiffrement-et-sql-server-episode-3-always-encrypted\/\",\"url\":\"https:\/\/blog.capdata.fr\/index.php\/le-chiffrement-et-sql-server-episode-3-always-encrypted\/\",\"name\":\"Le chiffrement et SQL Server - Episode 3 : Always Encrypted - Capdata TECH BLOG\",\"isPartOf\":{\"@id\":\"https:\/\/blog.capdata.fr\/#website\"},\"datePublished\":\"2023-11-29T11:10:03+00:00\",\"dateModified\":\"2023-12-06T16:28:44+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/le-chiffrement-et-sql-server-episode-3-always-encrypted\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.capdata.fr\/index.php\/le-chiffrement-et-sql-server-episode-3-always-encrypted\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/le-chiffrement-et-sql-server-episode-3-always-encrypted\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/blog.capdata.fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Le chiffrement et SQL Server &#8211; Episode 3 : Always Encrypted\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.capdata.fr\/#website\",\"url\":\"https:\/\/blog.capdata.fr\/\",\"name\":\"Capdata TECH BLOG\",\"description\":\"Le blog technique sur les bases de donn\u00e9es de CAP DATA Consulting\",\"publisher\":{\"@id\":\"https:\/\/blog.capdata.fr\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.capdata.fr\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/blog.capdata.fr\/#organization\",\"name\":\"Capdata TECH BLOG\",\"url\":\"https:\/\/blog.capdata.fr\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp\",\"contentUrl\":\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp\",\"width\":800,\"height\":254,\"caption\":\"Capdata TECH BLOG\"},\"image\":{\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.linkedin.com\/company\/cap-data-consulting\/mycompany\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/person\/bfd9395c8ba4fa125792a543377035e9\",\"name\":\"Capdata team\",\"sameAs\":[\"https:\/\/www.capdata.fr\"],\"url\":\"https:\/\/blog.capdata.fr\/index.php\/author\/admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Le chiffrement et SQL Server - Episode 3 : Always Encrypted - Capdata TECH BLOG","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.capdata.fr\/index.php\/le-chiffrement-et-sql-server-episode-3-always-encrypted\/","og_locale":"fr_FR","og_type":"article","og_title":"Le chiffrement et SQL Server - Episode 3 : Always Encrypted - Capdata TECH BLOG","og_description":"Comme nous l&#8217;avions vu dans le premier \u00e9pisode de cette s\u00e9rie sur le chiffrement dans SQL Server, la solution la plus rigoureuse pour le chiffrement des donn\u00e9es reste Always Encrypted. Celle-ci peut s&#8217;appliquer en compl\u00e9ment de TDE qui lui va&hellip; Continuer la lecture &rarr;","og_url":"https:\/\/blog.capdata.fr\/index.php\/le-chiffrement-et-sql-server-episode-3-always-encrypted\/","og_site_name":"Capdata TECH BLOG","article_published_time":"2023-11-29T11:10:03+00:00","article_modified_time":"2023-12-06T16:28:44+00:00","og_image":[{"width":372,"height":277,"url":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/11\/alwaysencrypted_logo.png","type":"image\/png"}],"author":"Capdata team","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"Capdata team","Dur\u00e9e de lecture estim\u00e9e":"13 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.capdata.fr\/index.php\/le-chiffrement-et-sql-server-episode-3-always-encrypted\/#article","isPartOf":{"@id":"https:\/\/blog.capdata.fr\/index.php\/le-chiffrement-et-sql-server-episode-3-always-encrypted\/"},"author":{"name":"Capdata team","@id":"https:\/\/blog.capdata.fr\/#\/schema\/person\/bfd9395c8ba4fa125792a543377035e9"},"headline":"Le chiffrement et SQL Server &#8211; Episode 3 : Always Encrypted","datePublished":"2023-11-29T11:10:03+00:00","dateModified":"2023-12-06T16:28:44+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.capdata.fr\/index.php\/le-chiffrement-et-sql-server-episode-3-always-encrypted\/"},"wordCount":2436,"commentCount":0,"publisher":{"@id":"https:\/\/blog.capdata.fr\/#organization"},"keywords":["always encrypted","certificat","chiffrement","cypher","Key Vault"],"articleSection":["Azure","SQL Server"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.capdata.fr\/index.php\/le-chiffrement-et-sql-server-episode-3-always-encrypted\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.capdata.fr\/index.php\/le-chiffrement-et-sql-server-episode-3-always-encrypted\/","url":"https:\/\/blog.capdata.fr\/index.php\/le-chiffrement-et-sql-server-episode-3-always-encrypted\/","name":"Le chiffrement et SQL Server - Episode 3 : Always Encrypted - Capdata TECH BLOG","isPartOf":{"@id":"https:\/\/blog.capdata.fr\/#website"},"datePublished":"2023-11-29T11:10:03+00:00","dateModified":"2023-12-06T16:28:44+00:00","breadcrumb":{"@id":"https:\/\/blog.capdata.fr\/index.php\/le-chiffrement-et-sql-server-episode-3-always-encrypted\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.capdata.fr\/index.php\/le-chiffrement-et-sql-server-episode-3-always-encrypted\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.capdata.fr\/index.php\/le-chiffrement-et-sql-server-episode-3-always-encrypted\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/blog.capdata.fr\/"},{"@type":"ListItem","position":2,"name":"Le chiffrement et SQL Server &#8211; Episode 3 : Always Encrypted"}]},{"@type":"WebSite","@id":"https:\/\/blog.capdata.fr\/#website","url":"https:\/\/blog.capdata.fr\/","name":"Capdata TECH BLOG","description":"Le blog technique sur les bases de donn\u00e9es de CAP DATA Consulting","publisher":{"@id":"https:\/\/blog.capdata.fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.capdata.fr\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/blog.capdata.fr\/#organization","name":"Capdata TECH BLOG","url":"https:\/\/blog.capdata.fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/","url":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp","contentUrl":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2023\/01\/logo_capdata.webp","width":800,"height":254,"caption":"Capdata TECH BLOG"},"image":{"@id":"https:\/\/blog.capdata.fr\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/company\/cap-data-consulting\/mycompany\/"]},{"@type":"Person","@id":"https:\/\/blog.capdata.fr\/#\/schema\/person\/bfd9395c8ba4fa125792a543377035e9","name":"Capdata team","sameAs":["https:\/\/www.capdata.fr"],"url":"https:\/\/blog.capdata.fr\/index.php\/author\/admin\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/10334","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/comments?post=10334"}],"version-history":[{"count":25,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/10334\/revisions"}],"predecessor-version":[{"id":10399,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/10334\/revisions\/10399"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/media\/10376"}],"wp:attachment":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/media?parent=10334"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/categories?post=10334"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/tags?post=10334"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}