{"id":10377,"date":"2024-01-30T18:54:28","date_gmt":"2024-01-30T17:54:28","guid":{"rendered":"https:\/\/blog.capdata.fr\/?p=10377"},"modified":"2024-01-31T11:37:12","modified_gmt":"2024-01-31T10:37:12","slug":"pseudonymisation-postgresql","status":"publish","type":"post","link":"https:\/\/blog.capdata.fr\/index.php\/pseudonymisation-postgresql\/","title":{"rendered":"Pseudonymiser vos bases PostgreSQL"},"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%2F10377&#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%2F10377&#038;title=Pseudonymiser%20vos%20bases%20PostgreSQL\" 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=Pseudonymiser%20vos%20bases%20PostgreSQL&#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%2F10377\" 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>Dans l&#8217;\u00e8re num\u00e9rique actuelle, o\u00f9 la s\u00e9curit\u00e9 des donn\u00e9es occupe une place centrale, la pseudonymisation \u00e9merge comme une strat\u00e9gie cruciale pour renforcer la confidentialit\u00e9 des informations stock\u00e9es dans les bases de donn\u00e9es. Cette approche, bien que semblable \u00e0 l&#8217;anonymisation, se distingue par son objectif sp\u00e9cifique de pr\u00e9server l&#8217;utilit\u00e9 des donn\u00e9es tout en masquant l&#8217;identit\u00e9 r\u00e9elle des individus. Dans le contexte de PostgreSQL, la pseudonymisation offre un \u00e9quilibre d\u00e9licat entre protection des renseignements sensibles et pr\u00e9servation de la fonctionnalit\u00e9 des donn\u00e9es.<\/p>\n<h2>Principe de la Pseudonymisation :<\/h2>\n<p>La pseudonymisation implique la substitution des donn\u00e9es r\u00e9elles par des donn\u00e9es fictives, mais conservant leur structure originale. Contrairement \u00e0 l&#8217;anonymisation, qui supprime compl\u00e8tement toute r\u00e9f\u00e9rence \u00e0 l&#8217;identit\u00e9 d&#8217;un individu, la pseudonymisation permet la r\u00e9versibilit\u00e9 du processus. Ainsi, les donn\u00e9es restent utilisables \u00e0 des fins l\u00e9gitimes : l&#8217;analyse statistique, ou la r\u00e9alisation de tests, tout en garantissant la protection des informations confidentielles.<\/p>\n<p>L&#8217;utilit\u00e9 fondamentale de la pseudonymisation r\u00e9side dans sa capacit\u00e9 \u00e0 concilier deux imp\u00e9ratifs apparemment contradictoires : la protection de la vie priv\u00e9e des individus et la n\u00e9cessit\u00e9 d&#8217;acc\u00e9der et de traiter des donn\u00e9es. Dans un paysage o\u00f9 les fuites de donn\u00e9es et les violations de la vie priv\u00e9e sont de plus en plus fr\u00e9quentes, la pseudonymisation devient une r\u00e9ponse pragmatique aux exigences de conformit\u00e9 r\u00e9glementaire tout en pr\u00e9servant la valeur analytique des donn\u00e9es.<\/p>\n<p>Souvent confondue avec la pseudonymisation, l&#8217;anonymisation diff\u00e8re par son caract\u00e8re irr\u00e9versible. Alors que l&#8217;anonymisation supprime toute possibilit\u00e9 de relier des donn\u00e9es \u00e0 une identit\u00e9 sp\u00e9cifique, la pseudonymisation offre une r\u00e9versibilit\u00e9 calcul\u00e9e, permettant une utilisation future des donn\u00e9es tout en maintenant un niveau \u00e9lev\u00e9 de s\u00e9curit\u00e9. Cette distinction cruciale souligne l&#8217;importance de choisir la m\u00e9thode la plus appropri\u00e9e en fonction des besoins sp\u00e9cifiques de s\u00e9curit\u00e9 et des objectifs op\u00e9rationnels.<\/p>\n<h1>Etat de la pseudonymisation actuellement sur PostgreSQL :<\/h1>\n<p>Le seul outil actuellement disponible sur le march\u00e9 permettant de r\u00e9aliser une pseudonymisation sur PostgreSQL est une extension. Nous l&#8217;avions d\u00e9j\u00e0 \u00e9voqu\u00e9e lors d&#8217;un pr\u00e9c\u00e9dent article : PostgreSQL Anonymizer.\u00a0Pour rappel, cette extension est d\u00e9velopp\u00e9e par Dalibo, et contient \u00e9galement de nombreuses options d&#8217;anonymisation.<\/p>\n<p>Dans cet article, nous allons rappeler l&#8217;installation de cette extension puis nous la verrons \u00e0 l&#8217;\u0153uvre dans quelques exemples de pseudonymisation de donn\u00e9es.<\/p>\n<h3>Etape 1 : Installation<\/h3>\n<p>La machine choisie pour mon test est une Ubuntu. Il n&#8217;y a pas de package pr\u00eat \u00e0 l&#8217;emploi sur ce syst\u00e8me d&#8217;exploitation. Nous devons donc r\u00e9aliser nous m\u00eame la compilation de l&#8217;extension pour qu&#8217;elle puisse fonctionner. Nous avons au pr\u00e9alable install\u00e9 une version 15 de PostgreSQL sur notre machine.<\/p>\n<p>Nous commen\u00e7ons par installer les outils de d\u00e9veloppement de PostgreSQL :<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">root@sarah:~# sudo apt-get install postgresql-server-dev-15\r\nReading package lists... Done\r\nBuilding dependency tree\r\nReading state information... Done\r\n...\r\nSetting up postgresql-server-dev-15 (13.7-1.pgdg18.04+1) ...\r\nProcessing triggers\u00a0for man-db (2.8.3-2ubuntu0.1) ...\r\nProcessing triggers\u00a0for mime-support (3.60ubuntu1) ...\r\nProcessing triggers\u00a0for ureadahead (0.100.0-21) ...\r\nProcessing triggers\u00a0for install-info (6.5.0.dfsg.1-2) ...\r\nProcessing triggers\u00a0for libc-bin (2.27-3ubuntu1.5) ...\r\nProcessing triggers\u00a0for systemd (237-3ubuntu10.53)<\/pre>\n<p>Puis on r\u00e9cup\u00e8re depuis le git de Dalibo les sources \u00e0 la derni\u00e8re version disponible :<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">root@sarah:~# git clone\u00a0&lt;a href=&quot;https:\/\/gitlab.com\/dalibo\/postgresql_anonymizer.git&quot;&gt;https:\/\/gitlab.com\/dalibo\/postgresql_anonymizer.git&lt;\/a&gt;\r\nCloning into\u00a0'postgresql_anonymizer'...\r\nremote: Enumerating objects: 5145,\u00a0done.\r\nremote: Counting objects: 100% (487\/487),\u00a0done.\r\nremote: Compressing objects: 100% (271\/271),\u00a0done.\r\nremote: Total 5145 (delta 327), reused 277 (delta 216), pack-reused 4658\r\nReceiving objects: 100% (5145\/5145), 25.71 MiB | 19.23 MiB\/s,\u00a0done.\r\nResolving deltas: 100% (3304\/3304),\u00a0done. <\/pre>\n<p>Une fois les sources r\u00e9cup\u00e9r\u00e9es, on se positionne dans le r\u00e9pertoire cr\u00e9\u00e9 par Git ou les sources ont \u00e9t\u00e9 d\u00e9pos\u00e9es et on fait un make extension :<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">root@sarah:~\/postgresql_anonymizer# make extension\u00a0\r\nmkdir -p anon\r\ncp anon.sql anon\/anon--1.1.0.sql\r\ncp data\/*.csv anon\/\r\ncp python\/populate.py anon\/ <\/pre>\n<p>Et enfin un Make install pour installer le tout. Il est important de pr\u00e9ciser qu&#8217;il est n\u00e9cessaire que vous ayez install\u00e9 gcc pour pouvoir compiler les sources de l&#8217;extension (apt install gcc) :<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">root@sarah:~\/postgresql_anonymizer# sudo make install\u00a0\r\ncp anon.sql anon\/anon--1.1.0.sql\r\ncp data\/*.csv anon\/\r\ncp python\/populate.py anon\/\r\ngcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing- format-attribute -Wimplicit-fallthrough=3 -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno- format-truncation -g -g -O2 -fstack-protector-strong -Wformat -Werror= format-security -fno-omit-frame-pointer -fPIC -Wno-unused-variable -I. -I.\/ -I\/usr\/include\/postgresql\/13\/server -I\/usr\/include\/postgresql\/internal \u00a0  -Wdate- time -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -I\/usr\/include\/libxml2 \u00a0\u00a0  -c -o anon.o anon.c\r\ngcc -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing- format-attribute -Wimplicit-fallthrough=3 -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -Wno- format-truncation -g -g -O2 -fstack-protector-strong -Wformat -Werror= format-security -fno-omit-frame-pointer -fPIC -Wno-unused-variable anon.o -L\/usr\/lib\/x86_64-linux-gnu -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -L\/usr\/lib\/llvm-6.0\/lib \u00a0  -Wl,--as-needed\u00a0 -shared -o anon.so\r\n\/usr\/bin\/clang-6.0 -Wno-ignored-attributes -fno-strict-aliasing -fwrapv -Wno-unused- command-line-argument -O2\u00a0 -I. -I.\/ -I\/usr\/include\/postgresql\/13\/server -I\/usr\/include\/postgresql\/internal \u00a0  -Wdate- time -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -I\/usr\/include\/libxml2 \u00a0  -flto=thin -emit-llvm -c -o anon. bc anon.c\r\n\/bin\/mkdir -p\u00a0 '\/usr\/share\/postgresql\/15\/extension'\r\n\/bin\/mkdir -p\u00a0 '\/usr\/share\/postgresql\/15\/extension\/anon'\r\n\/bin\/mkdir -p\u00a0 '\/usr\/lib\/postgresql\/15\/lib'\r\ninstall -d\u00a0\/usr\/lib\/postgresql\/15\/bin\r\ninstall -m 0755 bin\/pg_dump_anon.sh\u00a0\/usr\/lib\/postgresql\/15\/bin\r\n\/usr\/bin\/install -c -m 644 .\/\/anon.control\u00a0 '\/usr\/share\/postgresql\/15\/extension\/'\r\n\/usr\/bin\/install -c -m 644 .\/\/anon\/*\u00a0\u00a0 '\/usr\/share\/postgresql\/15\/extension\/anon\/'\r\n\/usr\/bin\/install -c -m 755\u00a0 anon.so\u00a0 '\/usr\/lib\/postgresql\/15\/lib\/'\r\n\/bin\/mkdir -p\u00a0 '\/usr\/lib\/postgresql\/15\/lib\/bitcode\/anon'\r\n\/bin\/mkdir -p\u00a0 '\/usr\/lib\/postgresql\/15\/lib\/bitcode'\/anon\/\r\n\/usr\/bin\/install -c -m 644 anon. bc '\/usr\/lib\/postgresql\/15\/lib\/bitcode'\/anon\/.\/\r\ncd '\/usr\/lib\/postgresql\/15\/lib\/bitcode' &amp;&amp;\u00a0\/usr\/lib\/llvm-6.0\/bin\/llvm-lto -thinlto -thinlto-action=thinlink -o anon.index. bc anon\/anon. bc<\/pre>\n<p>Pour ce test, j&#8217;ai import\u00e9 la base de donn\u00e9es exemple dvdrental de PostgreSQL. Elle me permettra d&#8217;illustrer la pseudonymisation facilement et sur une quantit\u00e9 respectable de donn\u00e9es. Pour importer cette base de donn\u00e9es, rien de plus simple :<\/p>\n<p>On la r\u00e9cup\u00e8re en la t\u00e9l\u00e9chargeant sur le site d&#8217;h\u00e9bergement :<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">postgres@sarah:~$ wget https:\/\/www.postgresqltutorial.com\/wp-content\/uploads\/2019\/05\/dvdrental.zip\r\n\r\n--2023-11-29 13:42:52-- https:\/\/www.postgresqltutorial.com\/wp-content\/uploads\/2019\/05\/dvdrental.zip\r\nResolving www.postgresqltutorial.com (www.postgresqltutorial.com)... 104.21.2.174, 172.67.129.129, 2606:4700:3037::6815:2ae, ...\r\nConnecting to www.postgresqltutorial.com (www.postgresqltutorial.com)|104.21.2.174|:443... connected.\r\nHTTP request sent, awaiting response... 200 OK\r\nLength: 550906 (538K) [application\/zip]\r\nSaving to: \u2018dvdrental.zip\u2019\r\n\r\ndvdrental.zip 100%[========================================================================================================================================&gt;] 537.99K --.-KB\/s in 0.01s\r\n\r\n2023-11-29 13:42:52 (45.5 MB\/s) - \u2018dvdrental.zip\u2019 saved [550906\/550906] <\/pre>\n<p>On la d\u00e9zippe ensuite :<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">postgres@sarah:~$ unzip dvdrental.zip\r\nArchive: dvdrental.zip\r\ninflating: dvdrental.tar<\/pre>\n<p>On obtient ainsi une archive qu&#8217;on peut utiliser avec un pg_restore pour charger la base de donn\u00e9es. Je me suis d&#8217;abbord connect\u00e9e sur l&#8217;instance pour cr\u00e9er une base de donn\u00e9es que j&#8217;ai appel\u00e9 dvdrental:<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">postgres@ip-172-44-2-72:~$ psql\r\npsql (15.5 (Ubuntu 15.5-1.pgdg22.04+1))\r\nType &quot;help&quot; for help.<\/pre>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">postgres=# create database dvdrental;\r\nCREATE DATABASE<\/pre>\n<p>Puis j&#8217;ai restaur\u00e9 la base :<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">postgres@ip-172-44-2-72:~$ pg_restore -U postgres -d dvdrental dvdrental.tar<\/pre>\n<p>Nous sommes donc pr\u00eats \u00e0 commencer.<\/p>\n<p>Il existe un petit nombre de fonctions de pseudonymisation dans PostgreSQL anonymiser. Elles fonctionnent comme les fonctions d&#8217;anonymisation et peuvent \u00eatre utilis\u00e9e en masquage statique ou en masquage dynamique.<\/p>\n<p>Les fonctions disponibles sont les suivantes :<\/p>\n<ul>\n<li><code>anon.pseudo_first_name('seed','salt')<\/code>qui retourne un pr\u00e9nom g\u00e9n\u00e9rique<\/li>\n<li><code>anon.pseudo_last_name('seed','salt')<\/code> qui retourne un nom de famille g\u00e9n\u00e9rique<\/li>\n<li><code>anon.pseudo_email('seed','salt')<\/code> qui retourne une adresse email g\u00e9n\u00e9rique et existante<\/li>\n<li><code>anon.pseudo_city('seed','salt')<\/code> qui retourne le nom d&#8217;une ville existante<\/li>\n<li><code>anon.pseudo_country('seed','salt')<\/code> qui retourne un pays existant<\/li>\n<li><code>anon.pseudo_company('seed','salt')<\/code> qui retourne un nom de soci\u00e9t\u00e9 g\u00e9n\u00e9rique<\/li>\n<li><code>anon.pseudo_iban('seed','salt')<\/code> qui retourne un IBAN valide<\/li>\n<li><code>anon.pseudo_siret('seed','salt') qui retourne un SIRET valide<\/code><\/li>\n<\/ul>\n<p>Il est important de d\u00e9finir un <em>salt<\/em> diff\u00e9rent pour chaque base de donn\u00e9es. Si un utilisateur quelconque trouve le <em>salt<\/em> de votre base de donn\u00e9es, il sera ensuite capable de proc\u00e9der \u00e0 une attaque par force brute sur toutes les autres donn\u00e9es afin de les r\u00e9v\u00e9ler.<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">dvdrental=# alter database dvdrental set anon.salt = 'This_is_a_salt';<\/pre>\n<p>Pour prendre un exemple, nous pouvons tenter de pseudonymiser les donn\u00e9es des clients de notre base dvdrental :<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">dvdrental=# select * from customer limit 5;\r\ncustomer_id | store_id | first_name | last_name | email | address_id | activebool | create_date | last_update | active\r\n-------------+----------+------------+-----------+-------------------------------------+------------+------------+-------------+-------------------------+--------\r\n524 | 1 | Jared | Ely | jared.ely@sakilacustomer.org | 530 | t | 2006-02-14 | 2013-05-26 14:49:45.738 | 1\r\n1 | 1 | Mary | Smith | mary.smith@sakilacustomer.org | 5 | t | 2006-02-14 | 2013-05-26 14:49:45.738 | 1\r\n2 | 1 | Patricia | Johnson | patricia.johnson@sakilacustomer.org | 6 | t | 2006-02-14 | 2013-05-26 14:49:45.738 | 1\r\n3 | 1 | Linda | Williams | linda.williams@sakilacustomer.org | 7 | t | 2006-02-14 | 2013-05-26 14:49:45.738 | 1\r\n4 | 2 | Barbara | Jones | barbara.jones@sakilacustomer.org | 8 | t | 2006-02-14 | 2013-05-26 14:49:45.738 | 1\r\n(5 rows)<\/pre>\n<p>Lors d&#8217;un premier essai, en suivant la documentation officielle disponible <a href=\"https:\/\/postgresql-anonymizer.readthedocs.io\/en\/stable\/\">ici<\/a>, j&#8217;ai utilis\u00e9 la fonction suivante :<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">dvdrental=# SECURITY LABEL FOR anon ON COLUMN customer.first_name is 'MASKED WITH FUNCTION anon.pseudo_first_name('seed', 'salt')';\r\nSECURITY LABEL<\/pre>\n<p>Au moment d&#8217;utiliser le masquage pour pseudonymiser mes donn\u00e9es, je suis tomb\u00e9e sur l&#8217;erreur suivante :<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">dvdrental=# SECURITY LABEL FOR anon ON COLUMN customer.first_name IS 'MASKED WITH FUNCTION anon.pseudo_first_name('seed','salt')';\r\nERROR: syntax error at or near &quot;seed&quot; LINE 2: IS 'MASKED WITH FUNCTION anon.pseudo_first_name('seed','salt...<\/pre>\n<p>Il faut le savoir, car ce n&#8217;est pas forc\u00e9ment bien explicit\u00e9 dans la documentation : le simple guillemet ne permet pas d&#8217;\u00e9chapper correctement les caract\u00e8res. Il est donc n\u00e9cessaire d&#8217;ajouter d&#8217;autres caract\u00e8res d&#8217;\u00e9chappement. Dans ce cas, j&#8217;ai choisi d&#8217;utiliser le symbole &#8220;$&#8221;.<br \/>\nAinsi, au deuxi\u00e8me essai, cela m&#8217;a donn\u00e9 :<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">dvdrental=# SECURITY LABEL FOR anon ON COLUMN customer.first_name is 'MASKED WITH FUNCTION anon.pseudo_first_name($$seed$$, $$salt$$)';\r\nSECURITY LABEL<\/pre>\n<p>Ca avait l&#8217;air de fonctionner, j&#8217;ai donc lanc\u00e9 mon anonymisation pour v\u00e9rifier :<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">dvdrental=# SELECT anon.anonymize_database();\r\nDEBUG: Anonymize table public.customer with first_name = anon.pseudo_first_name($$seed$$)\r\nERROR: could not determine polymorphic type because input has type unknown\r\nCONTEXT: SQL statement &quot;UPDATE public.customer SET first_name = anon.pseudo_first_name($$seed$$)&quot;\r\nPL\/pgSQL function anon.anonymize_table(regclass) line 38 at EXECUTE\r\nSQL function &quot;anonymize_database&quot; statement 1 <\/pre>\n<p>Il s&#8217;av\u00e8re que la documentation ne pr\u00e9cise pas qu&#8217;il faut typer les deux champs qu&#8217;on utilise pour notre fonction, sinon PostgreSQL ne sait pas quoi en faire. Cela donne donc :<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">dvdrental=# SECURITY LABEL FOR anon ON COLUMN customer.first_name is 'MASKED WITH FUNCTION anon.pseudo_first_name(CAST($$seed$$ as text), cast($$salt$$ as text))';\r\nSECURITY LABEL<\/pre>\n<p>Et on applique ensuite les diff\u00e9rentes fonctions :<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">dvdrental=# SELECT anon.anonymize_database();\r\nDEBUG: Anonymize table public.customer with first_name = anon.pseudo_first_name(CAST($$seed$$ as text), cast($$salt$$ as text))\r\nanonymize_database\r\n--------------------\r\nt\r\n(1 row)<\/pre>\n<p>On va ensuite v\u00e9rifier nos donn\u00e9es dans la table pour voir si cela a \u00e9t\u00e9 appliqu\u00e9 :<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">dvdrental=# select * from customer limit 5;\r\ncustomer_id | store_id | first_name | last_name | email | address_id | activebool | create_date | last_update | active\r\n-------------+----------+------------+-----------+-----------------------------------+------------+------------+-------------+----------------------------+--------\r\n524 | 1 | Taniya | Ely | jared.ely@sakilacustomer.org | 530 | t | 2006-02-14 | 2024-01-29 09:26:48.268084 | 1\r\n15 | 1 | Taniya | Harris | helen.harris@sakilacustomer.org | 19 | t | 2006-02-14 | 2024-01-29 09:26:48.268084 | 1\r\n16 | 2 | Taniya | Martin | sandra.martin@sakilacustomer.org | 20 | t | 2006-02-14 | 2024-01-29 09:26:48.268084 | 0\r\n17 | 1 | Taniya | Thompson | donna.thompson@sakilacustomer.org | 21 | t | 2006-02-14 | 2024-01-29 09:26:48.268084 | 1\r\n18 | 2 | Taniya | Garcia | carol.garcia@sakilacustomer.org | 22 | t | 2006-02-14 | 2024-01-29 09:26:48.268084 | 1\r\n(5 rows)<\/pre>\n<p>On se rend alors compte que toutes les donn\u00e9es pseudonymis\u00e9es l&#8217;ont \u00e9t\u00e9 avec le m\u00eame r\u00e9sultat.<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">dvdrental=# select distinct first_name from customer;\r\nfirst_name\r\n------------\r\nTaniya\r\n(1 row)<\/pre>\n<p>Il est en effet pr\u00e9cis\u00e9 dans la documentation que si on voulait obtenir des pseudo diff\u00e9rents pour chaque ligne, il fallait ajouter un custom dataset d&#8217;un nombre sup\u00e9rieur de ligne au nombres d&#8217;entr\u00e9es dans notre table.<\/p>\n<p>Il existe un dataset fournit par dalibo (en fran\u00e7ais uniquement), disponible \u00e0 l&#8217;adresse <a href=\"https:\/\/gitlab.com\/dalibo\/postgresql_anonymizer\/-\/packages\">suivante <\/a>.<\/p>\n<p>Pour pouvoir l&#8217;int\u00e9grer dans votre extension, il vous faut le t\u00e9l\u00e9charger sur votre serveur, le placer dans le dossier de votre choix, et utiliser la commande :<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">dvdrental=#SELECT anon.init('\/path\/to\/custom_csv_files\/')<\/pre>\n<p>Vous pouvez \u00e9galement cr\u00e9er votre propre dataset sous la forme d&#8217;un fichier csv avec un script par exemple, pour peupler vos exemples avec vos propres donn\u00e9es personnalis\u00e9es.<\/p>\n<p>On peut tenter de r\u00e9aliser la m\u00eame op\u00e9ration mais pour une autre donn\u00e9e. On voit en effet que notre adresse email contient toujours les noms de familles des personnes, ils n&#8217;ont pas \u00e9t\u00e9 pseudonymis\u00e9s. On va donc changer cela :<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">dvdrental=# security label for anon on column customer.email is 'MASKED WITH FUNCTION anon.pseudo_email(CAST($$seed$$ as text), cast($$salt$$ as text))';\r\nSECURITY LABEL <\/pre>\n<p>Et une fois appliqu\u00e9 on obtient les donn\u00e9es suivantes :<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">dvdrental=# select * from customer limit 5;\r\ncustomer_id | store_id | first_name | last_name | email | address_id | activebool | create_date | last_update | active\r\n-------------+----------+------------+-----------+----------------------------+------------+------------+-------------+----------------------------+--------\r\n524 | 1 | Taniya | Ely | rowesally@kelly-dorsey.com | 530 | t | 2006-02-14 | 2024-01-29 09:42:03.560633 | 1\r\n235 | 1 | Taniya | Lynch | rowesally@kelly-dorsey.com | 239 | t | 2006-02-14 | 2024-01-29 09:42:03.560633 | 1\r\n15 | 1 | Taniya | Harris | rowesally@kelly-dorsey.com | 19 | t | 2006-02-14 | 2024-01-29 09:42:03.560633 | 1\r\n16 | 2 | Taniya | Martin | rowesally@kelly-dorsey.com | 20 | t | 2006-02-14 | 2024-01-29 09:42:03.560633 | 0\r\n17 | 1 | Taniya | Thompson | rowesally@kelly-dorsey.com | 21 | t | 2006-02-14 | 2024-01-29 09:42:03.560633 | 1\r\n(5 rows)<\/pre>\n<h2>Les limites de la pseudonymisation Postgres :<\/h2>\n<p>Actuellement il n&#8217;existe qu&#8217;une seule extension permettant de faire de la pseudonymisation sur PostgreSQL. Et elle pr\u00e9sente plusieurs limites :<\/p>\n<ol>\n<li>Les fonctions de pseudonymisation de postgresql anonymizer sont d\u00e9terministes. C&#8217;est \u00e0 dire que pour deux valeurs identiques, elles donneront toujours le m\u00eame r\u00e9sultat.<\/li>\n<li>Les donn\u00e9es pseudonymis\u00e9e restent des donn\u00e9es personnes ! Le\u00a0<strong>RGPD<\/strong>\u00a0pr\u00e9cise tr\u00e8s clairement que : \u00ab les donn\u00e9es \u00e0 caract\u00e8re personnel qui ont fait l\u2019objet d\u2019une pseudonymisation [\u2026] devraient \u00eatre consid\u00e9r\u00e9es comme des informations concernant une personne physique identifiable. \u00bb<\/li>\n<li>Les co\u00fbts en performance, comme \u00e9voqu\u00e9 dans mon pr\u00e9c\u00e9dent article pour cette m\u00eame extension, sont \u00e9lev\u00e9s. C&#8217;est quelque chose \u00e0 consid\u00e9rer quand on veut utiliser cette m\u00e9thode.<\/li>\n<li>Il faut pouvoir g\u00e9rer correctement les cl\u00e9s qu&#8217;on utilises pour la pseudonymisation, c&#8217;est une charge suppl\u00e9mentaire.<\/li>\n<li>La documentation n&#8217;est pas forc\u00e9ment tout \u00e0 fait bien mise \u00e0 jour, et certaines choses ne sont pas \u00e9videntes \u00e0 appr\u00e9hender.<\/li>\n<li>L&#8217;extension est toujours en d\u00e9veloppement et en changements constants, nous ne sommes pas \u00e0 l&#8217;abris de rencontrer des bugs au fil des versions. Pour \u00e9crire cet article, j&#8217;ai du contacter directement le d\u00e9veloppeur car au d\u00e9but de sa r\u00e9daction, les fonctions de pseudonymisation ne fonctionnaient pas.<\/li>\n<\/ol>\n<h2>Conclusion :<\/h2>\n<p>En conclusion, la pseudonymisation des donn\u00e9es dans PostgreSQL se r\u00e9v\u00e8le \u00eatre une strat\u00e9gie de protection de la vie priv\u00e9e et de conformit\u00e9 r\u00e9glementaire particuli\u00e8rement robuste. En adoptant cette approche, les entreprises peuvent tirer parti des avantages significatifs tels que la pr\u00e9servation de la confidentialit\u00e9 des donn\u00e9es tout en permettant l&#8217;analyse et le traitement des informations sensibles.<\/p>\n<p>D&#8217;un c\u00f4t\u00e9, la pseudonymisation offre une solution efficace pour \u00e9quilibrer la n\u00e9cessit\u00e9 d&#8217;acc\u00e9der aux donn\u00e9es avec le respect des r\u00e9glementations de confidentialit\u00e9. Les donn\u00e9es pseudonymis\u00e9es demeurent utiles pour les analyses internes tout en limitant le risque d&#8217;exploitation malveillante.<\/p>\n<p>Cependant, il est crucial de reconna\u00eetre que la pseudonymisation n&#8217;est pas une panac\u00e9e. Elle peut pr\u00e9senter des d\u00e9fis en termes de gestion des cl\u00e9s de pseudonymisation, de complexit\u00e9 accrue dans la maintenance des bases de donn\u00e9es, et de potentielles vuln\u00e9rabilit\u00e9s si elle est mal mise en \u0153uvre.<\/p>\n<p>Dans une perspective plus large, il est \u00e9galement pertinent de consid\u00e9rer l&#8217;anonymisation des donn\u00e9es comme une alternative. Bien que l&#8217;anonymisation puisse offrir un niveau sup\u00e9rieur de protection, elle peut \u00e9galement rendre les donn\u00e9es moins utiles pour certaines applications, limitant ainsi leur valeur pour les analyses internes.<\/p>\n<p>En d\u00e9finitive, le choix entre la pseudonymisation et l&#8217;anonymisation d\u00e9pend des besoins sp\u00e9cifiques de chaque organisation, du contexte r\u00e9glementaire et des compromis acceptables entre la protection de la vie priv\u00e9e et l&#8217;utilit\u00e9 des donn\u00e9es. En \u00e9laborant une strat\u00e9gie de gestion des donn\u00e9es judicieuse, les entreprises peuvent naviguer avec succ\u00e8s dans le paysage complexe de la confidentialit\u00e9 des donn\u00e9es dans PostgreSQL.<\/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%2F10377&#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%2F10377&#038;title=Pseudonymiser%20vos%20bases%20PostgreSQL\" 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=Pseudonymiser%20vos%20bases%20PostgreSQL&#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%2F10377\" 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>Dans l&#8217;\u00e8re num\u00e9rique actuelle, o\u00f9 la s\u00e9curit\u00e9 des donn\u00e9es occupe une place centrale, la pseudonymisation \u00e9merge comme une strat\u00e9gie cruciale pour renforcer la confidentialit\u00e9 des informations stock\u00e9es dans les bases de donn\u00e9es. Cette approche, bien que semblable \u00e0 l&#8217;anonymisation, se&hellip; <a href=\"https:\/\/blog.capdata.fr\/index.php\/pseudonymisation-postgresql\/\" class=\"more-link\">Continuer la lecture <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":41,"featured_media":10453,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[266],"tags":[407,477,478],"class_list":["post-10377","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-postgresql","tag-anonymisation","tag-pseudomynisation","tag-rgpd"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Pseudonymiser vos bases PostgreSQL - Capdata TECH BLOG<\/title>\n<meta name=\"description\" content=\"pseudonymisation anonymisation s\u00e9curit\u00e9 rgdp postgresql Pseudonymiser vos bases PostgreSQL\" \/>\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\/pseudonymisation-postgresql\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Pseudonymiser vos bases PostgreSQL - Capdata TECH BLOG\" \/>\n<meta property=\"og:description\" content=\"pseudonymisation anonymisation s\u00e9curit\u00e9 rgdp postgresql Pseudonymiser vos bases PostgreSQL\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.capdata.fr\/index.php\/pseudonymisation-postgresql\/\" \/>\n<meta property=\"og:site_name\" content=\"Capdata TECH BLOG\" \/>\n<meta property=\"article:published_time\" content=\"2024-01-30T17:54:28+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-01-31T10:37:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2024\/01\/F-5CIVNXsAAcZyh-scaled.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"2560\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Sarah FAVEERE\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Sarah FAVEERE\" \/>\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\/pseudonymisation-postgresql\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/pseudonymisation-postgresql\/\"},\"author\":{\"name\":\"Sarah FAVEERE\",\"@id\":\"https:\/\/blog.capdata.fr\/#\/schema\/person\/686f2452f7ec79115d31e41c230a9da2\"},\"headline\":\"Pseudonymiser vos bases PostgreSQL\",\"datePublished\":\"2024-01-30T17:54:28+00:00\",\"dateModified\":\"2024-01-31T10:37:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/pseudonymisation-postgresql\/\"},\"wordCount\":2824,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/blog.capdata.fr\/#organization\"},\"keywords\":[\"anonymisation\",\"pseudomynisation\",\"rgpd\"],\"articleSection\":[\"PostgreSQL\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.capdata.fr\/index.php\/pseudonymisation-postgresql\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/pseudonymisation-postgresql\/\",\"url\":\"https:\/\/blog.capdata.fr\/index.php\/pseudonymisation-postgresql\/\",\"name\":\"Pseudonymiser vos bases PostgreSQL - Capdata TECH BLOG\",\"isPartOf\":{\"@id\":\"https:\/\/blog.capdata.fr\/#website\"},\"datePublished\":\"2024-01-30T17:54:28+00:00\",\"dateModified\":\"2024-01-31T10:37:12+00:00\",\"description\":\"pseudonymisation anonymisation s\u00e9curit\u00e9 rgdp postgresql Pseudonymiser vos bases PostgreSQL\",\"breadcrumb\":{\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/pseudonymisation-postgresql\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.capdata.fr\/index.php\/pseudonymisation-postgresql\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.capdata.fr\/index.php\/pseudonymisation-postgresql\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/blog.capdata.fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Pseudonymiser vos bases PostgreSQL\"}]},{\"@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\/686f2452f7ec79115d31e41c230a9da2\",\"name\":\"Sarah FAVEERE\",\"sameAs\":[\"http:\/\/blog.capdata.fr\"],\"url\":\"https:\/\/blog.capdata.fr\/index.php\/author\/sfaveere\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Pseudonymiser vos bases PostgreSQL - Capdata TECH BLOG","description":"pseudonymisation anonymisation s\u00e9curit\u00e9 rgdp postgresql Pseudonymiser vos bases PostgreSQL","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\/pseudonymisation-postgresql\/","og_locale":"fr_FR","og_type":"article","og_title":"Pseudonymiser vos bases PostgreSQL - Capdata TECH BLOG","og_description":"pseudonymisation anonymisation s\u00e9curit\u00e9 rgdp postgresql Pseudonymiser vos bases PostgreSQL","og_url":"https:\/\/blog.capdata.fr\/index.php\/pseudonymisation-postgresql\/","og_site_name":"Capdata TECH BLOG","article_published_time":"2024-01-30T17:54:28+00:00","article_modified_time":"2024-01-31T10:37:12+00:00","og_image":[{"width":2560,"height":2560,"url":"https:\/\/blog.capdata.fr\/wp-content\/uploads\/2024\/01\/F-5CIVNXsAAcZyh-scaled.jpeg","type":"image\/jpeg"}],"author":"Sarah FAVEERE","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"Sarah FAVEERE","Dur\u00e9e de lecture estim\u00e9e":"13 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.capdata.fr\/index.php\/pseudonymisation-postgresql\/#article","isPartOf":{"@id":"https:\/\/blog.capdata.fr\/index.php\/pseudonymisation-postgresql\/"},"author":{"name":"Sarah FAVEERE","@id":"https:\/\/blog.capdata.fr\/#\/schema\/person\/686f2452f7ec79115d31e41c230a9da2"},"headline":"Pseudonymiser vos bases PostgreSQL","datePublished":"2024-01-30T17:54:28+00:00","dateModified":"2024-01-31T10:37:12+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.capdata.fr\/index.php\/pseudonymisation-postgresql\/"},"wordCount":2824,"commentCount":0,"publisher":{"@id":"https:\/\/blog.capdata.fr\/#organization"},"keywords":["anonymisation","pseudomynisation","rgpd"],"articleSection":["PostgreSQL"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.capdata.fr\/index.php\/pseudonymisation-postgresql\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.capdata.fr\/index.php\/pseudonymisation-postgresql\/","url":"https:\/\/blog.capdata.fr\/index.php\/pseudonymisation-postgresql\/","name":"Pseudonymiser vos bases PostgreSQL - Capdata TECH BLOG","isPartOf":{"@id":"https:\/\/blog.capdata.fr\/#website"},"datePublished":"2024-01-30T17:54:28+00:00","dateModified":"2024-01-31T10:37:12+00:00","description":"pseudonymisation anonymisation s\u00e9curit\u00e9 rgdp postgresql Pseudonymiser vos bases PostgreSQL","breadcrumb":{"@id":"https:\/\/blog.capdata.fr\/index.php\/pseudonymisation-postgresql\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.capdata.fr\/index.php\/pseudonymisation-postgresql\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.capdata.fr\/index.php\/pseudonymisation-postgresql\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/blog.capdata.fr\/"},{"@type":"ListItem","position":2,"name":"Pseudonymiser vos bases PostgreSQL"}]},{"@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\/686f2452f7ec79115d31e41c230a9da2","name":"Sarah FAVEERE","sameAs":["http:\/\/blog.capdata.fr"],"url":"https:\/\/blog.capdata.fr\/index.php\/author\/sfaveere\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/10377","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\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/comments?post=10377"}],"version-history":[{"count":20,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/10377\/revisions"}],"predecessor-version":[{"id":10462,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/posts\/10377\/revisions\/10462"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/media\/10453"}],"wp:attachment":[{"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/media?parent=10377"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/categories?post=10377"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.capdata.fr\/index.php\/wp-json\/wp\/v2\/tags?post=10377"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}