<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog post &#8211; Smals Research</title>
	<atom:link href="https://www.smalsresearch.be/category/blog-post/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.smalsresearch.be</link>
	<description></description>
	<lastBuildDate>Mon, 04 May 2026 09:26:24 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://www.smalsresearch.be/wp-content/uploads/2026/01/cropped-cropped-Smals_Research-32x32.png</url>
	<title>Blog post &#8211; Smals Research</title>
	<link>https://www.smalsresearch.be</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>&#8220;Talk to your data&#8221; avec ChatGPT</title>
		<link>https://www.smalsresearch.be/talk-to-your-data-avec-chatgpt/</link>
		
		<dc:creator><![CDATA[Vandy Berten]]></dc:creator>
		<pubDate>Tue, 28 Apr 2026 07:08:41 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[Artificial intelligence]]></category>
		<category><![CDATA[ChatGPT]]></category>
		<guid isPermaLink="false">https://www.smalsresearch.be/?p=26535</guid>

					<description><![CDATA[L&#8217;avènement récent de l&#8217;intelligence artificielle générative (GenAI) a bouleversé de nombreux secteurs, y compris directement en informatique (assistants de codage, tests automatiques, traduction de langages de programmation&#8230;). Le domaine de l&#8217;analyse de données, ou data science, n&#8217;y fait pas exception. On dit souvent que 80 % du temps d&#8217;un data scientist est consacré à la [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>L&#8217;avènement récent de l&#8217;intelligence artificielle générative (GenAI) a bouleversé de nombreux secteurs, y compris directement en informatique (<a href="https://www.smalsresearch.be/vibe-coding-avec-les-ides-agentique/">assistants</a> de <a href="https://www.smalsresearch.be/opensource-coding-assistants-fr/">codage</a>, tests automatiques, traduction de langages de programmation&#8230;). Le domaine de l&#8217;analyse de données, ou <em>data science</em>, n&#8217;y fait pas exception. On dit souvent que 80 % du temps d&#8217;un <em>data scientist</em> est consacré à la préparation des données (ingestion, transformation, nettoyage, enrichissement&#8230;), qui est souvent laborieuse et répétitive, et que seulement 20 % fait appel à ses compétences les plus pointues. Peut-on utiliser le GenAI pour accélérer ces 80 %&nbsp;? Nous allons voir dans cet article préliminaire que la réponse est largement positive, mais qu&#8217;en plus les 20 % restants sont également fameusement entamés. Nous verrons dans quelle mesure un outil comme ChatGPT peut aider à analyser des données&nbsp;: comprendre ce qu&#8217;elles contiennent, en extraire des indicateurs statistiques, identifier des anomalies, expliquer des phénomènes particuliers&#8230;</p>



<p>Pour illustrer ces propos, nous allons nous baser sur le jeu de données <a href="https://www.kaggle.com/datasets/nadianassiri/urgences-data">&#8220;urgences data&#8221;, disponible sur Kaggle</a>. Il s&#8217;agit d&#8217;un fichier CSV de ~430 MB, comprenant 336 253 lignes et 39 colonnes, sans aucune métadonnée associée. Chaque ligne correspond à la visite d&#8217;un patient dans le service d&#8217;urgences d&#8217;un hôpital (non identifié) du nord de la France, entre le 6 janvier 2016 et le 6 décembre 2020. On y trouve une multitude d&#8217;informations&nbsp;: date et heure d&#8217;arrivée et de sortie, moyen d&#8217;arrivée, motif, âge, un certain nombre de paramètres médicaux, tels que fréquence cardiaque, tension, température, saturation, ainsi que des booléens semblant indiquer si des examens complémentaires ont été prescrits (biologie, radio, échographie, scanner, IRM&#8230;)</p>



<p>Nous allons utiliser &#8220;Data Analyst&#8221;, un des &#8220;GPTs&#8221; proposé dans ChatGPT. La version gratuite étant limitée à un très petit nombre de questions, nous avons utilisé une version payante (&#8220;Personal Plus&#8221;). Nous avons interagi en anglais pour cet exercice, mais des résultats semblables auraient probablement été obtenus en français ou en néerlandais.</p>



<h1 class="wp-block-heading">Analyse préliminaire</h1>



<p>Une première étape peut consister à simplement soumettre le fichier à analyser à &#8220;Data Analyst&#8221;, et lui demander de dire ce qu&#8217;il peut y trouver. Plus formellement, une question telle que &#8220;<em>What useful insight can you extract from those data?</em>&#8221; nous fournit le résultat ci-dessous.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_1.png"><img fetchpriority="high" decoding="async" width="874" height="1433" data-id="26614" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_1.png" alt="" class="wp-image-26614" style="aspect-ratio:1" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_1.png 874w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_1-183x300.png 183w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_1-625x1024.png 625w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_1-768x1259.png 768w" sizes="(max-width: 874px) 100vw, 874px" /></a></figure>



<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_2.png"><img decoding="async" width="823" height="1492" data-id="26616" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_2.png" alt="" class="wp-image-26616" style="aspect-ratio:1" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_2.png 823w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_2-165x300.png 165w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_2-565x1024.png 565w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_2-768x1392.png 768w" sizes="(max-width: 823px) 100vw, 823px" /></a></figure>



<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_3.png"><img decoding="async" width="853" height="882" data-id="26615" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_3.png" alt="" class="wp-image-26615" style="aspect-ratio:1" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_3.png 853w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_3-290x300.png 290w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_insight_3-768x794.png 768w" sizes="(max-width: 853px) 100vw, 853px" /></a></figure>
<figcaption class="blocks-gallery-caption wp-element-caption">&#8220;What useful insight can you extract from those data?&#8221;</figcaption></figure>



<p>Nous obtenons un résultat qui va suivre une structure que l&#8217;on retrouvera dans presque toutes les réponses&nbsp;: </p>



<ol class="wp-block-list">
<li>Une série de graphiques. Ici, une distribution de l&#8217;âge des patients, la répartition moyenne suivant l&#8217;heure de la journée, ainsi que la répartition de l&#8217;orientation (retour domicile, transfert interne&#8230;). Notons que sans qu&#8217;on n&#8217;ait rien eu à dire, ChatGPT a compris qu&#8217;il s&#8217;agissait de patients d&#8217;un service d&#8217;urgences ;</li>



<li>Une analyse textuelle structurée de ce qu&#8217;il a pu comprendre des données. La démographie des patients, quelles sont les heures de pointe, où vont les patients à la sortie et comment sont-ils arrivés ;</li>



<li>Des propositions stratégiques ;</li>



<li>Des propositions d&#8217;étapes suivantes. &#8220;<em>If you&#8217;d like, I can next:</em>&#8220;, suivi d&#8217;une série de prompts pertinents pour continuer l&#8217;analyse (qu&#8217;il faut malheureusement copier-coller).</li>
</ol>



<figure class="wp-block-image alignright size-full is-resized"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/image.png"><img loading="lazy" decoding="async" width="671" height="681" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/image.png" alt="" class="wp-image-26618" style="aspect-ratio:1;object-fit:cover;width:320px;height:auto" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/image.png 671w, https://www.smalsresearch.be/wp-content/uploads/2026/03/image-296x300.png 296w" sizes="auto, (max-width: 671px) 100vw, 671px" /></a></figure>



<p>Par ailleurs, le texte termine toujours par un lien &#8220;&lt;/>&#8221;, que l&#8217;on ne retrouve pas dans un chat ChatGPT &#8220;de base&#8221; et sur lequel on peut cliquer pour obtenir le code Python sur lequel est basé cette analyse. Celui-ci, réalisé en utilisant la bibliothèque &#8220;Pandas&#8221; de Python (un des outils open source le plus répandu d&#8217;analyse de données/data science), permet de générer les graphiques proposés, ainsi que tous les chiffres utilisés dans les descriptions. Il est donc tout à fait possible non seulement d&#8217;utiliser ce code directement, mais aussi de s&#8217;assurer que les chiffres ne sont pas totalement inventés sur la base de modèles statistiques généraux et bien calculés à partir des données fournies.</p>



<p>On a donc pu, en une seule phrase et à peine une minute d&#8217;attente, obtenir trois graphiques, du code Python et un texte descriptif qu&#8217;un data scientist aurait typiquement mis plusieurs heures à obtenir. Il s&#8217;agit, bien sûr, d&#8217;une première approche très sommaire. Mais on peut aller plus loin.</p>



<p>On peut par exemple demande de fournir une description statistique pour chaque colonne. On obtient ici en résultat une longue description très structurée, par type de variable (numérique ou catégorique) avec une série d&#8217;indicateurs&nbsp;: moyenne, minimum/maximum, nombre de valeurs manquantes&#8230; ainsi qu&#8217;un commentaire (&#8220;<em>Not usable for analysis</em>&#8220;, &#8220;<em>Vital signs moderately complete</em>&#8220;, &#8220;<em>Excellent for resource utilization analysis</em>&#8220;, &#8220;<em>Likely categorical indicator&#8221;</em>&#8230;). L&#8217;outil nous propose également quelques observations liées à la qualité des données (Exemple&nbsp;: &#8220;<em>Outliers: Age max = 218 (likely error)</em>&#8220;).</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_1-1.png"><img loading="lazy" decoding="async" width="567" height="1024" data-id="26621" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_1-1-567x1024.png" alt="" class="wp-image-26621" style="aspect-ratio:1" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_1-1-567x1024.png 567w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_1-1-166x300.png 166w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_1-1-768x1388.png 768w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_1-1-850x1536.png 850w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_1-1.png 860w" sizes="auto, (max-width: 567px) 100vw, 567px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_2.png"><img loading="lazy" decoding="async" width="509" height="1024" data-id="26619" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_2-509x1024.png" alt="" class="wp-image-26619" style="aspect-ratio:1" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_2-509x1024.png 509w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_2-149x300.png 149w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_2-768x1546.png 768w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_2-763x1536.png 763w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_2.png 828w" sizes="auto, (max-width: 509px) 100vw, 509px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_3.png"><img loading="lazy" decoding="async" width="831" height="914" data-id="26620" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_3.png" alt="" class="wp-image-26620" style="aspect-ratio:1" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_3.png 831w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_3-273x300.png 273w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_descr_stats_3-768x845.png 768w" sizes="auto, (max-width: 831px) 100vw, 831px" /></a></figure>
<figcaption class="blocks-gallery-caption wp-element-caption">&#8220;Perform descriptive statistics on each column&#8221;</figcaption></figure>



<p>De façon similaire, on pourrait demander une &#8220;EDA&#8221; (Exploratory Data Analysis), qui fournira une analyse semblable, en partie redondante mais couvrant d&#8217;autres aspects.</p>



<figure class="wp-block-gallery has-nested-images columns-4 is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_1.png"><img loading="lazy" decoding="async" width="532" height="1024" data-id="26622" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_1-532x1024.png" alt="" class="wp-image-26622" style="aspect-ratio:1" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_1-532x1024.png 532w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_1-156x300.png 156w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_1-768x1478.png 768w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_1-798x1536.png 798w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_1.png 827w" sizes="auto, (max-width: 532px) 100vw, 532px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_2.png"><img loading="lazy" decoding="async" width="546" height="1024" data-id="26624" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_2-546x1024.png" alt="" class="wp-image-26624" style="aspect-ratio:1" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_2-546x1024.png 546w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_2-160x300.png 160w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_2-768x1441.png 768w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_2-818x1536.png 818w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_2.png 820w" sizes="auto, (max-width: 546px) 100vw, 546px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_3.png"><img loading="lazy" decoding="async" width="560" height="1024" data-id="26625" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_3-560x1024.png" alt="" class="wp-image-26625" style="aspect-ratio:1" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_3-560x1024.png 560w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_3-164x300.png 164w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_3-768x1403.png 768w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_3.png 827w" sizes="auto, (max-width: 560px) 100vw, 560px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_4.png"><img loading="lazy" decoding="async" width="567" height="1024" data-id="26623" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_4-567x1024.png" alt="" class="wp-image-26623" style="aspect-ratio:1" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_4-567x1024.png 567w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_4-166x300.png 166w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_4-768x1388.png 768w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_eda_4.png 830w" sizes="auto, (max-width: 567px) 100vw, 567px" /></a></figure>
<figcaption class="blocks-gallery-caption wp-element-caption">&#8220;Provide an EDA for this dataset&#8221;</figcaption></figure>



<p>Avec ce type de &#8220;prompt&#8221;, on a donc, en quelques minutes seulement, un premier aperçu détaillé, chiffré mais clair et facile à comprendre d&#8217;un jeu de données raisonnablement volumineux. ChatGPT comprend, ou à tout le moins se comporte comme s&#8217;il comprenait le contenu des données&nbsp;:</p>



<figure class="wp-block-image alignright size-medium"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h10_30.png"><img loading="lazy" decoding="async" width="300" height="190" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h10_30-300x190.png" alt="" class="wp-image-26626" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h10_30-300x190.png 300w, https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h10_30-768x485.png 768w, https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h10_30.png 845w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a></figure>



<ul class="wp-block-list">
<li>Il calcule un &#8220;<em>length of stay</em>&#8220;, interprétant donc bien deux colonnes (DH_arrivee et DH_sortie). Petit bémol cependant&nbsp;: dans les données, l&#8217;heure d&#8217;arrivée contient une date et une heure, mais le &#8220;DH_sortie&#8221; uniquement la date (avec 00:00 comme heure), rendant le calcul peu pertinent, surtout pour les courts séjours. Mais si on lui demande comment il a calculé ce &#8220;<em>length of stay</em>&#8220;, il fait remarquer le problème ;</li>



<li>Il &#8220;comprend&#8221; que la colonne &#8220;Code_CCMU&#8221; (avec les codes 1, 2, 3, 4, 5, P ou D) fait référence à la nomenclature française de la &#8220;<a href="https://fr.wikipedia.org/wiki/Classification_clinique_des_malades_aux_urgences">Classification Clinique des Malades aux Urgences</a>&#8221; et dénote la gravité. Il propose de faire une &#8220;severity analysis (CCMU code distribution)&#8221;, dans laquelle il interprète correctement les codes ;</li>



<li>Il fait des propositions, certes un peu naïves, mais pertinentes dans le contexte, dont voici deux exemples&nbsp;:</li>
</ul>



<figure class="wp-block-gallery has-nested-images columns-default wp-block-gallery-4 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h14_41.png"><img loading="lazy" decoding="async" width="627" height="418" data-id="26627" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h14_41.png" alt="" class="wp-image-26627" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h14_41.png 627w, https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h14_41-300x200.png 300w" sizes="auto, (max-width: 627px) 100vw, 627px" /></a></figure>



<figure class="wp-block-image size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h18_59.png"><img loading="lazy" decoding="async" width="530" height="294" data-id="26628" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h18_59.png" alt="" class="wp-image-26628" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h18_59.png 530w, https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h18_59-300x166.png 300w" sizes="auto, (max-width: 530px) 100vw, 530px" /></a></figure>
</figure>



<h1 class="wp-block-heading">Analyse par catégorie</h1>



<p>En observant les données, nous avons remarqué deux colonnes concernant la raison d&#8217;arrivée du patient&nbsp;: une colonne &#8220;motif_entree&#8221;, très peu structurée (&#8220;Trauma cheville G&#8221;, &#8220;A avalé une LED avec une pile&#8221;&#8230;) et une autre &#8220;semi-structurée&#8221;&nbsp;: &#8220;Cardiologie: Douleur thoracique atypique&#8221;, &#8220;Pneumologie: Dyspnée sans détresse&#8221;, &#8220;Toxicologie: Alcoolisation/Ivresse aigue&#8221;&#8230; Il serait intéressant de pouvoir analyser certains éléments en fonction d&#8217;une &#8220;catégorie&#8221;&nbsp;: &#8220;Cardiologie&#8221;, &#8220;Pneumologie&#8221;, &#8220;Toxicologie&#8221;&#8230;</p>



<p>On peut tout simplement demander à ChatGPT &#8220;<em>extract categories from motif_venue</em>&#8220;, sans lui donner aucune information sur la façon de procéder. On reçoit alors en réponse une distribution de ce nouvel attribut, expliquant comment il l&#8217;a réalisé, ainsi que quelques commentaires pertinents sur la qualité des données&nbsp;: </p>



<figure class="wp-block-gallery has-nested-images columns-default wp-block-gallery-5 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h52_55.png"><img loading="lazy" decoding="async" width="725" height="746" data-id="26632" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h52_55.png" alt="" class="wp-image-26632" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h52_55.png 725w, https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h52_55-292x300.png 292w" sizes="auto, (max-width: 725px) 100vw, 725px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h53_20.png"><img loading="lazy" decoding="async" width="572" height="314" data-id="26633" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h53_20.png" alt="" class="wp-image-26633" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h53_20.png 572w, https://www.smalsresearch.be/wp-content/uploads/2026/03/2026-03-06_15h53_20-300x165.png 300w" sizes="auto, (max-width: 572px) 100vw, 572px" /></a></figure>
</figure>



<p>Une question qui viendrait naturellement à l&#8217;esprit serait de voir comment celles-ci se comportent dans le temps. On peut par exemple imaginer que les problèmes pulmonaires surviennent surtout en hiver à l&#8217;époque des grippes et autres virus. Mais qu&#8217;en est-il des autres pathologies&nbsp;?</p>



<figure class="wp-block-image alignleft size-full"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/category_linechart.png"><img loading="lazy" decoding="async" width="592" height="491" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/category_linechart.png" alt="" class="wp-image-26634" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/category_linechart.png 592w, https://www.smalsresearch.be/wp-content/uploads/2026/03/category_linechart-300x249.png 300w" sizes="auto, (max-width: 592px) 100vw, 592px" /></a></figure>



<p>Demandons à ChatGPT &#8220;<em>Plot occurrence line charts grouped by cleansed categories, for the top 10</em>&#8220;. Nous obtiendrons alors le graphique ci-contre, ainsi qu&#8217;une série de commentaires. On peut être surpris par la chute vertigineuse des chiffres, toutes catégories confondues, survenue début 2020. Mais toute personne n&#8217;ayant pas vécu dans une grotte à cette période en aura rapidement compris la raison&#8230; qui n&#8217;a pas échappé à ChatGPT, comme en témoigne un de ses commentaires&nbsp;:</p>



<p>&#8220;<em>The sharp drop in early 2020 is visible across all categories — a clear COVID shock to ED visit</em>&#8220;</p>



<p>Pour obtenir des tendances saisonnières, on peut demander de sommer les trois années pour lesquelles on a des données entières et de lisser les données, en considérant une moyenne glissante sur 7 jours&nbsp;: &#8220;<em>For the top 10 cleansed categories, plot the number of visits per date in year (summing up values for 2017, 2018 and 2019, excluding 2016 and 2020), with a moving average of 7 days</em>&#8220;.</p>



<p>Après quelques essais-erreurs de prompts pour sortir la légende du graphique ou adapter divers aspects, on obtient le résultat suivant&nbsp;:</p>



<figure class="wp-block-image size-large"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/category_linechart_movavg.png"><img loading="lazy" decoding="async" width="1024" height="504" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/category_linechart_movavg-1024x504.png" alt="" class="wp-image-26637" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/category_linechart_movavg-1024x504.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2026/03/category_linechart_movavg-300x148.png 300w, https://www.smalsresearch.be/wp-content/uploads/2026/03/category_linechart_movavg-768x378.png 768w, https://www.smalsresearch.be/wp-content/uploads/2026/03/category_linechart_movavg.png 1186w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>Comme on s&#8217;y attendait, on peut observer que les pathologies pulmonaires (en brun) sont plus élevées en hiver qu&#8217;en été, mais ce qui est surprenant, c&#8217;est cet énorme pic à la toute fin de l&#8217;année de la stomatologie. Après s&#8217;être assuré que le pic se reproduisait bien tous les ans avec quelques prompts que nous passerons sous silence, nous avons demandé &#8220;<em>how to explain the peak of total visits for stomatology for the last week?</em>&#8220;<em>. </em>Nous avons été clairement bluffés par la pertinence de la réponse. </p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-6 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_stomato_1.png"><img loading="lazy" decoding="async" width="609" height="1024" data-id="26638" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_stomato_1-609x1024.png" alt="" class="wp-image-26638" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_stomato_1-609x1024.png 609w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_stomato_1-179x300.png 179w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_stomato_1-768x1291.png 768w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_stomato_1.png 833w" sizes="auto, (max-width: 609px) 100vw, 609px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_stomato_2.png"><img loading="lazy" decoding="async" width="654" height="1024" data-id="26639" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_stomato_2-654x1024.png" alt="" class="wp-image-26639" srcset="https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_stomato_2-654x1024.png 654w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_stomato_2-192x300.png 192w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_stomato_2-768x1202.png 768w, https://www.smalsresearch.be/wp-content/uploads/2026/03/chatgpt_urgences_stomato_2.png 815w" sizes="auto, (max-width: 654px) 100vw, 654px" /></a></figure>
</figure>



<p>Deux explications, que ChatGPT n&#8217;a pas pu trouver dans le jeu de données, mais uniquement en faisant le lien avec son &#8220;savoir général&#8221;, nous paraissent très plausibles&nbsp;:</p>



<ul class="wp-block-list">
<li>Les cabinets de dentisteries sont majoritairement fermés pendant les fêtes (ou plus généralement pendant les congés, vu les deux plus petits pics) ;</li>



<li>Beaucoup de monde veut &#8220;épuiser&#8221; ses possibilités de remboursement avant la fin de l&#8217;année. </li>
</ul>



<p>Il va sans dire qu&#8217;un approfondissement serait nécessaire avant d&#8217;en tirer des décisions opérationnelles, mais on a déjà ici à très petits frais une série d&#8217;hypothèses à explorer.</p>



<h1 class="wp-block-heading">Limitations</h1>



<p>Si un premier aperçu peut sembler impressionnant, il faut cependant rester prudent. De toute évidence, un tel outil peut être un allié précieux pour un <em>data scientist</em>, et peut même permettre à des profils &#8220;métiers&#8221; aux compétences techniques limitées d&#8217;accéder à une première analyse. Voici quelques points d&#8217;attention issus de notre expérience sur ce jeu de données.</p>



<ul class="wp-block-list">
<li>On ne devient pas &#8220;data scientist&#8221; simplement parce qu&#8217;on est capable de produire des beaux graphiques ou livrer des chiffres. Encore faut-il être capable de les interpréter, de s&#8217;assurer qu&#8217;on n&#8217;est pas tombé dans un des nombreux pièges que les statistiques nous tendent ;</li>



<li>Dans notre exemple, nous avons envoyé tout notre jeu de données à ChatGPT. Nous n&#8217;avons aucun contrôle sur ce qu&#8217;il en fait. Il s&#8217;agissait en l&#8217;occurrence de données publiques, mais qu&#8217;en sera-t-il avec des données confidentielles&nbsp;? Il est toujours possible d&#8217;installer un LLM on-premise, mais les coûts sont autrement plus élevés et les performances moindres ;</li>



<li>Nous n&#8217;avons testé qu&#8217;un exemple avec une seule table. La littérature semble montrer que ça reste valable avec une base de données plus complexe, il nous faudra encore l&#8217;expérimenter ;</li>



<li>Le mode &#8220;question-réponse&#8221; permet uniquement un long dialogue linéaire. On se retrouve vite avec une longue discussion très désordonnée, plusieurs tentatives pour arriver à faire comprendre à l&#8217;outil ce que l&#8217;on veut. Si l&#8217;on veut par exemple corriger un critère en amont d&#8217;une analyse déjà faite (par exemple, la limiter à une période dans le temps, ou éliminer certains types de données), on ne peut pas revenir en arrière. Il sera nécessaire de recommencer un nouveau chat, ou de reposer toutes les questions ;</li>



<li>Dans le même ordre d&#8217;idée, si les données d&#8217;entrée sont mises à jour, il sera nécessaire de recommencer toute la conversation ;</li>



<li>À côté de l&#8217;aspect peu structuré, on note aussi un manque de cohérence&nbsp;:
<ul class="wp-block-list">
<li>Lors de l&#8217;extraction de la &#8220;catégorie&#8221;, nous avons demandé, outre la séparation sur la base du &#8220;:&#8221;, de corriger également certains problèmes de qualité (pour par exemple remplacer &#8220;Cardiovasculaire&#8221; par &#8220;Cardiologie&#8221; ou &#8220;Intoxications&#8221; par &#8220;Toxicologie&#8221;). Les questions qui suivaient de près ce nettoyage considéraient la version la plus élaborée. Mais quelques jours après, quand nous évoquions &#8220;cleansed categories&#8221;, ChatGPT se contentait de la séparation sur la base du &#8220;:&#8221;,</li>



<li>Nous avons posé exactement la même question à un mois d&#8217;intervalle. Les valeurs numériques fournies dans la réponse restaient cohérentes, mais le texte était radicalement différent sur la forme (bien que semblable sur le fond) ;</li>
</ul>
</li>



<li>Le code Python proposé à chaque question est réellement exécuté sur les serveurs de ChatGPT qui se sert du résultat pour générer sa réponse. Mais le temps d&#8217;exécution disponible est assez limité. Entraîner un modèle de Machine Learning simple (par exemple &#8220;<em>Compute feature importance using Random Forest, with &#8216;scanner&#8217; as target</em>&#8220;) provoque souvent un <em>timeout</em>. Cependant, ChatGPT fait alors une série de propositions, visant à réduire le temps de calcul nécessaire (stratification, réduction du nombre d&#8217;arbres, diminution de la cardinalité de certaines variables&#8230;).</li>
</ul>



<p>Une approche pertinente serait probablement d&#8217;utiliser ChatGPT ou un de ses concurrents pour découvrir les données, identifier rapidement des anomalies ou des problèmes de qualité, les approches possibles, les modèles de prédiction adaptés&#8230; On pourrait aussi demander de générer des graphiques, des tableaux, des chiffres&#8230; On pourra ensuite récupérer les morceaux de codes proposés qui pourront être intégrés dans un script ou un notebook consolidé. Notons que l&#8217;on peut également interagir avec les API de ChatGPT et autres Gemini. Nous aborderons cette approche dans un prochain article.</p>



<p>En regardant vers l&#8217;avenir, nous ne craignons pas que le GenAI remplace les data scientists. De toute évidence, l&#8217;augmentation inévitable des volumes de données de plus en plus importants et complexes ne va faire qu&#8217;accroître la nécessité de personnel capable de mener leur analyse. Mais le GenAI va indiscutablement changer leur métier. Et le GenAI va certainement remplacer les data scientists qui ne l&#8217;utilisent pas par les data scientists qui sauront s&#8217;en servir efficacement.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Een &#8220;on-premise&#8221; Trusted Execution Environment gebruiken</title>
		<link>https://www.smalsresearch.be/een-betrouwbare-runtime-omgeving-on-premise-gebruiken/</link>
		
		<dc:creator><![CDATA[Fabien A. P. Petitcolas]]></dc:creator>
		<pubDate>Tue, 21 Apr 2026 06:30:00 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[confidential computing]]></category>
		<category><![CDATA[confidential containers]]></category>
		<category><![CDATA[data center]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[TEE]]></category>
		<category><![CDATA[Trusted Execution Environment]]></category>
		<guid isPermaLink="false">https://www.smalsresearch.be/?p=26524</guid>

					<description><![CDATA[In deze blogpost gaan we in op het onderwerp door bepaalde aspecten van "CoCo" confidential containers in detail te beschrijven en onze installatie op onze eigen hardware toe te lichten.]]></description>
										<content:encoded><![CDATA[
<p>In een <a href="/je-data-beschermen-tegen-beheerders-on-premise-vertrouwelijke-it/">vorige blogpost</a> hebben we de voordelen besproken van confidential containers en hun architectuur in het CoCo-project. In deze blogpost gaan we dieper in op het onderwerp door bepaalde aspecten van CoCo in detail te beschrijven en onze installatie op onze eigen hardware toe te lichten.</p>



<h1 class="wp-block-heading">Containercertificering</h1>



<p>Het gebruik van Kubernetes-pods als abstractielaag voor vertrouwelijke container-workloads introduceert diverse uitdagingen. Door hun dynamische karakter – het maken, verwijderen, updaten van de containers – en de invloed van de Kubernetesomgeving (omgevingsvariabelen, toelatingscontrollers, enz.) valt het moeilijk te garanderen dat enkel de door de gebruiker bedoelde code wordt uitgevoerd. Zo kan het injecteren van kwaadaardige variabelen of het wijzigen van de specificatie van een pod voordat deze wordt gestart, de vertrouwelijkheid in gevaar brengen.</p>



<p>Het CoCo-project stelt een elegante oplossing voor, namelijk het gebruik van een engine voor beveiligingsbeleid, geïntegreerd in de containerruntime-omgeving binnen de trusted execution environment (TEE), die de door de gebruiker gedefinieerde regels toepast. Deze engine kan bijvoorbeeld alleen bepaalde images of commando’s toestaan en problematische verzoeken (zoals het uitvoeren van ongeoorloofde processen) afwijzen. <a href="#Figuur-1">Figuur 1</a> toont een voorbeeld van zo’n beleid.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>package agent_policy

# Seules certaines images de conteneurs peuvent être exécutées
default CreateContainerRequest&nbsp;:= false
CreateContainerRequest if {
    every storage in input.storages {
    some allowed_image in policy_data.allowed_images
    storage.source == allowed_image
  }
}

# Seules certaines commandes peuvent être exécutées
# via ‘kubectl exec’ dans les images de conteneurs
default ExecProcessRequest&nbsp;:= false
ExecProcessRequest if {
  input_command = concat(" ", input.process.Args)
      some allowed_command in policy_data.allowed_commands
      input_command == allowed_command
}

policy_data&nbsp;:= {
    "allowed_commands": &#91;
        "ls",
        "cat",
    &#93;,
    "allowed_images": &#91;
        "pause",
        "my-registry.be/,my-app@sha256:5ed86f469bbc40026a0235dd92e2b0b0c7ce54e3b254132e271a9b9e85d5f220
",
    &#93;,
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">package agent_policy</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4"># Seules certaines images de conteneurs peuvent être exécutées</span></span>
<span class="line"><span style="color: #D4D4D4">default CreateContainerRequest&nbsp;:= </span><span style="color: #569CD6">false</span></span>
<span class="line"><span style="color: #D4D4D4">CreateContainerRequest</span><span style="color: #C586C0"> if</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">every</span><span style="color: #D4D4D4"> storage</span><span style="color: #569CD6"> in</span><span style="color: #D4D4D4"> input.storages {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">some</span><span style="color: #D4D4D4"> allowed_image</span><span style="color: #569CD6"> in</span><span style="color: #D4D4D4"> policy_data.allowed_images</span></span>
<span class="line"><span style="color: #D4D4D4">    storage</span><span style="color: #D7BA7D">.source</span><span style="color: #D4D4D4"> == allowed_image</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4"># Seules certaines commandes peuvent être exécutées</span></span>
<span class="line"><span style="color: #D4D4D4"># via ‘kubectl exec’ dans les images de conteneurs</span></span>
<span class="line"><span style="color: #D4D4D4">default ExecProcessRequest&nbsp;:= </span><span style="color: #569CD6">false</span></span>
<span class="line"><span style="color: #D4D4D4">ExecProcessRequest</span><span style="color: #C586C0"> if</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">input_command</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">concat</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot; &quot;</span><span style="color: #D4D4D4">, input.process.Args)</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #DCDCAA">some</span><span style="color: #D4D4D4"> allowed_command</span><span style="color: #569CD6"> in</span><span style="color: #D4D4D4"> policy_data.allowed_commands</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">input_command</span><span style="color: #D4D4D4"> == allowed_command</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #9CDCFE">policy_data</span><span style="color: #D4D4D4">&nbsp;:= {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;allowed_commands&quot;</span><span style="color: #D4D4D4">: &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;ls&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;cat&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    &#93;,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;allowed_images&quot;</span><span style="color: #D4D4D4">: &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;pause&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;my-registry.be/,my-app@sha256:5ed86f469bbc40026a0235dd92e2b0b0c7ce54e3b254132e271a9b9e85d5f220</span></span>
<span class="line"><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    &#93;,</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="has-text-align-center wp-element-caption" id="Figuur-1">Figuur 1 – Voorbeeld van een beperkend beveiligingsbeleid voor images die kunnen worden uitgevoerd en de commando’s die in de image kunnen worden aangeroepen. Dit beleid wordt toegepast door een agent die in de vertrouwelijke VM zit.</p>



<p>Vier componenten van de vertrouwelijke virtuele guestmachine worden altijd gecontroleerd om te bepalen of ze nog goed werken: de firmware (bijvoorbeeld OVMF), de kernel van het besturingssysteem, de kernel commandoregel en het rootbestandssysteem (<a href="#Figuur-2">Figuur 2</a>). Een vertrouwelijke externe entiteit, vaak Trustee genoemd, zorgt ervoor dat de vertrouwensketen versterkt wordt.</p>



<figure class="wp-block-image aligncenter size-full is-resized" id="Figuur-2"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture2-Measurement.svg"><img decoding="async" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture2-Measurement.svg" alt="" class="wp-image-26527" style="width:500px"/></a><figcaption class="wp-element-caption">Figuur 2 &#8211; Samenstelling van de “meting” (measurement) die door het <a href="https://www.smalsresearch.be/tools-voor-confidential-computing/">SEV-systeem</a> van de AMD-microprocessor wordt berekend tijdens de certificering. De meting is de cryptografische hashwaarde van een versleuteld geheugengebied waarin zich de firmware bevindt (bijv. OVMF). In deze firmware zijn de cryptografische hashwaarden geïnjecteerd van de OS-kernel van de geattesteerde virtuele machine, de command-line waarmee deze kernel is opgestart en, tot slot, het root-bestandssysteem. </figcaption></figure>



<p>Vertrouwelijke containers hebben echter meestal initialisatiedata nodig die niet direct in de image van de virtuele machine of de toepassingscontainer kunnen worden opgenomen, zoals certificaten, adressen van certificeringsdiensten of toe te passen beveiligingsbeleidsregels. Deze data zijn weliswaar niet geheim, maar moeten wel worden beschermd tegen wijzigingen.</p>



<p>Deze initialisatiedata, ook wel <code>init-data</code> genoemd, kunnen worden opgegeven in de vorm van een woordenboek (bijv. JSON-bestanden, TOML, YAML), gecodeerd in base64 en doorgegeven aan de Kubernetes-pod via een Kubernetes annotation (<a href="#Figuur-3">Figuur 3</a>). Om de integriteit ervan te garanderen, wordt hun cryptografische hashwaarde door de certificeringsagent (die in de vertrouwelijke virtuele machine draait) als data voor de berekening van de certificering verstrekt (dit kan worden gedaan met behulp van het veld “<em>HostData</em>” van SEV-SNP). Het is dan mogelijk om de initialisatiedata die naar de hostmachine zijn gestuurd voor het starten van de container te vergelijken met de hashwaarde die op het moment van de certificering is ontvangen, zodat elke wijziging tijdens de certificering op afstand kan worden gedetecteerd.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>version = "0.1.0"
algorithm = "sha256"

&#91;data&#93;

# Configuration de l’agent d’attestation
"aa.toml" = '''
&#91;token_configs&#93;
&#91;token_configs.kbs&#93;
url = "${KBS_ADDRESS}"
'''

# Configuration du gestionnaire de données secrètes
"cdh.toml" = '''
&#91;kbc&#93;
name = "cc_kbc"
url = "${KBS_ADDRESS}"

&#91;image&#93;
authenticated_registry_credentials_uri = "kbs:///${REGISTRY_AUTH_KBS_PATH}"
image_security_policy_uri = "${SECURITY_POLICY_KBS_URI}"
'''

# Politique de sécurité restreignant l’environnement du conteneur
"policy.rego"= '''
&#91;Voir Figure 1 ci-dessus&#93;
'''</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #9CDCFE">version</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;0.1.0&quot;</span></span>
<span class="line"><span style="color: #9CDCFE">algorithm</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;sha256&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">&#91;data&#93;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># Configuration de l’agent d’attestation</span></span>
<span class="line"><span style="color: #9CDCFE">&quot;</span><span style="color: #D4D4D4">aa.toml</span><span style="color: #9CDCFE">&quot;</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&#39;&#39;&#39;</span></span>
<span class="line"><span style="color: #CE9178">&#91;token_configs&#93;</span></span>
<span class="line"><span style="color: #CE9178">&#91;token_configs.kbs&#93;</span></span>
<span class="line"><span style="color: #CE9178">url = &quot;${KBS_ADDRESS}&quot;</span></span>
<span class="line"><span style="color: #CE9178">&#39;&#39;&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># Configuration du gestionnaire de données secrètes</span></span>
<span class="line"><span style="color: #9CDCFE">&quot;</span><span style="color: #D4D4D4">cdh.toml</span><span style="color: #9CDCFE">&quot;</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&#39;&#39;&#39;</span></span>
<span class="line"><span style="color: #CE9178">&#91;kbc&#93;</span></span>
<span class="line"><span style="color: #CE9178">name = &quot;cc_kbc&quot;</span></span>
<span class="line"><span style="color: #CE9178">url = &quot;${KBS_ADDRESS}&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #CE9178">&#91;image&#93;</span></span>
<span class="line"><span style="color: #CE9178">authenticated_registry_credentials_uri = &quot;kbs:///${REGISTRY_AUTH_KBS_PATH}&quot;</span></span>
<span class="line"><span style="color: #CE9178">image_security_policy_uri = &quot;${SECURITY_POLICY_KBS_URI}&quot;</span></span>
<span class="line"><span style="color: #CE9178">&#39;&#39;&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># Politique de sécurité restreignant l’environnement du conteneur</span></span>
<span class="line"><span style="color: #9CDCFE">&quot;</span><span style="color: #D4D4D4">policy.rego</span><span style="color: #9CDCFE">&quot;</span><span style="color: #D4D4D4">= </span><span style="color: #CE9178">&#39;&#39;&#39;</span></span>
<span class="line"><span style="color: #CE9178">&#91;Voir Figure 1 ci-dessus&#93;</span></span>
<span class="line"><span style="color: #CE9178">&#39;&#39;&#39;</span></span></code></pre></div>



<p class="has-text-align-center wp-element-caption" id="Figuur-3">Figuur 3 &#8211; Voorbeeld van initialisatiedata die (in gecodeerde vorm) via een Kubernetes-annotatie aan de CoCo-guestagent in de vertrouwelijke virtuele machine worden geleverd.</p>



<h1 class="wp-block-heading">Sleutelbeheer</h1>



<p>Een externe sleutelbemiddelingsdienst (key broker service), die kan worden gekoppeld aan een transactionele &#8216;black box&#8217;, stelt de container in staat om dynamisch de resources op te halen die nodig zijn voor de werking ervan. Indien de client nog niet in het bezit is van een eerder verkregen authenticatietoken van de sleutelbemiddelingsdienst, moet hij zich eerst authenticeren, waarna de sleutelbemiddelingsdienst hem <a href="https://github.com/confidential-containers/trustee/blob/main/kbs/docs/kbs_attestation_protocol.md">een challenge stuurt</a> die hij moet beantwoorden (<a href="#Figuur-4">Figuur 4</a>).</p>



<p>De client genereert een paar cryptografische sleutels en vraagt de processor om een certificaat te verstrekken met daarin de hashwaarde van zijn openbare sleutel en een unieke willekeurige waarde die door de dienst in zijn challenge is verzonden. Het certificaat dat de openbare sleutel van de client, de unieke willekeurige waarde die door de service is gestuurd en de meting van de vertrouwelijke VM die de client bevat aan elkaar koppelt, wordt door de processor ondertekend. De service gebruikt een certificeringsagent die het certificaat controleert door de handtekening te verifiëren en de meting te vergelijken met een referentiewaarde.</p>



<figure class="wp-block-image aligncenter size-full is-resized"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture4-Authantication-protocol.svg"><img decoding="async" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture4-Authantication-protocol.svg" alt="" class="wp-image-26528" style="width:600px"/></a><figcaption class="wp-element-caption"><a>Figuur </a>4 &#8211; Protocol voor authenticatie van de vertrouwelijke virtuele machine bij de externe “Trustee”-service, bestaande uit een sleutelbemiddelingsservice en een certificeringsservice: om een opgeslagen waarde (geheim, sleutel, enz.) van de bemiddelingsservice te kunnen verkrijgen, moet de client eerst zijn authenticiteit bewijzen via de certificering. Dit protocol volgt het <a href="https://www.ietf.org/rfc/rfc9334.html">RATS-model (RFC9334)</a>.</figcaption></figure>



<h1 class="wp-block-heading">Installatie en testen</h1>



<p>Om de CoCo-omgeving te testen, hebben we gekozen voor een EPYC <a href="https://www.amd.com/en/products/processors/server/epyc/9005-series/amd-epyc-9335.html">9335-microprocessor</a> van AMD. Deze maakt gebruik van SEV-SNP-technologie voor versleuteling en bescherming van de integriteit van het RAM-geheugen. We hebben een machine geassembleerd met een moederbord dat deze microprocessor ondersteunt (Supermicro MBD-H13SSL-NT-O) en 128 GB RAM-geheugen. Vervolgens moesten we het BIOS configureren om ervoor te zorgen dat de gewenste beveiligingsfuncties van de microprocessor goed waren geactiveerd. We hebben ook gekozen voor de Ubuntu 24.04.3 LTS-distributie van het Linux-besturingssysteem. Voordat we de beveiligingsfuncties van de processor konden testen, moesten we ten slotte de kernel van het besturingssysteem opnieuw compileren. Dit is eigenlijk vrij simpel dankzij de <a href="https://github.com/AMDESE/AMDSEV">scripts die AMD heeft meegegeven</a>.</p>



<p>Eenmaal het systeem is ingesteld, kun je het Docker-platform installeren (om containerimages te maken), de containeruitvoeringsinterface <em>containerd </em>(inbegrepen in de Docker-distributie) en het Kubernetes-beheersysteem. Het instellen van deze tools is best lastig en afhankelijk van de versie. Er zijn <a href="https://gitlab.smalsrech.be/fape/coco-with-snp">verschillende scripts</a> beschikbaar om deze installatie te vergemakkelijken.</p>



<p>Nadat het systeem was geïnstalleerd, konden we een bestaande toepassing in vertrouwelijke containers zetten: je hoeft alleen maar de naam van de runtimeklasse die Kubernetes gebruikt (<code>runtimeClassName</code>) in het YAML-configuratiebestand van Kubernetes te veranderen in een van de CoCo-klassen (bijvoorbeeld <code>kata-qemu-snp</code>). Natuurlijk is deze simpele wijziging niet genoeg om te profiteren van de beveiligingsfuncties van CoCo. Je moet de productiecyclus aanpassen om de volgende stappen toe te voegen:</p>



<ul class="wp-block-list">
<li>Versleuteling van de containerimage</li>



<li>Ondertekening van de containerimage</li>



<li>Beschikbaar stellen van versleutelings- en ondertekeningssleutels</li>
</ul>



<p>Zodra de containerimage op de gebruikelijke manier is gemaakt, bijvoorbeeld met docker build, kan deze worden versleuteld met de tool <a href="https://github.com/containers/skopeo">skopeo</a>, die verschillende algoritmen ondersteunt: <a href="https://www.ietf.org/rfc/rfc7516.html">JWE (RFC7516)</a>, <a href="https://www.ietf.org/rfc/rfc4880.html">PGP (RFC4880)</a> en <a href="https://www.ietf.org/rfc/rfc2315.html">PKCS7 (RFC2315)</a>. Deze versleutelde image kan vervolgens worden ondertekend met de tool <a href="https://github.com/sigstore/cosign">cosign</a> en ten slotte worden geüpload naar een imageregister.</p>



<p>Bij het opstarten van de container moeten de CoCo-componenten in de vertrouwelijke virtuele machine de handtekening kunnen verifiëren en de image kunnen ontsleutelen. Hiervoor moeten de benodigde sleutels beschikbaar worden gesteld. Hier komt het sleutelbemiddelingssysteem om de hoek kijken. Zoals we eerder hebben gezien, voert dit systeem een certificeringsprotocol uit voordat het de sleutels verstrekt.</p>



<p>De implementatie van confidential ccontainers is transparant voor de gebruiker van Kubernetes. Zodra het gebruikelijke commando <code>kubectl apply</code> wordt aangeroepen, wordt een lichte Kata-virtuele machine aangemaakt. Deze moet bij de sleutelbemiddelaar de toegangssleutel tot het imageregister (als dit niet openbaar is), het toe te passen beveiligingsbeleid, de sleutel voor handtekeningverificatie en de sleutel voor het ontsleutelen van de image ophalen. Deze informatie wordt pas verstrekt nadat de virtuele machine is geverifieerd (zie hierboven). De agents in de virtuele machine kunnen dan het beveiligingsbeleid toepassen, de image downloaden, de handtekening controleren en deze decoderen voordat de toepassingscontainer in de virtuele machine wordt gestart.</p>



<p>Wat betreft de communicatie van de gecontaineriseerde toepassing met externe diensten, moeten wederzijds erkende versleutelingssleutels worden ingesteld. Een eerste mogelijkheid is dat de vertrouwde container bij het opstarten een cryptografisch sleutelpaar aanmaakt en de cryptografische hashwaarde van deze openbare sleutel bij de certificering verstrekt. Dit wordt gebruikt binnen het authenticatieprotocol dat in Figuur 4 wordt beschreven. Een andere optie is om de openbare sleutel van een certificeringsinstantie in de versleutelde en vervolgens ondertekende image te verstrekken. De container kan dan de certificaten checken die deze autoriteit heeft ondertekend en de encryptiesleutels aanvaarden. Een derde optie bestaat erin om te steunen op de sleutelbemiddelingsdienst: hiermee kan de container op een veilige manier geheimen ophalen. Afhankelijk van de gekozen optie moet de code van de toepassing al dan niet worden aangepast.</p>



<h1 class="wp-block-heading">Bescherming tegen een beheerder</h1>



<p>Wat kan een beheerder van de hostmachine doen?&nbsp; In principe niet veel, behalve de container opstarten.</p>



<p>Het certificeringsmechanisme zorgt er namelijk voor dat hij niets kan vervangen of simuleren wat betreft de onderdelen van de virtuele machine die wordt gebruikt om de containers te starten. Door de versleuteling van het geheugen dat aan de virtuele machine is toegewezen, heeft hij geen toegang tot de data die in de virtuele machine en de container worden verwerkt. Door de versleuteling en ondertekening van de containerimage kan hij geen andere container vervangen of de aard van de container achterhalen. In de veronderstelling dat de toepassing geconfigureerd is om versleuteld te communiceren met externe diensten waarmee ze moet interageren, kan de beheerder ook geen toegang krijgen tot gevoelige data door het netwerkverkeer te observeren, tenzij hij ook bevoorrechte toegang heeft tot het systeem voor het aanmaken van sleutels. Ten slotte kan hij de container ook niet ondervragen via het commando <code>kubectl exec</code>, omdat het kan worden beperkt door een beveiligingsbeleid (zie <a href="#Figure-1">Figuur 1</a>).</p>



<p>De beheerder kan daarentegen de toepassingslogboeken lezen die door Kubernetes op de host zijn opgeslagen. Daarom is het belangrijk dat de workload provider ervoor zorgt dat zijn code geen gevoelige informatie onthult in de gelogde berichten van de toepassing.</p>



<p>Tot slot, zoals we in de vorige blogpost al stelden, zijn vertrouwde uitvoeringsomgevingen niet perfect en houdt hun beveiligingsmodel meestal geen rekening met fysieke aanvallen. In een omgeving zoals de G-Cloud biedt de toevoeging ervan tal van mogelijkheden. In een omgeving waar echter noch SMALS, noch haar klanten, noch zelfs de Belgische Staat enige technische of juridische controle hebben over de infrastructuur, zijn er aanzienlijke risico’s die serieus moeten worden geëvalueerd.</p>



<h1 class="wp-block-heading">Conclusie</h1>



<p>In deze blogpost en de <a href="https://www.smalsresearch.be/je-data-beschermen-tegen-beheerders-on-premise-vertrouwelijke-it/">vorige </a>hebben we de echte voordelen belicht op het gebied van beveiliging die microprocessors kunnen bieden om &#8220;vertrouwde uitvoeringsomgevingen&#8221; binnen een IT-infrastructuur te creëren. Vooral het “on-premise” gebruik ervan  maakt het mogelijk om gecontaineriseerde toepassingen beter te beschermen tegen kwaadwillige beheerders of indringers en zo onze leden nog meer garanties te bieden.</p>



<p>Omdat ze eenvoudiger in gebruik zijn dan geavanceerde cryptografische methoden, kunnen dergelijke systemen ons ook helpen om meer generieke problemen op te lossen dan met cryptografie alleen, of problemen die we tot nu toe simpelweg niet konden oplossen.</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Utiliser un environnement d’exécution de confiance « on-premise »</title>
		<link>https://www.smalsresearch.be/utiliser-un-environnement-dexecution-de-confiance-on-premise/</link>
		
		<dc:creator><![CDATA[Fabien A. P. Petitcolas]]></dc:creator>
		<pubDate>Tue, 21 Apr 2026 06:30:00 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[confidential computing]]></category>
		<category><![CDATA[confidential containers]]></category>
		<category><![CDATA[data center]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[TEE]]></category>
		<category><![CDATA[Trusted Execution Environment]]></category>
		<guid isPermaLink="false">https://www.smalsresearch.be/?p=26503</guid>

					<description><![CDATA[Dans cet article, nous détaillons le fonctionnement de certains aspects des conteneurs confidentiels "CoCo" et décrivons notre installation sur notre propre matériel.]]></description>
										<content:encoded><![CDATA[
<p>Dans un <a href="/proteger-ses-donnees-des-administrateurs-linformatique-confidentielle-on-premise/">précédent article</a>, nous avons exposé les avantages des conteneurs confidentiels et leur architecture dans le projet «&nbsp;CoCo.&nbsp;» Dans cet article, nous approfondissons notre propos en détaillant le fonctionnement de certains aspects de CoCo et en décrivant notre installation sur notre propre matériel.</p>



<h1 class="wp-block-heading">Attestation de conteneurs</h1>



<p>Les capsules Kubernetes, utilisées comme abstraction pour les charges de travail conteneurisées confidentielles, introduisent plusieurs défis. Leur nature dynamique — création, suppression, mise à jour de conteneurs — et l’influence de l’environnement Kubernetes (variables d’environnement, contrôleurs d’admission, etc.) rendent difficile la garantie que seul le code prévu par l’utilisateur sera exécuté. Par exemple, l’injection de variables malveillantes ou la modification de la spécification d’une capsule avant son lancement peuvent compromettre la confidentialité.</p>



<p>Le projet CoCo propose une solution élégante qui consiste à utiliser un moteur de politiques de sécurité, intégré à l’environnement d’exécution du conteneur dans l’environnement d’exécution de confiance (EEC), qui applique des règles définies par l’utilisateur. Ce moteur peut, par exemple, autoriser uniquement certaines images ou commandes, et rejeter les appels problématiques (comme l’exécution de processus non autorisés). La <a href="#Figure-1">Figure 1</a> montre un exemple d’une telle politique.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>package agent_policy

# Seules certaines images de conteneurs peuvent être exécutées
default CreateContainerRequest&nbsp;:= false
CreateContainerRequest if {
    every storage in input.storages {
    some allowed_image in policy_data.allowed_images
    storage.source == allowed_image
  }
}

# Seules certaines commandes peuvent être exécutées
# via ‘kubectl exec’ dans les images de conteneurs
default ExecProcessRequest&nbsp;:= false
ExecProcessRequest if {
  input_command = concat(" ", input.process.Args)
      some allowed_command in policy_data.allowed_commands
      input_command == allowed_command
}

policy_data&nbsp;:= {
    "allowed_commands": &#91;
        "ls",
        "cat",
    &#93;,
    "allowed_images": &#91;
        "pause",
        "my-registry.be/,my-app@sha256:5ed86f469bbc40026a0235dd92e2b0b0c7ce54e3b254132e271a9b9e85d5f220
",
    &#93;,
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">package agent_policy</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4"># Seules certaines images de conteneurs peuvent être exécutées</span></span>
<span class="line"><span style="color: #D4D4D4">default CreateContainerRequest&nbsp;:= </span><span style="color: #569CD6">false</span></span>
<span class="line"><span style="color: #D4D4D4">CreateContainerRequest</span><span style="color: #C586C0"> if</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">every</span><span style="color: #D4D4D4"> storage</span><span style="color: #569CD6"> in</span><span style="color: #D4D4D4"> input.storages {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">some</span><span style="color: #D4D4D4"> allowed_image</span><span style="color: #569CD6"> in</span><span style="color: #D4D4D4"> policy_data.allowed_images</span></span>
<span class="line"><span style="color: #D4D4D4">    storage</span><span style="color: #D7BA7D">.source</span><span style="color: #D4D4D4"> == allowed_image</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4"># Seules certaines commandes peuvent être exécutées</span></span>
<span class="line"><span style="color: #D4D4D4"># via ‘kubectl exec’ dans les images de conteneurs</span></span>
<span class="line"><span style="color: #D4D4D4">default ExecProcessRequest&nbsp;:= </span><span style="color: #569CD6">false</span></span>
<span class="line"><span style="color: #D4D4D4">ExecProcessRequest</span><span style="color: #C586C0"> if</span><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">input_command</span><span style="color: #D4D4D4"> = </span><span style="color: #DCDCAA">concat</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot; &quot;</span><span style="color: #D4D4D4">, input.process.Args)</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #DCDCAA">some</span><span style="color: #D4D4D4"> allowed_command</span><span style="color: #569CD6"> in</span><span style="color: #D4D4D4"> policy_data.allowed_commands</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">input_command</span><span style="color: #D4D4D4"> == allowed_command</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #9CDCFE">policy_data</span><span style="color: #D4D4D4">&nbsp;:= {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;allowed_commands&quot;</span><span style="color: #D4D4D4">: &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;ls&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;cat&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    &#93;,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #CE9178">&quot;allowed_images&quot;</span><span style="color: #D4D4D4">: &#91;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;pause&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;my-registry.be/,my-app@sha256:5ed86f469bbc40026a0235dd92e2b0b0c7ce54e3b254132e271a9b9e85d5f220</span></span>
<span class="line"><span style="color: #CE9178">&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    &#93;,</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="has-text-align-center wp-element-caption" id="Figure-1">Figure 1 – Exemple de politique de sécurité (langage <a href="https://www.openpolicyagent.org/docs/policy-language">REGO</a>) restreignant les images pouvant être exécutées et les commandes pouvant être invoquées dans l’image. Cette politique est appliquée par un agent inclus dans la machine virtuelle confidentielle.</p>



<p>Quatre composants de la machine virtuelle confidentielle invitée sont systématiquement mesurés pour assurer leur intégrité&nbsp;: le micrologiciel (e.g., OVMF), le noyau du système d’exploitation, la ligne de commande du noyau et le système de fichiers racine (<a href="#Figure-2">Figure 2</a>). Une entité externe de confiance, généralement appelée Trustee, atteste de l’intégrité de l’invité, renforçant ainsi la chaîne de confiance.</p>



<figure class="wp-block-image aligncenter size-full is-resized" id="Figure-2"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/04/Picture2-Composition-mesure.svg"><img decoding="async" src="https://www.smalsresearch.be/wp-content/uploads/2026/04/Picture2-Composition-mesure.svg" alt="" class="wp-image-26665" style="width:500px"/></a><figcaption class="wp-element-caption">Figure 2 – Composition de la «&nbsp;mesure&nbsp;» calculée par le <a href="/outils-pour-linformatique-confidentielle/#AMD_SEV-SNP">système SEV</a> du microprocesseur AMD lors de l’attestation. La mesure est la valeur de hachage cryptographique d’une zone de la mémoire chiffrée où se trouve le micrologiciel (e.g., OVMF) dans lequel ont été injectées les valeurs de hachage cryptographique du noyau du système d’exploitation de la machine virtuelle attestée, de la ligne de commande utilisée pour lancer ce noyau et enfin du système de fichier racine.</figcaption></figure>



<p>Cependant, les conteneurs confidentiels nécessitent généralement des données d’initialisation qui ne peuvent pas être intégrées directement dans l’image de la machine virtuelle ou du conteneur applicatif, comme les certificats, les adresses des services d’attestation ou les politiques de sécurité à appliquer. Ces données, bien que non secrètes, doivent être protégées contre toute altération.</p>



<p>Ces données d’initialisation appelées <a href="https://github.com/confidential-containers/trustee/blob/main/kbs/docs/initdata.md"><code>init-data</code></a> peuvent être spécifiées sous forme de dictionnaire (e.g., fichiers JSON, TOML, YAML), encodé en base64 et passé à la capsule Kubernetes via une annotation Kubernetes (<a href="#Figure-3">Figure 3</a>). Afin de garantir leur intégrité, leur valeur de hachage cryptographique est fournie par l’agent d’attestation (fonctionnant dans la machine virtuelle confidentielle) en donnée d’entrée pour le calcul de l’attestation (cela peut se faire en utilisant le champ «&nbsp;<em>HostData&nbsp;</em>» de SEV-SNP). Il est alors possible de comparer les données d’initialisation envoyées à la machine hôte pour le lancement du conteneur avec la valeur de hachage reçue au moment de l’attestation, assurant ainsi que toute modification sera détectée lors de l’attestation à distance.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>version = "0.1.0"
algorithm = "sha256"

&#91;data&#93;

# Configuration de l’agent d’attestation
"aa.toml" = '''
&#91;token_configs&#93;
&#91;token_configs.kbs&#93;
url = "${KBS_ADDRESS}"
'''

# Configuration du gestionnaire de données secrètes
"cdh.toml" = '''
&#91;kbc&#93;
name = "cc_kbc"
url = "${KBS_ADDRESS}"

&#91;image&#93;
authenticated_registry_credentials_uri = "kbs:///${REGISTRY_AUTH_KBS_PATH}"
image_security_policy_uri = "${SECURITY_POLICY_KBS_URI}"
'''

# Politique de sécurité restreignant l’environnement du conteneur
"policy.rego"= '''
&#91;Voir Figure 1 ci-dessus&#93;
'''
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #9CDCFE">version</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;0.1.0&quot;</span></span>
<span class="line"><span style="color: #9CDCFE">algorithm</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;sha256&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">&#91;data&#93;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># Configuration de l’agent d’attestation</span></span>
<span class="line"><span style="color: #9CDCFE">&quot;</span><span style="color: #D4D4D4">aa.toml</span><span style="color: #9CDCFE">&quot;</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&#39;&#39;&#39;</span></span>
<span class="line"><span style="color: #CE9178">&#91;token_configs&#93;</span></span>
<span class="line"><span style="color: #CE9178">&#91;token_configs.kbs&#93;</span></span>
<span class="line"><span style="color: #CE9178">url = &quot;${KBS_ADDRESS}&quot;</span></span>
<span class="line"><span style="color: #CE9178">&#39;&#39;&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># Configuration du gestionnaire de données secrètes</span></span>
<span class="line"><span style="color: #9CDCFE">&quot;</span><span style="color: #D4D4D4">cdh.toml</span><span style="color: #9CDCFE">&quot;</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&#39;&#39;&#39;</span></span>
<span class="line"><span style="color: #CE9178">&#91;kbc&#93;</span></span>
<span class="line"><span style="color: #CE9178">name = &quot;cc_kbc&quot;</span></span>
<span class="line"><span style="color: #CE9178">url = &quot;${KBS_ADDRESS}&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #CE9178">&#91;image&#93;</span></span>
<span class="line"><span style="color: #CE9178">authenticated_registry_credentials_uri = &quot;kbs:///${REGISTRY_AUTH_KBS_PATH}&quot;</span></span>
<span class="line"><span style="color: #CE9178">image_security_policy_uri = &quot;${SECURITY_POLICY_KBS_URI}&quot;</span></span>
<span class="line"><span style="color: #CE9178">&#39;&#39;&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># Politique de sécurité restreignant l’environnement du conteneur</span></span>
<span class="line"><span style="color: #9CDCFE">&quot;</span><span style="color: #D4D4D4">policy.rego</span><span style="color: #9CDCFE">&quot;</span><span style="color: #D4D4D4">= </span><span style="color: #CE9178">&#39;&#39;&#39;</span></span>
<span class="line"><span style="color: #CE9178">&#91;Voir Figure 1 ci-dessus&#93;</span></span>
<span class="line"><span style="color: #CE9178">&#39;&#39;&#39;</span></span>
<span class="line"></span></code></pre></div>



<p class="has-text-align-center wp-element-caption" id="Figure-3">Figure 3 – Exemple de données d’initialisation fournies (sous forme encodée) via une annotation Kubernetes à l’agent invité CoCo dans la machine virtuelle confidentielle.</p>



<h1 class="wp-block-heading">Gestion de clés</h1>



<p>Un service extérieur de médiation de clés, qui peut être connecté à une boîte noire transactionnelle, permet au conteneur d’obtenir dynamiquement des ressources nécessaires à son fonctionnement. Si le client n’est pas déjà en possession d’un témoin de connexion précédemment obtenu du service de médiation de clés, il doit d’abord s’authentifier et le service de médiation de clés lui <a href="https://github.com/confidential-containers/trustee/blob/main/kbs/docs/kbs_attestation_protocol.md">répond avec un défi</a> auquel il doit répondre (<a href="#Figure-4">Figure 4</a>).</p>



<p>Le client génère une paire de clés cryptographiques et demande au processeur de lui fournir une attestation en incluant la valeur de hachage de sa clé publique et une valeur aléatoire unique envoyée par le service dans son défi. L’attestation qui lie clé publique du client, valeur aléatoire unique envoyée par le service et mesure de la VM confidentielle contenant le client est signée par le processeur. Le service fait appel à un agent d’attestation qui vérifie l’attestation en vérifiant la signature et en comparant la mesure à une valeur de référence.</p>



<figure class="wp-block-image aligncenter size-full is-resized" id="Figure-4"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/04/Picture4-Protocol-authentification.svg"><img decoding="async" src="https://www.smalsresearch.be/wp-content/uploads/2026/04/Picture4-Protocol-authentification.svg" alt="" class="wp-image-26664" style="width:600px"/></a><figcaption class="wp-element-caption">Figure 4 – Protocole d’authentification de la machine virtuelle confidentielle auprès du service extérieur «&nbsp;Trustee&nbsp;» composé d’un service de médiation de clés et d’un service d’attestation&nbsp;: afin de pouvoir obtenir une valeur stockée (secret, clé, etc.) par le service de médiation, le client doit d’abord prouver son authenticité via l’attestation. Ce protocole suit le modèle <a href="https://www.ietf.org/rfc/rfc9334.html">RATS (RFC9334)</a>.</figcaption></figure>



<h1 class="wp-block-heading">Installation et tests</h1>



<p>Afin de tester l’environnement CoCo, nous avons choisi d’utiliser un microprocesseur <a href="https://www.amd.com/fr/products/processors/server/epyc/9005-series/amd-epyc-9335.html">EPYC 9335</a> de la société AMD. Il met en œuvre la technologie SEV-SNP de chiffrement et de protection de l’intégrité de la mémoire vive. Nous avons assemblé une machine avec une carte mère prenant en charge ce microprocesseur (Supermicro MBD-H13SSL-NT-O) et 128 Go de mémoire vive. Il a ensuite fallu configurer le BIOS afin que les fonctionnalités souhaitées de sécurité du microprocesseur soient bien activées. Nous avons aussi opté pour la distribution Ubuntu 24.04.3 LTS du système d’exploitation Linux. Avant de pouvoir tester les fonctionnalités de sécurité du processeur, nous avons enfin dû recompiler le noyau du système d’exploitation. L’opération est en fait relativement simple grâce aux <a href="https://github.com/AMDESE/AMDSEV">scripts fournis par AMD</a>.</p>



<p>Une fois le système configuré, il est alors possible d’y installer la plateforme Docker (afin de pouvoir créer des images de conteneurs), l’interface d’exécution de conteneur <code>containerd </code>(incluse dans la distribution de Docker) et le système de gestion Kubernetes. La configuration de ces outils est assez délicate et sensible aux version. Plusieurs scripts permettant de faciliter cette installation sont <a href="https://gitlab.smalsrech.be/fape/coco-with-snp">fournis ici</a>.</p>



<p>Une fois le système installé, il nous a été possible de déployer une application existante dans des conteneurs confidentiels&nbsp;: il suffit en fait de changer le nom de classe d’exécution utilisé par Kubernetes (<code>runtimeClassName</code>) dans le fichier YAML de configuration de Kubernetes pour l’une des classes de CoCo (e.g., <code>kata-qemu-snp</code>). Bien sûr ce changement simple ne suffit pas à bénéficier des fonctionnalités de sécurité de CoCo. Il est nécessaire de modifier le cycle de production afin d’ajouter les étapes suivantes&nbsp;:</p>



<ul class="wp-block-list">
<li>Chiffrement de l’image du conteneur</li>



<li>Signature de l’image du conteneur</li>



<li>Mise à disposition des clés de chiffrement et de signature</li>
</ul>



<p>Une fois l’image du conteneur créée de la manière habituelle, par exemple avec docker build, celle-ci peut être chiffrée avec l’outil <a href="https://github.com/containers/skopeo">skopeo</a> qui prend en charge différents algorithmes&nbsp;: <a href="https://www.ietf.org/rfc/rfc7516.html">JWE (RFC7516)</a>, <a href="https://www.ietf.org/rfc/rfc4880.html">PGP (RFC4880)</a>, et <a href="https://www.ietf.org/rfc/rfc2315.html">PKCS7 (RFC2315)</a>. Cette image chiffrée peut ensuite être signée avec l’outil <a href="https://github.com/sigstore/cosign">cosign</a> et enfin chargée sur un registre d’images.</p>



<p>Au moment du lancement du conteneur, les composants CoCo inclus dans la machine virtuelle confidentielle devront pouvoir vérifier la signature et déchiffrer son image. Pour cela, il est nécessaire de mettre à disposition les clé requises. C’est là que le système de médiation de clés intervient. Comme nous l’avons vu précédemment, celui effectue un protocole d’attestation avant de fournir les clés.</p>



<p>Le déploiement des conteneurs confidentiels est transparent vis-à-vis de l’utilisateur de Kubernetes. Une fois l’invocation de la commande habituelle <code>kubectl apply</code>, une machine virtuelle légère Kata est créée. Celle-ci doit récupérer auprès du médiateur de clés, la clé d’accès au registre d’image (si celui-ci n’est pas public), la politique de sécurité à appliquer, la clé de vérification de signature et la clé de déchiffrement de l’image. Ces informations ne sont fournies qu’après l’attestation de la machine virtuelle (voir plus haut). Les agents inclus dans la machine virtuelle peuvent alors appliquer la politique de sécurité, télécharger l’image, vérifier sa signature et la déchiffrer avant de lancer le conteneur applicatif dans la machine virtuelle.</p>



<p>En ce qui concerne la communication de l’application conteneurisée avec des services extérieurs, il convient d’établir des clés de chiffrement mutuellement reconnues. Une première possibilité est que le conteneur confidentiel crée une paire de clé cryptographiques à son lancement et fournisse la valeur de hachage cryptographique de cette clé publique lors de l’attestation. C’est ce qui est utilisé dans le protocole d’authentification présenté dans la <a href="#Figure-4">Figure 4</a>. Une autre option est de fournir la clé publique d’une autorité de certification dans l’image chiffrée-puis-signée. Le conteneur pourra alors vérifier les certificats signés par cette autorité et accepter des clés de chiffrement. Une troisième option consiste à s’appuyer sur le service de médiation de clés&nbsp;: celui-ci permet au conteneur de récupérer des secrets de manière sécurisée. En fonction de l’option choisie, il conviendra de modifier plus ou moins le code de l’application.</p>



<h1 class="wp-block-heading">Protection vis-à-vis d’un administrateur</h1>



<p>Que peut faire un administrateur de la machine hôte&nbsp;? A priori, pas grand-chose, à part lancer le conteneur.</p>



<p>En effet, le mécanisme d’attestation l’empêche de substituer ou de simuler les composants de la machine virtuelle utilisée pour le lancement des conteneurs. Le chiffrement de la mémoire allouée à la machine virtuelle le bloque dans l’observation des données traitées dans la machine virtuelle et le conteneur. Le chiffrement et la signature de l’image du conteneur ne lui permettent ni de substituer un autre conteneur, ni de connaître la nature du conteneur. En supposant que l’application soit configurée pour communiquer de manière chiffrée avec les services extérieurs avec lesquelles elle doit interagir, l’administrateur ne peut pas non plus accéder aux données sensibles en observant le trafic réseau, sauf s’il a également un accès privilégié au système de création des clés. Enfin, il ne peut pas non plus interroger le conteneur via la commande <code>kubectl exec</code> car celle-ci peut être restreinte via une politique de sécurité (voir <a href="#Figure-1">Figure 1</a>).</p>



<p>En revanche, l’administrateur peut lire les journaux applicatifs enregistrés par Kubernetes sur l’hôte. Par conséquent, il est important que le fournisseur de la charge de travail prenne soin que son code ne divulgue pas des informations sensibles dans les messages journalisés de l’application.</p>



<p>Enfin, comme nous l’avons rappelé dans l’<a href="/proteger-ses-donnees-des-administrateurs-linformatique-confidentielle-on-premise/">article précédent</a>, les environnements d’exécution de confiance ne sont pas parfaits et leur modèle de sécurité ne tient généralement pas compte des attaques physiques. Dans un environnement comme le G-Cloud, leur ajout offre de nombreuses possibilités. En revanche, dans un environnement où ni SMALS, ni ses clients, ni même l’État belge n’ont le moindre contrôle technique ou juridique sur l’infrastructure, il existe des risques importants qu’il convient d’évaluer sérieusement.</p>



<h1 class="wp-block-heading">Conclusion</h1>



<p>À travers cet article et <a href="/proteger-ses-donnees-des-administrateurs-linformatique-confidentielle-on-premise/">le précédent</a>, nous avons mis en avant les avantages réels en termes de sécurité que pourraient apporter des microprocesseurs permettant de créer des environnements d’exécution de confiance au sein d’une infrastructure informatique. En particulier, leur utilisation « on-premise » permet de mieux protéger des applications conteneurisées d’administrateurs malveillants ou d’intrus et donc d’offrir des garanties encore plus fortes à nos Membres.</p>



<p>Plus simples d’utilisation que les méthodes cryptographiques avancées, de tels systèmes pourraient aussi nous permettre de résoudre des problèmes plus génériques que la cryptographie ou des problèmes que nous ne pouvions pas résoudre jusqu’à présent.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Legacy &#038; IA : Voyagez dans le Temps depuis votre Terminal</title>
		<link>https://www.smalsresearch.be/legacy-ai-voyagez-temps-terminal/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Tue, 14 Apr 2026 09:48:59 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[Artificial intelligence]]></category>
		<category><![CDATA[legacy]]></category>
		<category><![CDATA[LLM]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">https://www.smalsresearch.be/?p=28963</guid>

					<description><![CDATA[Depuis l'essor de l'engouement pour les grands modèles de langage, la plupart des développeurs ont sans doute déjà pu constater le gain de productivité que ces outils peuvent offrir, à condition de les utiliser correctement. Dans cet article de blog, nous explorons la possibilité d'aller plus loin : l'IA offre-t-elle une aide suffisante afin de maîtriser le legacy code ?]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image alignleft size-large is-resized"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/04/Gemini_Generated_Image_6jrj5n6jrj5n6jrj.png"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://www.smalsresearch.be/wp-content/uploads/2026/04/Gemini_Generated_Image_6jrj5n6jrj5n6jrj-1024x1024.png" alt="" class="wp-image-27693" style="width:274px;height:auto"/></a></figure>



<p class="justify-text no-top-margin"><em>Dit artikel is ook beschikbaar in het <a href="https://www.smalsresearch.be/legacy-ai-tijdreizen-in-je-terminal/" data-type="post" data-id="27622">Nederlands</a>.</em></p>



<p class="justify-text" style="padding-top:0;padding-right:0;padding-bottom:0;padding-left:0">Depuis l&#8217;essor de l&#8217;engouement pour les grands modèles de langage, la plupart des développeurs ont sans doute déjà pu constater le gain de productivité que ces outils peuvent offrir, à condition de les utiliser correctement. Dans cet article de blogue, nous explorons la possibilité d&#8217;aller plus loin&nbsp;: l&#8217;IA offre-t-elle une aide suffisante afin de maîtriser le <em>legacy code</em>&nbsp;?</p>



<span id="more-28963"></span>



<p class="justify-text">Le recours aux grands modèles de langage <a href="https://www.smalsresearch.be/zin-onzin-en-nut-van-llms-zijn-ze-de-hype-waard/">(Large Language Model &#8211; LLM)</a> en programmation est en effet bien connu à présent&nbsp;: cela va de la formulation de questions à un <em>chatbot</em> (&#8220;comment écrire un algorithme en Java qui&#8230;&#8221;), à un <a href="https://www.smalsresearch.be/llms-pour-code/"><em>code completion</em> de plus en plus intelligent et étendu</a> (saisie automatique de ce que vous souhaitez taper dans l&#8217;éditeur), jusqu&#8217;au <a href="https://www.smalsresearch.be/vibe-coding-avec-les-ides-agentique/"><em>vibe coding</em> complet </a>(dans l&#8217;IDE, ou même simplement dans un terminal)&nbsp;: des agents d&#8217;IA rédigent, à l&#8217;aide de <em>prompts</em>, des pans entiers de code sur votre machine &#8211; oui, même des applications fonctionnelles.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:30%">
<p class="justify-text">Cette méthode de travail a déjà été décrite <a href="https://www.smalsresearch.be/vibe-coding-avec-les-ides-agentique/">dans un article de blog précédent</a>, et les mises en garde et les points auxquels il faut prêter attention, restent d&#8217;actualité&nbsp;: surveiller en permanence, remettre les choses en question, vérifier, et fournir à l&#8217;IA la bonne quantité de contexte utile (un art en soi). Cependant, le traitement du <strong>code <em>legacy</em></strong> pose encore un certain nombre de problèmes supplémentaires&nbsp;:</p>



<ul class="wp-block-list">
<li class="justify-text">Il ne s&#8217;agit pas d&#8217;une nouvelle construction (ou <em>greenfield</em>)&nbsp;: les décisions du passé, souvent obscures, ont un impact considérable.</li>



<li class="justify-text">Dans de nombreux cas, il existe déjà une masse de code.</li>



<li class="justify-text">Souvent, la compilation, l’exécution et le test du code nécessitent une technologie spécifique, qui est elle-même obsolète et parfois difficile à installer ou à simuler.</li>



<li class="justify-text">En tant qu’humain, on n’est souvent plus au courant du comment et du pourquoi de la base de code existante, ce qui rend plus difficile l’évaluation critique des résultats de l’IA.</li>
</ul>
</div>



<div class="wp-block-column is-style-section-1 has-accent-5-background-color has-background is-layout-flow wp-container-core-column-is-layout-43dc041e wp-block-column-is-layout-flow is-style-section-1--7" style="border-width:2px;border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-left-radius:0px;border-bottom-right-radius:0px;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;flex-basis:70%">
<h3 class="wp-block-heading is-style-default" style="margin-top:var(--wp--preset--spacing--20);margin-right:var(--wp--preset--spacing--20);margin-bottom:var(--wp--preset--spacing--20);margin-left:var(--wp--preset--spacing--20)"><span style="text-decoration: underline;"><em>Vibe coding</em>&nbsp;: quelques conseils</span></h3>



<p class="justify-text has-small-font-size" style="padding-top:var(--wp--preset--spacing--20);padding-right:var(--wp--preset--spacing--20);padding-bottom:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--20)"><em>Nous avons déjà découvert ces astuces simples dans le cadre de notre travail sur le code </em>legacy<em> et l&#8217;IA, mais elles s&#8217;appliquent plus largement à tous les projets de </em>Vibe Coding<em>.</em></p>



<ul class="wp-block-list">
<li class="justify-text" style="padding-right:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--20);font-size:clamp(14px, 0.875rem + ((1vw - 3.2px) * 0.196), 16px);">Nettoyage en profondeur&nbsp;: avant de laisser une IA se pencher sur une base de code, vous devez vous assurer qu&#8217;elle ne contient aucune donnée privée, aucun mot de passe ni aucune autre information sensible&nbsp;!</li>



<li class="justify-text" style="padding-right:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--20);font-size:clamp(14px, 0.875rem + ((1vw - 3.2px) * 0.196), 16px);">Planification&nbsp;: demandez des options et reportez l&#8217;exécution. En effet, lorsqu&#8217;on maîtrise soi-même ce que l&#8217;on souhaite réaliser, on a certainement déjà une idée précise de l&#8217;objectif à atteindre. Il peut toutefois s&#8217;avérer utile de commencer une conversation avec l&#8217;IA en gardant l&#8217;esprit ouvert et de lui demander des idées et des options (par exemple en matière d&#8217;architecture ou de technologie utilisée) pour concrétiser sa vision générale (tout en précisant à l&#8217;IA, parfois trop zélée, qu&#8217;il ne s&#8217;agit encore que de planification). Demandez spécifiquement plusieurs suggestions&nbsp;! Cela peut aider à réfléchir ensemble et à enrichir vos propres idées avec davantage d’inspiration. Au fil de la conversation, explorez plus en profondeur les options qui vous plaisent le plus, puis n’ajoutez votre expertise personnelle que pour affiner les idées de l’IA, jusqu’à ce qu’un plan d’action concret et aussi optimal que possible ait vu le jour. Ce n’est qu’ensuite que nous passerons à une mise en œuvre effective..</li>



<li class="justify-text" style="padding-right:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--20);font-size:clamp(14px, 0.875rem + ((1vw - 3.2px) * 0.196), 16px);">Indirection et outils. En particulier lorsque vous travaillez via une CLI (Command Line Interface), ni vous ni l’IA n’avez immédiatement conscience de tous les outils existants qui pourraient être exploités pour atteindre vos objectifs. Laissez l’IA rechercher les outils susceptibles de vous aider, et aidez-la à les installer. Plus vous pouvez accomplir de tâches à l&#8217;aide d&#8217;outils, moins le contexte est encombré par un travail &#8220;manuel&#8221; inutile effectué par l&#8217;IA elle-même (sans parler des économies réalisées en termes de consommation de <em>tokens</em>). Il existe par exemple toutes sortes d&#8217;outils d&#8217;analyse statique de code permettant d&#8217;évaluer et de maintenir la qualité des lignes de code que vous écrivez. L&#8217;IA n&#8217;a souvent aucun mal à mettre en œuvre bon nombre des suggestions fournies après l&#8217;analyse.</li>



<li class="justify-text" style="padding-right:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--20);font-size:clamp(14px, 0.875rem + ((1vw - 3.2px) * 0.196), 16px);">Mode Expert&nbsp;: parfois, les outils standard ne suffisent pas pour aider suffisamment l&#8217;IA à accomplir ce que vous souhaitez qu&#8217;elle fasse. Dans ce cas, vous pouvez d&#8217;abord laisser l&#8217;IA écrire ses propres outils. De cette manière, il est possible de s&#8217;assurer que le résultat, ou l&#8217;<em>output</em> de l&#8217;outil, soit concis et synthétique pour les tâches suivantes, afin de ne pas surcharger le contexte. Les <em>context windows</em> des LLM s&#8217;agrandissent certes de plus en plus, mais il faut tout de même veiller à ce qu&#8217;elles ne contiennent que les éléments les plus utiles (attention au <a href="https://redis.io/blog/context-rot/"><em>context rot</em></a>).</li>
</ul>
</div>
</div>



<p>Nous avons donné une définition très large du code <em>legacy</em> dans un <a href="https://www.smalsresearch.be/code-herite-meilleures-pratiques-ia/">précédent article de blog</a>. Commençons donc par préciser ce que nous entendons par &#8220;<em>legacy</em>&#8221; et par mieux illustrer le &#8220;degré de difficulté&#8221; des projets legacy.</p>



<h2 class="wp-block-heading">&#8220;Ancien&#8221; code&nbsp;: une multitude de possibilités</h2>



<p class="justify-text">Il n’existe pas vraiment de définition officielle du code <em>legacy</em>&nbsp;; généralement, on parle de l’utilisation d’une technologie qui n’est plus prise en charge, difficile à maintenir, ou simplement de &#8220;code dont on hérite de quelqu’un d’autre&#8221;. Il s’agit évidemment toujours de code encore en service, et donc important. Ironiquement, les applications les plus critiques sont souvent celles qui existent depuis des années et auxquelles on &#8220;fait confiance&#8221; depuis longtemps, mais sans les entretenir correctement.</p>



<p class="justify-text">L&#8217;IA peut nous aider à entretenir n&#8217;importe quel code ; nous allons donc présenter un spectre allant du code <em>legacy</em> le plus ancien et le plus problématique au code de projets ne nécessitant qu&#8217;une petite mise à jour. À une extrémité du spectre, on trouve des programmes écrits dans des langages de programmation obsolètes, selon une architecture dépassée, utilisant des bases de données qui ne sont plus d’actualité et fonctionnant sur des serveurs équipés de systèmes d’exploitation qui ne sont plus pris en charge&nbsp;: avec ces géants, on doit souvent craindre une défaillance critique à la moindre modification erronée. À l’autre extrémité, on trouve des logiciels assez bien entretenus, mais qui utilisent une bibliothèque logicielle qui n’est plus la version la plus récente&nbsp;: il est généralement très facile de les remettre entièrement à jour. Enfin, quelque part entre les deux, on trouve des applications pour lesquelles la plupart des développeurs n’utiliseraient pas encore le terme <em>legacy</em>, mais qui nécessitent néanmoins des migrations complexes, avec par exemple un ou deux <em>frameworks</em> obsolètes à remplacer.</p>



<figure class="wp-block-image size-large is-resized"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/04/Gemini_Generated_Image_307h9q307h9q307h-scaled.png"><img loading="lazy" decoding="async" width="1024" height="506" src="https://www.smalsresearch.be/wp-content/uploads/2026/04/Gemini_Generated_Image_307h9q307h9q307h-1024x506.png" alt="" class="wp-image-27634" style="width:1301px;height:auto"/></a></figure>



<p class="justify-text">Que pouvons-nous en faire&nbsp;? Les LLM offrent-ils d&#8217;autres possibilités en fonction de la position du projet sur ce spectre&nbsp;? Jusqu&#8217;à présent, nos recherches se sont concentrées sur la partie gauche de ce spectre&nbsp;; la suite de cet article portera donc davantage sur les possibilités d&#8217;aborder le &#8220;véritable&#8221; legacy. Plus tard dans l&#8217;année, nous approfondirons également ce que nous pouvons faire en matière de migrations et d&#8217;updates.</p>



<h1 class="wp-block-heading">Utilisation des LLM sur des bases de code <em>legacy</em></h1>



<p class="justify-text">Il est clair qu&#8217;un simple prompt &#8220;réécris ce programme selon les normes modernes&#8221; ne fonctionnera pas (même si certains fournisseurs affirment que cela sera bientôt possible). Nous devrons poser des questions un peu plus concrètes et décomposer le travail en plusieurs étapes. Il y a en fait deux choses que nous pouvons faire avec notre code <em>legacy&nbsp;</em>: le réécrire et le documenter.</p>



<h2 class="wp-block-heading">Réécriture du code <em>legacy</em></h2>



<p class="justify-text">Lorsque nous commençons à réécrire du code, nous devons souvent tenir compte du fait que la reconstruction complète d’un très grand projet est une tâche trop difficile. Il est possible d’obtenir des &#8220;quick wins&#8221; en réécrivant stratégiquement certaines parties d’un projet, qui seront ensuite réutilisées dans un contexte plus large, où une équipe humaine et l’IA reconstruiront l’application dans les règles de l’art. Nos expériences nous ont montré qu’il était trop ambitieux d’attendre de l’IA qu’elle utilise une architecture entièrement nouvelle tout en traduisant l’ancien code vers le nouveau. En revanche, il est possible de &#8220;vibe coder&#8221; une grande partie de la charpente typique d’un nouveau projet, puis d’y injecter de manière ciblée un certain nombre de morceaux de code qui sont des traductions de parties d’un projet <em>legacy</em>. En tant qu’êtres humains, notre tâche consiste à indiquer clairement quelle architecture nous attendons et quelles sont les règles de qualité du code nouveau.</p>



<p class="justify-text">L&#8217;un des principaux défis liés à la réécriture de code à l&#8217;aide de l&#8217;IA consiste à tester l&#8217;exactitude de la traduction&nbsp;: le code fait-il toujours ce qu&#8217;il faisait auparavant (indépendamment du fait que cela soit souhaitable, car même le <em>business case</em> peut parfois être trop obsolète dans le cas d&#8217;un projet <em>legacy</em>)&nbsp;? Pour les projets relativement récents, il existe déjà de nombreux tests que nous pouvons effectuer pour vérifier l&#8217;exactitude, mais avec les anciens systèmes <em>legacy</em>, nous sommes souvent confrontés au problème que l&#8217;application est simplement testée en production, ou du moins avec des données de production&nbsp;: il n&#8217;y a pas de tests spécifiques ni même de données de test pouvant être utilisées en toute sécurité. Dans ce cas, il s&#8217;agit de créer un environnement dans lequel nous pouvons tester le nouveau code en toute sécurité, ce qui est généralement un travail ad hoc et demande une certaine créativité. Nous ne pouvons pas envoyer de données de production vers le <em>cloud</em>, nous devons donc nous assurer que le LLM ne puisse pas les lire. Ce serait plus simple si nous pouvions utiliser des LLM fonctionnant en local, mais pour l&#8217;instant, ceux-ci ne sont pas encore assez puissants (quand ils sont disponibles) pour effectuer des tâches aussi complexes avec du code <em>legacy</em>.</p>



<p class="justify-text">L&#8217;interface utilisateur constitue un autre défi&nbsp;: dans les projets plus anciens, celle-ci est souvent obsolète et il faut construire une nouvelle GUI à partir de zéro. Cela pose toutefois le problème de ne plus disposer d&#8217;une base de référence dans l&#8217;ancien projet&nbsp;: la nouvelle interface devra généralement être testée manuellement par des personnes. J&#8217;espère toutefois que nous verrons des progrès dans ce domaine dans un avenir proche, en ce qui concerne les possibilités de l&#8217;IA. En effet, nous voyons déjà apparaître des systèmes capables de contrôler l&#8217;intégralité de votre ordinateur (comme OpenClawd), et l&#8217;intégration avec des frameworks plus traditionnels pour le test d&#8217;une interface graphique fait également partie des possibilités.</p>



<p class="justify-text">Enfin, les petits projets <em>legacy</em> constituent également un domaine où nous pouvons obtenir des résultats rapides. Si nous utilisons un programme <em>legacy </em>petit à moyen, doté de fonctionnalités limitées et d’une GUI simple, ou présentant un <em>input </em>et un <em>output </em>clairs en cas de traitement par lots, et qu’il n’existe aucun <em>business case</em> justifiant son intégration dans une autre méthode de travail, nous pouvons alors tenter une approche directe pour construire une version moderne dans un nouveau langage de programmation à l’aide de l’IA. Dans ce cas, il faudra tout de même bien tester et adopter une approche structurée avec un accompagnement des développeurs humains, mais il est possible d&#8217;essayer cette méthode pour des applications non critiques. Une application à usage interne, par exemple, constitue généralement un bon premier candidat.</p>



<h2 class="wp-block-heading">Documentation du code <em>legacy</em></h2>



<p class="justify-text">Parfois, la réécriture du code <em>legacy </em>avec l&#8217;IA est un peu trop ambitieuse, ou nous avons besoin de plus d&#8217;informations avant de nous y risquer. Il peut être intéressant de se tourner d’abord vers la documentation&nbsp;: l’IA peut également nous aider à faire en sorte que l’exploration d’une base de code <em>legacy </em>ressemble un peu moins à de l’archéologie de haut niveau.</p>



<p class="justify-text">Expliquer un morceau de code de petite à moyenne taille et en extraire la logique business, ou analyser un morceau plus important et en expliquer la structure et l’architecture, tout cela est tout à fait possible avec les grands modèles de langage actuels. Il est toutefois possible d’aller plus loin&nbsp;: il est possible de créer des outils d’IA pour l&#8217;aider à explorer la base de code et, par exemple, à générer des diagrammes illustrant les dépendances entre les segments de code. Ou bien on peut lui faire écrire des scripts afin de structurer soigneusement ses conclusions après chaque analyse dans un fichier texte pour elle-même et un PDF destiné à l’utilisateur humain.</p>



<p class="justify-text">Il est également possible d&#8217;adopter une approche hiérarchique&nbsp;: commencer par explorer la base de code, puis approfondir progressivement l&#8217;analyse des différents modules afin d&#8217;obtenir de plus en plus de détails et de compléter l&#8217;analyse. Il s&#8217;agit là de l&#8217;approche descendante, que nous pouvons toutefois compléter par une version ascendante&nbsp;: une fois que nous sommes allés en profondeur, nous pouvons à nouveau demander un résumé afin de construire une présentation mieux documentée de la situation dans son ensemble.</p>



<p class="justify-text">Il est toutefois important ici de savoir à l&#8217;avance ce que nous souhaitons exactement atteindre. Une analyse générale d’une base de code par l’IA peut s’avérer intéressante lorsque les utilisateurs humains ne connaissent pas du tout le système et souhaitent disposer de points de repère pour se familiariser avec celui-ci.</p>



<p class="justify-text">Cependant, lorsque l&#8217;objectif est de pouvoir assurer la maintenance de la base de code, il est préférable de mettre en place un système proposant un <em>chatbot</em> qui connaît le contexte spécifique et les particularités du projet <em>legacy</em>, et qui peut répondre à des questions très ciblées à ce sujet. Cela est possible, par exemple, dans CoPilot Studio. Si cela ne fonctionne pas correctement, il est possible d&#8217;envisager de construire manuellement une base de connaissances en utilisant l&#8217;IA qui pourra ensuite être utilisée par l&#8217;IA pour répondre aux questions.</p>



<p class="justify-text">Une autre option consiste à extraire des informations spécifiques de la base de code, telles que la logique business par module individuel, ou du pseudocode pouvant aider les développeurs humains à réimplémenter cette logique dans un autre projet. (Et bien sûr, une IA peut également être mise à contribution lors de cette deuxième étape).</p>



<p class="justify-text">Avec une touche de créativité, nous pouvons concevoir une meilleure approche pour la plupart des analyses ad hoc que celle consistant à &#8220;se contenter d’analyser à tout va&#8221;. Et la documentation d’un système <em>legacy </em>peut tout simplement constituer une première étape vers sa réécriture.</p>



<h1 class="wp-block-heading" style="margin-top:var(--wp--preset--spacing--20);margin-bottom:var(--wp--preset--spacing--20)">Conclusion&nbsp;: professionnels recherchés</h1>



<figure class="wp-block-image alignright size-large is-resized is-style-default" style="margin-top:var(--wp--preset--spacing--20);margin-bottom:var(--wp--preset--spacing--20)"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/04/Gemini_Generated_Image_98eus398eus398eu-scaled.png"><img loading="lazy" decoding="async" width="1024" height="559" src="https://www.smalsresearch.be/wp-content/uploads/2026/04/Gemini_Generated_Image_98eus398eus398eu-1024x559.png" alt="" class="wp-image-27699" style="aspect-ratio:1.8333516399024625;object-fit:contain;width:546px;height:auto"/></a></figure>



<p class="justify-text no-top-margin">Comme mentionné précédemment, les LLM nous offrent progressivement des possibilités très puissantes pour traiter nos bases de code <em>legacy</em>, surtout lorsque nous avons accès aux modèles volumineux et puissants disponibles aujourd’hui. Nous constatons toutefois qu’il s’agit en réalité d’une boîte à outils très bien fournie, comprenant plusieurs outils puissants, et que nous devons savoir ce que nous voulons en faire et comment les utiliser au mieux.</p>



<p class="justify-text">Tout n’est pas encore entièrement automatisé&nbsp;: nous aurons donc toujours besoin de bons professionnels pour tirer le meilleur parti de ces outils. Notre conseil aux développeurs est de ne surtout pas avoir peur de l’IA et de l’utiliser régulièrement lors de l’analyse et du développement de logiciels&nbsp;: l’expérience est la meilleure école pour former les bons professionnels dont nous avons besoin dans ce domaine.</p>



<p class="justify-text">Pour l’instant, la conclusion est donc la suivante&nbsp;: pour le code <em>legacy</em>, l’IA n’est pas une panacée, mais une boîte à outils pratique qu’il vaut mieux essayer dans le cadre d’une approche plus large. Comme indiqué, nous nous pencherons plus tard dans l&#8217;année sur le milieu et la partie droite du spectre du code <em>legacy</em>. Nous pensons qu&#8217;il existe ici davantage de possibilités d&#8217;automatisation de certains workflows, surtout si nous exploitons davantage les agents. Il est donc possible que, pour des projets un peu plus simples et répétitifs, nous puissions évoluer du &#8220;professionnel&#8221; vers &#8220;l&#8217;usine&#8221;.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Legacy &#038; AI: Tijdreizen in je Terminal</title>
		<link>https://www.smalsresearch.be/legacy-ai-tijdreizen-in-je-terminal/</link>
		
		<dc:creator><![CDATA[Koen Vanderkimpen]]></dc:creator>
		<pubDate>Thu, 09 Apr 2026 07:56:17 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[Artificial intelligence]]></category>
		<category><![CDATA[legacy]]></category>
		<category><![CDATA[LLM]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[software engineering]]></category>
		<guid isPermaLink="false">https://www.smalsresearch.be/?p=27622</guid>

					<description><![CDATA[Sinds de hype van grote taalmodellen is losgebarsten, zullen de meeste ontwikkelaars ondertussen al wel geproefd hebben van de productiviteitswinst die deze tools, mits correct gebruik, kunnen bieden. In deze blog onderzoeken we of we verder kunnen gaan dan dat: biedt het AI ook voldoende hulp bij het beheersen van Legacy Code?]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image alignleft size-large is-resized"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/04/Gemini_Generated_Image_6jrj5n6jrj5n6jrj.png"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://www.smalsresearch.be/wp-content/uploads/2026/04/Gemini_Generated_Image_6jrj5n6jrj5n6jrj-1024x1024.png" alt="" class="wp-image-27693" style="width:274px;height:auto"/></a></figure>



<p class="no-top-margin justify-text"><em>Cet article est aussi disponible en <a href="https://www.smalsresearch.be/legacy-ai-voyagez-temps-terminal/" data-type="post" data-id="28963">français</a>.</em></p>



<p class="justify-text" style="padding-top:0;padding-right:0;padding-bottom:0;padding-left:0">Sinds de hype van grote taalmodellen is losgebarsten, zullen de meeste ontwikkelaars ondertussen al wel geproefd hebben van de productiviteitswinst die deze tools, mits correct gebruik, kunnen bieden. In deze blog onderzoeken we of we verder kunnen gaan dan dat: biedt AI ook voldoende hulp bij het beheersen van Legacy Code?</p>



<span id="more-27622"></span>



<p class="justify-text">Het inzetten van <a href="https://www.smalsresearch.be/zin-onzin-en-nut-van-llms-zijn-ze-de-hype-waard/" data-type="post" data-id="24386">Large Language Models (LLM)</a> bij het programmeren is inderdaad ondertussen stilaan goed gekend: het gaat van vragen stellen aan een chatbot (&#8220;hoe schrijf ik in Java een algoritme dat &#8230; &#8220;), overheen steeds <a href="https://www.smalsresearch.be/llms-voor-code/" data-type="post" data-id="18875">slimmere en langer wordende <em>code completion</em></a> (automatisch aanvullen wat je wil typen in de editor), tot <a href="https://www.smalsresearch.be/vibe-coding-met-agentic-ides/" data-type="post" data-id="22499">volledige <em>vibe coding</em></a> (in de IDE, of zelfs gewoon in een terminal): AI agenten, via prompts, hele stukken code &#8211; ja, zelfs werkende toepassingen &#8211; laten schrijven op je machine.</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:30%">
<p class="justify-text">Deze manier van werken beschreven we reeds <a href="https://www.smalsresearch.be/vibe-coding-met-agentic-ides/" data-type="post" data-id="22499">in een vorige blogpost</a>, en de caveats, zaken waarop men moet letten, gelden nog steeds: blijf continu opvolgen, stel zaken in vraag, controleer, en geef de juiste hoeveelheid nuttige context mee aan het AI (een kunst op zich). Voor het behandelen van <strong><em>legacy code</em></strong>, stellen er zich echter nog een aantal verdere problemen:</p>



<ul class="wp-block-list">
<li class="justify-text">Het is geen nieuwbouw (of <em>greenfield</em>): er is erg veel impact van &#8211; vaak obscure &#8211; beslissingen uit het verleden.</li>



<li class="justify-text">In veel gevallen is er reeds een massa code aanwezig.</li>



<li class="justify-text">Vaak vraagt het com- pileren, uitvoeren en testen van de code specifieke technologie, die zelf verouderd is en soms moeilijk te in-stalleren of simuleren.</li>



<li class="justify-text">Je bent als mens vaak niet meer onderwezen in het hoe en waarom van de bestaande codebase, waardoor het moeilijker wordt de resultaten van het AI kritisch te be-oordelen.</li>
</ul>
</div>



<div class="wp-block-column is-style-section-1 has-accent-5-background-color has-background is-layout-flow wp-container-core-column-is-layout-43dc041e wp-block-column-is-layout-flow is-style-section-1--8" style="border-width:2px;border-top-left-radius:0px;border-top-right-radius:0px;border-bottom-left-radius:0px;border-bottom-right-radius:0px;padding-top:0;padding-right:0;padding-bottom:0;padding-left:0;flex-basis:70%">
<h3 class="wp-block-heading is-style-default" style="margin-top:var(--wp--preset--spacing--20);margin-right:var(--wp--preset--spacing--20);margin-bottom:var(--wp--preset--spacing--20);margin-left:var(--wp--preset--spacing--20)"><span style="text-decoration: underline;">Vibe Coding: Een aantal Tips</span></h3>



<p class="justify-text has-small-font-size" style="padding-top:var(--wp--preset--spacing--20);padding-right:var(--wp--preset--spacing--20);padding-bottom:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--20)"><em>Deze eenvoudige truukjes ondervonden we reeds bij ons werk rond Legacy Code &amp; AI, maar zijn breder toepasbaar naar alle Vibe Coding projecten.</em></p>



<ul class="wp-block-list">
<li class="justify-text" style="padding-right:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--20);font-size:clamp(14px, 0.875rem + ((1vw - 3.2px) * 0.196), 16px);">Grote Schoonmaak: vóór je een AI loslaat op een codebase, moet je ervoor zorgen dat er geen privégegevens, paswoorden, of andere gevoelige informatie in te vinden zijn!</li>



<li class="justify-text" style="padding-right:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--20);font-size:clamp(14px, 0.875rem + ((1vw - 3.2px) * 0.196), 16px);">Planning: vraag om opties en stel executie uit. Als je zelf bedreven bent in wat je wil doen, heb je vast en zeker al een idee van waar je precies naartoe wilt. Het kan echter soms lonen om je gesprek met het AI heel open van geest te beginnen en te vragen naar ideeën en opties (b.v. qua architectuur of gebruikte technologie) om je algemene visie te bewaarlijken (waarbij je het soms overijverige AI ook duidelijk maakt dat er alleen nog maar wordt gepland). Vraag specifiek naar meerdere suggesties! Dit kan helpen bij het brainstormen, en om je eigen ideeën aan te vullen met meer inspiratie. In het vervolg van het geprek ga je dan dieper in op de opties die je het meeste aanstaan, en dan pas vul je aan met je eigen expertise om de ideeën van het AI bij te sturen, tot er een concreet plan van actie is ontstaan dat zo optimaal mogelijk is. Pas daarna gaan we over tot effectieve implementatie.</li>



<li class="justify-text" style="padding-right:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--20);font-size:clamp(14px, 0.875rem + ((1vw - 3.2px) * 0.196), 16px);">Indirectie en Tools. Zeker als je via een CLI (Command Line Interface) werkt, zijn zowel jij als het AI zich niet meteen bewust van alle mogelijke reeds bestaande tools die zouden kunnen worden geëxploiteerd om je doelen te bereiken. Laat het AI zoeken naar tools die zouden kunnen helpen, en helpen bij de installatie ervan. Hoe meer zaken je via tools kan doen, hoe minder de context wordt vervuild met nodeloos &#8220;manueel&#8221; werk door het AI zelf (om nog maar te zwijgen van de besparing qua token gebruik). Zo bestaan er b.v. allerlei <a href="https://en.wikipedia.org/wiki/Static_program_analysis">static code analysis tools</a> die je kan gebruiken om de kwaliteit van je geschreven code te evalueren en hoog te houden. Het is vaak een koud kunstje voor het AI om heel wat van de gegeven suggesties na de analyse uit te voeren.</li>



<li class="justify-text" style="padding-right:var(--wp--preset--spacing--20);padding-left:var(--wp--preset--spacing--20);font-size:clamp(14px, 0.875rem + ((1vw - 3.2px) * 0.196), 16px);">Expert Mode: soms volstaan standaard tools niet om het AI voldoende te helpen bij wat je wil dat het doet. In dat geval kan je het AI eerst diens eigen tools laten schrijven. Daarbij kan je er voor zorgen dat het resultaat, of de output van de tool, iets is wat kort en samenvattend is voor de verdere taken, om de context niet teveel te belasten. Context windows van LLMs worden weliswaar steeds groter, maar dan nog moet je ervoor zorgen dat enkel de nuttigste zaken erin zitten (pas op voor <a href="https://redis.io/blog/context-rot/">context rot</a>).</li>
</ul>
</div>
</div>



<p>In een vorige <a href="https://www.smalsresearch.be/legacy-code-trotseren-best-practices-ai/" data-type="post" data-id="21131">post rond legacy code</a>, gaven we een erg brede definitie. Laten we dus vooreerst iets duidelijker stellen wat we met Legacy bedoelen, en de &#8220;moeilijkheidsgraad&#8221; van Legacy projecten beter illustreren.</p>



<h2 class="wp-block-heading">&#8220;Oude&#8221; code: een spectrum aan mogelijkheden</h2>



<p class="justify-text">Er is niet echt een officiële definitie van legacy code; meestal spreekt men van het gebruik van niet langer ondersteunde technologie, moeilijk te onderhouden, of simpelweg &#8220;code die je van iemand anders erft&#8221;. Het gaat uiteraard altijd wel om code die nog in gebruik, en dus belangrijk is. Ironisch genoeg, zijn het vaak de meest kritische toepassingen, die al jaren meegaan en waar men al jaren &#8220;op vertrouwt&#8221;, maar dan zonder ze goed te onderhouden.</p>



<p class="justify-text">AI kan ons helpen bij het onderhoud van eender welke code, dus we zullen een spectrum demonstreren dat van de oudste, ergste legacy code gaat, tot code van projecten die slechts een kleine update nodig heeft. Aan de ene kant van het spectrum heb je programma&#8217;s, geschreven in ouderwetse programmeertalen, volgens een achterhaalde architectuur, gebruik makend van databases die niet meer van deze tijd zijn, en draaiende op servers met niet langer ondersteunde besturingssystemen: bij deze mastodonten moet men vaak bang zijn dat ze kritisch zullen falen bij de kleinste verkeerde wijziging. Helemaal aan de andere kant heb je vrij goed onderhouden software, waarin een softwarebibliotheek wordt gebruikt die niet meer de meest recente versie is: meestal een koud kunstje om ze weer helemaal up-to-date te krijgen. Ergens in het midden vind je, ten slotte, toepassingen terug waarbij de meeste developers nog niet meteen het woord Legacy in de mond zullen nemen, maar waar wel moeilijke migraties dienen te gebeuren, met b.v. een verouderd framework of twee dat zou moeten worden vervangen.</p>



<figure class="wp-block-image size-large is-resized"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/04/Gemini_Generated_Image_307h9q307h9q307h-scaled.png"><img loading="lazy" decoding="async" width="1024" height="506" src="https://www.smalsresearch.be/wp-content/uploads/2026/04/Gemini_Generated_Image_307h9q307h9q307h-1024x506.png" alt="" class="wp-image-27634" style="width:1301px;height:auto"/></a></figure>



<p class="justify-text">Wat kunnen we hier nu mee? Bieden LLMs ons andere mogelijkheden naargelang de plaats van het project op dit spectrum? Ons onderzoek heeft zich tot nu toe op de linkerkant van dit spectrum gefocust, dus het vervolg van deze blogpost zal veeleer over de mogelijkheden gaan om &#8220;échte&#8221; Legacy aan te pakken. Later dit jaar gaan we ook verder uitdiepen wat we met migraties en updates kunnen doen.</p>



<h2 class="wp-block-heading">Gebruik van LLMs op Legacy Codebases</h2>



<p class="justify-text">Het is duidelijk dat de eenvoudige prompt &#8220;herschrijf mij dit programma volgens moderne standaarden&#8221; niet zal werken (al beweren sommige vendors dat dit eraan zit te komen). We zullen iets concretere zaken gaan vragen, en het werk ook enigszins in stukjes moeten kappen. Verder zijn er eigenlijk twee zaken die we kunnen gaan doen met onze legacy code: ze herschrijven en ze documenteren.</p>



<h3 class="wp-block-heading">Herschrijven van Legacy Code</h3>



<p class="justify-text">Als we beginnen met code herschrijven, zullen we er vaak rekening mee moeten houden dat een heel groot project voldoende goed herbouwen een te moeilijke opgave is. We kunnen &#8220;quick wins&#8221; behalen door strategisch een aantal zaken te gaan herschrijven van een project, en die stukken dan te gebruiken in een ruimere context, waarbij een team van mensen en AI de toepassing opnieuw bouwen volgens de regels van de kunst. Bij onze experimenten stelden we vast dat het een brug te ver was om van het AI te verwachten een volledig nieuwe architectuur te gebruiken, tegelijk met het vertalen van oude code naar nieuwe. Wat wel mogelijk is, is om heel wat van de typische scaffolding (de standaardcode om tot iets werkend te komen) van een nieuw project te vibe coden, en daar dan gericht een aantal stukken code in te injecteren die vertalingen zijn van stukjes van een legacy project. Als mens is het onze taak om duidelijk aan te geven welke architectuur we verwachten, en wat de kwaliteitsregels zijn van de nieuw geschreven code.</p>



<p class="justify-text">Eén van de grotere uitdagingen bij het herschrijven van code met behulp van AI, is het testen van de correctheid van de vertaling: doet de code nog wat ze vroeger deed (los van het feit of dit wenselijk is, want zelfs de business case kan soms te verouderd zijn in geval van Legacy)? Bij redelijk nieuwe projecten zullen er reeds heel wat testen bestaan die we kunnen uitvoeren om de correctheid na te gaan, maar bij legacy hebben we vaak het probleem dat de toepassing eenvoudigweg wordt getest in productie, of op zijn minst met productiedata: er zijn geen specifieke tests of zelfs maar veilig bruikbare testdata. In dat geval komt het erop neer een omgeving te creëren waarin we de nieuwe code op een veilige manier kunnen testen, wat meestal ad hoc werk is en enige creativiteit vraagt. We mogen namelijk geen productiedata naar de Cloud sturen, dus we moeten ervoor zorgen dat het LLM deze niet kan lezen. Het zou eenvoudiger zijn als we lokaal draaiende LLMs zouden kunnen gebruiken, maar voorlopig zijn deze nog niet krachtig genoeg (als ze al beschikbaar zijn) om dergelijke complexe taken uit te voeren met legacy code.</p>



<p class="justify-text">Een andere uitdaging is de gebruikersinterface: bij oudere projecten is deze vaak achterhaald en moet er, vanaf de grond, een nieuwe GUI (Graphical User Interface) worden opgebouwd. Dat geeft echter het probleem dat je geen basis meer hebt in het oude project om mee te vergelijken: de nieuwe interface zal doorgaans manueel door mensen moeten worden getest. Ik verwacht echter dat we op dit vlak nog vorderingen zullen zien in de nabije toekomst, wat de mogelijkheden van het AI betreft. We zien namelijk al systemen opduiken die je volledige computer kunnen besturen (zoals <a href="https://openclawd.ai/">OpenClaw</a> of het <a href="https://www.anthropic.com/news/3-5-models-and-computer-use">&#8220;Computer Use&#8221; van Anthropic</a>), en ook integratie met meer traditionele raamwerken voor het testen van een GUI behoort tot de mogelijkheden.</p>



<p class="justify-text">Waar we, ten slotte, ook quick wins mee kunnen halen, zijn kleinere Legacy projecten. Als we een klein tot matig groot legacy programma gebruiken, met beperkte functionaliteit en een eenvoudige GUI of een duidelijke input en output in geval van batch processing, en geen business case om deze te integreren in een andere manier van werken, dan kunnen we een rechttoe rechtaan aanpak proberen om een moderne versie in een nieuwe programmeertaal te bouwen met AI. We moeten dan nog altijd goed testen en een gestructureerde aanpak hebben met bijsturingen door menselijke developers, maar het wordt wel feasible om dit voor niet-kritische toepassingen te gaan uitproberen. Een intern gebruikte toepassing is bijvoorbeeld een typische goede eerste kandidaat.</p>



<h3 class="wp-block-heading">Documenteren van Legacy Code</h3>



<p class="justify-text">Soms is herschrijven van Legacy met AI net iets te ambitieus, óf we hebben meer informatie nodig voor we er ons aan wagen. In dat geval kan het interessant zijn om eerst richting documentatie te kijken: het AI kan ons ook helpen om het verkennen van een legacy codebase net iets minder op archeologie voor gevorderden te doen lijken.</p>



<p class="justify-text">Van een klein tot matig stuk code uitleggen en er de business logica uithalen, of een groter stuk analyseren en de opbouw en architectuur uitleggen: dat kan met de huidige grote taalmodellen zonder meer. We kunnen echter verder gaan: we kunnen het AI tools laten bouwen om zichzelf te helpen de codebase te verkennen, en b.v. diagrammen te voorzien van de afhankelijkheden tussen de stukken code. Of we kunnen het scripts laten maken om de bevindingen na elk stuk analyse netjes te structureren in een tekstbestand voor zichzelf en een pdf voor de menselijke gebruiker.</p>



<p class="justify-text">We kunnen ook hiërarchisch werken: eerst een verkenning van de codebase doen, en dan telkens dieper duiken in de verschillende modules, om meer en meer detail te verkrijgen en de analyse aan te vullen. Dat is de top-down aanpak, die we echter kunnen aanvullen met een bottom-up versie: eens we tot in de diepte zijn gegaan, kunnen we weer zaken laten samenvatten om van het grotere plaatje een beter geïnformeerde uiteenzetting op te bouwen.</p>



<p class="justify-text">Hier is het wel van belang dat we van tevoren weten wat we precies willen bereiken. Een algemene analyse van een codebase door het AI kan interessant zijn wanneer de menselijke gebruikers het systeem nog totaal niet kennen en aanknopingspunten willen hebben om zaken te leren, maar biedt meestal weinig extra aan mensen die de codebase reeds beheersen.</p>



<p class="justify-text">Maar wanneer het doel is om de codebase te kunnen onderhouden, kunnen we eventueel een systeem opbouwen waarbij we een chatbot aanbieden die de specifieke context en bijzonderheden van het legacy project kent, en daar heel gerichte vragen over kan beantwoorden. Dit kan b.v. in <a href="https://adoption.microsoft.com/en-us/ai-agents/copilot-studio/">CoPilot Studio</a>. Wanneer dat niet goed genoeg werkt, kunnen we nog overwegen om manueel een knowledge base op te bouwen, gebruik makend van het AI, die dan weer door het AI kan worden gebruikt om vragen te beantwoorden.</p>



<p class="justify-text">Nog een andere optie bestaat eruit dat we specifieke informatie uit de codebase willen extraheren, zoals de business logica per afzonderlijke module, of pseudocode die menselijke developers kan helpen om de logica in een ander project te herimplementeren. (En uiteraard kan bij die tweede stap ook weer een AI worden ingezet.)</p>



<p class="justify-text">Kortom, met een beetje creativiteit kunnen we voor de meeste ad hoc analyses een betere aanpak verzinnen dan &#8220;analyseer er maar gewoon op los&#8221;. En het documenteren van een legacy systeem kan ook gewoon een eerste opstap zijn naar het herschrijven.</p>



<p></p>



<h2 class="wp-block-heading" style="margin-top:var(--wp--preset--spacing--20);margin-bottom:var(--wp--preset--spacing--20)">Besluit: vakmannen gevraagd</h2>



<figure class="wp-block-image alignright size-large is-resized is-style-default" style="margin-top:var(--wp--preset--spacing--20);margin-bottom:var(--wp--preset--spacing--20)"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/04/Gemini_Generated_Image_98eus398eus398eu-scaled.png"><img loading="lazy" decoding="async" width="1024" height="559" src="https://www.smalsresearch.be/wp-content/uploads/2026/04/Gemini_Generated_Image_98eus398eus398eu-1024x559.png" alt="" class="wp-image-27699" style="aspect-ratio:1.8333516399024625;object-fit:contain;width:546px;height:auto"/></a></figure>



<p class="justify-text no-top-margin">Zoals we hebben aangekaart, bieden LLMs ons stilaan erg krachtige mogelijkheden om onze Legacy Codebases aan te pakken, zéker wanneer we toegang hebben tot de grote en krachtige modellen die vandaag beschikbaar zijn. We zien echter ook dat het eigenlijk een heel goed gevulde gereedschapskoffer is, met een aantal krachtige &#8220;power tools&#8221;, en dat we moeten weten <em>wat </em>we ermee willen bereiken en <em>hoe </em>we deze best kunnen gebruiken.</p>



<p class="justify-text">We zitten nog niet op het punt dat alles automatisch gaat: we zullen dus nog steeds goede <em>vakmannen </em>nodig hebben om optimaal van dit gereedschap gebruik te maken. Onze raad aan developers is om zeker niet bang te zijn van AI en er geregeld gebruik van te maken bij de analyse en ontwikkeling van software: ervaring is de beste leerschool om de goede vakmannen die we hiervoor nodig hebben, op te leiden.</p>



<p class="justify-text">Voorlopig is dus het besluit: voor legacy code is AI geen wondermiddel, maar een handige gereedschapskist die je best kan uitproberen als deel van een bredere aanpak. Zoals gezegd kijken we later dit jaar eerder naar het midden en de rechterkant van het spectrum van legacy. Wij vermoeden dat hier meer mogelijkheden zijn tot automatisering van een aantal workflows, zeker als we ook dieper gebruik gaan maken van agents. Mogelijks kunnen we, voor iets eenvoudigere en repetitievere projecten, dus toch van &#8220;vakman&#8221; naar &#8220;fabriek&#8221; evolueren.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Protéger ses données des administrateurs&#160;: l’informatique confidentielle « on-premise »</title>
		<link>https://www.smalsresearch.be/proteger-ses-donnees-des-administrateurs-linformatique-confidentielle-on-premise/</link>
		
		<dc:creator><![CDATA[Fabien A. P. Petitcolas]]></dc:creator>
		<pubDate>Tue, 17 Mar 2026 07:30:00 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[confidential computing]]></category>
		<category><![CDATA[confidential containers]]></category>
		<category><![CDATA[data center]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[TEE]]></category>
		<category><![CDATA[Trusted Execution Environment]]></category>
		<guid isPermaLink="false">https://www.smalsresearch.be/?p=26501</guid>

					<description><![CDATA[Dans cet article et le suivant, nous nous penchons sur la possibilité de déployer des EEC sur notre propre infrastructure (on-premise). L’objectif est triple : bénéficier de la puissance de l’informatique confidentielle pour protéger les données et permettre de nouveaux cas d’usage, tout en gardant un certain contrôle sur la pile logicielle et matérielle, et ainsi renforcer la confiance de nos clients.]]></description>
										<content:encoded><![CDATA[
<p><em>Dit artikel is ook beschikbaar&nbsp;in het&nbsp;<a href="/je-data-beschermen-tegen-beheerders-on-premise-vertrouwelijke-it/">Nederlands</a>.</em></p>



<p>Et si vos administrateurs système pouvaient accéder à vos données sensibles sans que vous le sachiez&nbsp;? L’informatique confidentielle propose une solution&nbsp;: isoler les données, même de ceux qui gèrent l’infrastructure. Mais comment&nbsp;?</p>



<p>L’informatique confidentielle regroupe un ensemble de technologies permettant de protéger les données sensibles de telle sorte qu’il n’est pas nécessaire de les déchiffrer pour les traiter. Alors que certaines, comme le chiffrement homomorphe, sont encore très complexes à mettre en œuvre, les environnements d’exécution de confiance (EEC aussi appelés «&nbsp;<em>trusted execution environment (TEE)</em>&nbsp;» en anglais) ont atteint une bonne maturité, permettant de les considérer comme des composants importants dans la protection des données.</p>



<p>L’objectif premier des EEC est de dresser un rempart contre la curiosité des entités contrôlant l’infrastructure. Toutefois la protection technique ne résout pas tout. Les lois extraterritoriales [<a href="#ref1">1-5</a>] et l’usage de bibliothèques logicielles propriétaires imposées par certains fournisseurs d’infrastructure informatique peuvent fragiliser cette isolation.</p>



<p>Dans cet article et le suivant, nous nous penchons sur la possibilité de déployer des EEC sur notre propre infrastructure (<em>on-premise</em>). L’objectif est triple&nbsp;: bénéficier de la puissance de l’informatique confidentielle pour protéger les données et permettre de nouveaux cas d’usage, tout en gardant un certain contrôle sur la pile logicielle et matérielle, et ainsi renforcer la confiance de nos clients.</p>



<h1 class="wp-block-heading">Séparation des rôles</h1>



<p>Commençons par rappeler les différents acteurs qui interviennent lors du déploiement d’une application sur une infrastructure informatique. Leurs rôles doivent être hermétiquement séparés pour garantir l’intégrité du système.</p>



<ul class="wp-block-list">
<li><strong>L’opérateur d’infrastructure</strong> gère le matériel et les infrastructures (calcul, stockage, réseau), incluant la maintenance des environnements d’exécution de confiance. Il contrôle les mises à jour des micrologiciels et l’allocation des ressources, mais ne devrait pas pouvoir accéder aux données ou aux charges de travail exécutées.</li>



<li><strong>L’opérateur d’orchestration</strong>, qui peut être le même que l’opérateur d’infrastructure, est responsable de la gestion des grappes de serveurs et du déploiement des charges de travail. Il configure les ressources nécessaires aux applications et supervise les services associés (journalisation, surveillance). Ses privilèges devraient aussi être strictement limités afin d’éviter toute intrusion dans l&#8217;application, tout en permettant l’orchestration essentielle.</li>



<li><strong>Le fournisseur de la charge de travail</strong> conçoit les spécifications des applications et choisit les images de conteneurs adaptées, en garantissant leur conformité et leur intégrité. Il doit prouver aux propriétaires de données (voir ci-dessous) que le code utilisé est sécurisé et respectueux de la confidentialité, sans pour autant accéder directement aux données sensibles.</li>



<li><strong>Le fournisseur d’images de conteneurs</strong> construit, signe et chiffre les images conteneurs, assurant leur provenance et leur sécurité. Il fournit les clés de vérification et de déchiffrement. Sa collaboration avec le fournisseur de l’application est cruciale pour garantir la chaîne d’approvisionnement logicielle et assurer que le code déployé est exactement celui qui a été audité.</li>



<li><strong>Enfin, le propriétaire des données</strong> détient les données traitées par les applications et exige leur confidentialité et leur intégrité. Il accorde sa confiance au code de l’application (le conteneur) et aux preuves cryptographiques fournies par le microprocesseur, excluant de fait les opérateurs d’infrastructure et d’orchestration de son périmètre de confiance. Il peut imposer des vérifications supplémentaires pour s’assurer que ses données ne sont ni visibles ni manipulées par des personnes non autorisées.</li>
</ul>



<p>Les relations entre ces acteurs soulèvent des enjeux spécifiques&nbsp;: le propriétaire des données, par exemple, doit pouvoir faire confiance au code des conteneurs (fournis par le fournisseur de la charge de travail) pour traiter ses données, tout en protégeant celles-ci contre les autres acteurs comme l’opérateur d’infrastructure ou l’opérateur d’orchestration. Notamment les administrateurs de ces opérateurs ne devraient en aucun cas pouvoir avoir accès aux données traitées par les conteneurs.</p>



<h1 class="wp-block-heading">Environnement d’exécution de confiance</h1>



<p>Les EEC permettent de créer une barrière technique renforçant la confiance du propriétaire des données dans le conteneur applicatif. Nous avons déjà expliqué en détail leur fonctionnement ainsi que leurs avantages et inconvénients dans un rapport technique&nbsp;[<a href="#ref6">6</a>] et des articles de blogues&nbsp;[<a href="#ref7">7</a>], [<a href="#ref8">8</a>]. Dans cette section nous en rappelons les points clés avant de présenter des choix technologiques pour une mise en œuvre sur notre infrastructure de recherche.</p>



<p>Le bon fonctionnement des EEC réside dans le matériel. Certains micro-processeurs modernes permettent de réserver et de chiffrer une portion de la mémoire vive (RAM) dédiée à une machine virtuelle (VM) spécifique. Ainsi, un administrateur de la machine hôte, même avec les privilèges les plus élevés, ne verra que des données chiffrées s’il tente d’inspecter cette zone mémoire. Bien que des attaques par canaux auxiliaires existent (e.g.,&nbsp;[<a href="#ref9">9</a>]), leur complexité nécessite généralement un accès physique prolongé et l’ajout de composants matériels malveillants, ce qui les rend extrêmement difficiles à exécuter.</p>



<p>Pour que le propriétaire des données soit certain que son application s’exécute dans un environnement sain, il utilise le mécanisme d’<a href="/introduction-a-l-informatique-confidentielle/#Attestation">attestation</a>. Ce processus génère une signature cryptographique du contenu de la mémoire de la VM au moment de son lancement. Cette signature est certifiée par le fabricant du micro-processeur.</p>



<p>Ce processus a des limites&nbsp;notamment dans le cas où l’opérateur d’infrastructure est une société étrangère (e.g., Amazon AWS, Google Cloud ou Microsoft Azure) qui impose ses bibliothèques propriétaires dans la VM afin, par exemple, de fournir la bonne couche d’abstraction matérielle.</p>



<p>Cela nous a conduit à vouloir tester ce type de technologie dans notre laboratoire de recherche sur notre propre matériel, anticipant la possibilité de le faire un jour sur <a href="https://www.gcloud.belgium.be/">G-Cloud</a>. L’intérêt est de permettre à un client de SMALS de faire fonctionner un conteneur applicatif de manière sécurisée, sans qu’un administrateur de SMALS puisse accéder au contenu du conteneur.</p>



<p>Mais l’utilité des EEC dépasse la simple protection contre les administrateurs. Elle ouvre la voie à d’autres cas d’usage.</p>



<h1 class="wp-block-heading">Cas d’usage</h1>



<p>Un premier exemple se trouve dans le cadre de l’infrastructure européenne de <a href="https://health.ec.europa.eu/ehealth-digital-health-and-care/digital-health-and-care/electronic-cross-border-health-services_fr">services numériques de santé en ligne (eHDSI)</a>. Là, les professionnels de santé d’un pays de traitement peuvent demander les données de santé pertinentes du patient au pays d’affiliation de celui-ci. D’un point de vue technique, la demande est transmise par la passerelle du point de contact national pour la santé (NCPeH) du pays où l’événement de santé imprévu se produit, au pays d’affiliation. Les informations demandées doivent ensuite être récupérées auprès de l’infrastructure nationale du pays d’affiliation, traduites en anglais et transcodées (les données de santé sont transformées du système de codification national vers le système de codification communément accepté, par exemple du format <a href="https://www.hl7.org.uk/standards/hl7-standards/fhir/">FHIR</a> ou <a href="https://www.ehealth.fgov.be/standards/kmehr/en">KMEHR</a> vers <a href="https://www.hl7.org.uk/standards/hl7-standards/cda-clinical-document-architecture/">CDA</a>), puis renvoyées et présentées au professionnel de santé du pays de traitement. Compte tenu du caractère sensible des données, les données devraient être chiffrées de bout en bout, depuis la source de données sur l’infrastructure du pays d’affiliation jusqu’au prestataire de soins de santé dans le pays de traitement. Dans la pratique, cela n’est pas encore possible en raison des différences importantes entre les pays européens. Cependant, il devrait être possible, au minimum, de garantir que les données restent chiffrées et inaccessibles à tout utilisateur ou administrateur entre la source des données et la sortie de la passerelle NCPeH. Une possibilité consiste alors à utiliser des EEC pour effectuer la traduction et le transcodage des données.</p>



<p>Un autre exemple d’utilisation des EEC est la collaboration sécurisée entre entités ne souhaitant pas partager leurs données brutes. Dans le secteur de l’éducation et de l’emploi, une expérience menée par Bogdanov <em>et al</em> en Estonie&nbsp;[<a href="#ref10">10</a>] a montré la puissance des techniques d’informatique confidentielle. Les auteurs de cette étude ont cherché à déterminer si le fait de travailler pendant les études supérieures était corrélé à un échec d’obtention du diplôme dans les délais impartis – une question particulièrement cruciale pour le secteur des technologies de l’information et de la communication en Estonie. Pour répondre à cette problématique sans compromettre la confidentialité des données personnelles, les chercheurs ont combiné les registres d’éducation du ministère de l’Éducation et de la Recherche avec les données de paiements d’impôts du Conseil des taxes et des douanes, grâce à une technique particulière d’informatique confidentielle. Mais une variante plus simple avec un EEC eût été tout aussi efficace pour l’analyse tout en respectant le secret fiscal et la protection des données.</p>



<h1 class="wp-block-heading">CoCo</h1>



<p>Plusieurs solutions logicielles sont disponibles pour mettre à profit les EEC sur notre propre infrastructure de recherche. Nous avons choisi d’utiliser le projet «&nbsp;<a href="https://confidentialcontainers.org/">Confidential Containers (CoCo)</a>&nbsp;» dont le code source est ouvert. Il permet en effet une bonne isolation des conteneurs applicatifs et prend en charge le mécanisme d’attestation de manière transparente, tout en préservant la flexibilité de déploiement et la compatibilité avec la plateforme <a href="https://kubernetes.io/">Kubernetes</a> sur laquelle il s’appuie. Chaque capsule Kubernetes est isolée dans une machine virtuelle confidentielle très légère, de manière à garantir que seules les applications autorisées peuvent accéder aux données sensibles.</p>



<p>Les conteneurs CoCo contiennent quelques composants logiciels nécessaires en plus de l’application elle-même. Ceux-ci permettent de télécharger l’image du conteneur à exécuter, de faciliter la vérification de l’attestation et d’appliquer certaines politiques de sécurité. Leur interface de programmation est relativement petite, notamment par rapport à une solution où tout un nœud Kubernetes serait mis à l’intérieur d’une machine virtuelle confidentielle. En outre, l’image de la machine virtuelle invitée est statique et générique sur toutes les charges de travail et même les plateformes, permettant ainsi d’assurer plus simplement des garanties de sécurité. En même temps, le partage entre les conteneurs dans la même capsule Kubernetes est aisé. Par exemple, l’espace de noms du réseau de la capsule ne quitte pas la machine virtuelle confidentielle, autorisant ainsi les conteneurs qu’elle contient à communiquer de manière confidentielle sans coût supplémentaire.</p>



<p>CoCo s’appuie sur les conteneurs <a href="https://katacontainers.io/">Kata</a>, un autre projet de logiciel libre, qui permet de faire fonctionner des capsules Kubernetes à l’intérieur de machines virtuelles confidentielles très légères (voir <a href="#Figure-1">Figure 1</a>). CoCo ajoute cependant deux composants cruciaux afin d’assurer confidentialité et sécurité (voir <a href="#Figure-2">Figure 2</a>).</p>



<ul class="wp-block-list">
<li>Le premier concerne la <strong>récupération des images des conteneurs</strong>&nbsp;: celles-ci sont habituellement téléchargées par le nœud principal Kubernetes avec l’aide d’une interface d’exécution de conteneur (CRI) comme «&nbsp;<code>containerd</code>,&nbsp;» exposant ainsi les images à la machine hôte à travers le système de fichiers. Avec CoCo, les images sont déchiffrées, et décompactées à l’intérieur de la machine virtuelle confidentielle, d’où la nécessité des composants susmentionnés.</li>



<li>Le second est l’<strong>attestation</strong> qui est, comme nous l’avons déjà vu, indispensable à l’établissement d’un environnement d’exécution de confiance. Par exemple, afin de déchiffrer une image, l’invité doit pouvoir obtenir la clé secrète de déchiffrement, mais celle-ci n’est fournie que si l’invité peut prouver son authenticité. C’est le rôle de deux composants&nbsp;qui s’appuient sur un système appelé «&nbsp;<em><a href="https://github.com/confidential-containers/trustee">Trustee</a></em>,&nbsp;» extérieur à la machine virtuelle et composé de deux services&nbsp;: un service d’attestation permettant de valider la base d’exécution de confiance et un service de médiation de clés permettant de fournir les ressources secrètes nécessaires à la machine virtuelle et à l’application.</li>
</ul>



<figure class="wp-block-image aligncenter size-full is-resized" id="Figure-1"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture1-Exemple-architecture.svg"><img decoding="async" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture1-Exemple-architecture.svg" alt="" class="wp-image-26519" style="width:600px"/></a><figcaption class="wp-element-caption">Figure 1 &#8211; Exemple d’architecture avec deux nœuds Kubernetes et des machines virtuelles confidentielles légères Kata, elles-mêmes contenant des capsules Kubernetes. La mémoire allouée à chaque machine virtuelle est directement chiffrée par le microprocesseur du nœud 2. Cela permet une forte isolation de chaque capsule non seulement vis-à-vis des autres, mais aussi vis-à-vis du noyau de la machine hôte.</figcaption></figure>



<p>CoCo fournit donc les bases pour construire des conteneurs applicatifs confidentiels en permettant d’exécuter ces conteneurs à l’intérieur de machines virtuelles confidentielles, gérant les images chiffrées et signées des conteneurs, les secrets scellés, et d’autres caractéristiques. Chaque conteneur ou groupe de conteneurs de la même application peut être assigné à une machine virtuelle confidentielle, incluant non seulement la charge de travail, mais aussi des processus permettant à l’application d’appeler certains services de sécurité. <strong></strong></p>



<figure class="wp-block-image aligncenter size-full is-resized" id="Figure-2"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture2-Schema-coco-1.svg"><img decoding="async" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture2-Schema-coco-1.svg" alt="" class="wp-image-26520" style="width:600px"/></a><figcaption class="wp-element-caption">Figure 2 – Représentation schématique d’un conteneur CoCo et de son environnement. À partir de l’utilisation de la commande <code>kubelet</code> pour lancer le déploiement d’un conteneur CoCo, une machine virtuelle légère est créée avec différents agents de base en son sein. L’un se charge de télécharger l’image (chiffrée et signée) du conteneur applicatif à partir d’un registre. Les autres permettent à la machine virtuelle de s’authentifier et de récupérer les clés nécessaires au déchiffrement et à la vérification de la signature de l’image, avant le lancement du conteneur. D’après <a href="https://github.com/confidential-containers/confidential-containers/blob/main/images/coco-threat-model.png">cette figure</a>.</figcaption></figure>



<p>Tout ce qui se trouve en dehors de la machine virtuelle confidentielle sur l’hôte est considéré comme non fiable, y compris l’outil <code>kubelet</code>, l’interface d’exécution de conteneurs et le noyau du système d’exploitation de l’hôte. Les échanges d’informations entre les contextes de confiance et non fiables sont strictement contrôlés, notamment via des politiques de sécurité dynamiques et configurables. Enfin, l’orchestration Kubernetes elle-même est considérée comme non fiable, limitant les garanties sur le planning ou l’ordre d’exécution des charges de travail, à l’exception de leur déploiement dans une enclave authentifiée.</p>



<h1 class="wp-block-heading">Conclusion</h1>



<p>Les conteneurs confidentiels s’inscrivent dans une démarche globale de sécurité, combinant attestation, vérification des images et bonnes pratiques de la chaîne d’approvisionnement logicielle. Ils permettent de traiter des cas d’usage plus simplement que la cryptographie avancée (collaboration confidentielle, intersection privée d’ensemble, pseudonymisation avancée, etc.). Certes les puristes argueront qu’une solution basée sur des conteneurs confidentiels est moins sûre, mais dans la pratique, elle sera probablement suffisante dans un cadre « <em>on-premise</em> », d’autant plus qu’elle simplifie beaucoup d’aspect une fois qu’elle est mise en place.</p>



<p>Dans l’article suivant, nous entrerons plus en détails dans l’installation et l’utilisation des conteneurs confidentiels CoCo.</p>



<h1 class="wp-block-heading">Références</h1>



<p id="ref1">[1]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C. Bômont, «&nbsp;Strategic Brief no.70 &#8211; 2024 &#8211; Extension of the FISA Law European “digital sovereignty” far from American concerns &#8211; IRSEM&nbsp;», Institut de Recherche Stratégique de l’Ecole Militaire. Consulté le: 9 février 2026. [En ligne]. Disponible sur: <a href="https://www.irsem.fr/en/strategic-brief-no-70-2024">https://www.irsem.fr/en/strategic-brief-no-70-2024</a></p>



<p id="ref2">[2]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D. Michels, «&nbsp;Europeans, forget the US Cloud Act… worry about FISA instead (!)&nbsp;». Consulté le: 1 juillet 2025. [En ligne]. Disponible sur: <a href="https://www.linkedin.com/pulse/europeans-forget-us-cloud-act-worry-fisa-instead-dave-michels-anjze">https://www.linkedin.com/pulse/europeans-forget-us-cloud-act-worry-fisa-instead-dave-michels-anjze</a></p>



<p id="ref3">[3]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; M. Rochefort, «&nbsp;Microsoft face au Sénat : l’aveu qui fait vaciller la souveraineté numérique française&nbsp;», clubic.com. Consulté le: 9 février 2026. [En ligne]. Disponible sur: <a href=" https://www.clubic.com/actualite-573438-microsoft-face-au-senat-l-aveu-qui-fait-vaciller-la-souverainete-numerique-francaise.html">https://www.clubic.com/actualite-573438-microsoft-face-au-senat-l-aveu-qui-fait-vaciller-la-souverainete-numerique-francaise.html</a></p>



<p id="ref4">[4]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D. Deridder, «&nbsp;Understanding Sovereignty: Who Rules your Cloud?&nbsp;», Dirk Deridder. Consulté le: 1 juillet 2025. [En ligne]. Disponible sur: <a href="https://dirkderidder.wordpress.com/2025/03/13/understanding-sovereignty-who-rules-your-cloud/">https://dirkderidder.wordpress.com/2025/03/13/understanding-sovereignty-who-rules-your-cloud/</a></p>



<p id="ref5">[5]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P. Kunert, «&nbsp;Microsoft exec admits it “cannot guarantee” data sovereignty&nbsp;», The Register. Consulté le: 28 juillet 2025. [En ligne]. Disponible sur: <a href="https://www.theregister.com/2025/07/25/microsoft_admits_it_cannot_guarantee/">https://www.theregister.com/2025/07/25/microsoft_admits_it_cannot_guarantee/</a></p>



<p id="ref6">[6]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; F. A. P. Petitcolas, «&nbsp;Informatique confidentielle &#8211; État de l’art&nbsp;», Smals Research, juill. 2023. [En ligne]. Disponible sur: <a href="https://www.smalsresearch.be/publications/document?docid=269">https://www.smalsresearch.be/publications/document?docid=269</a></p>



<p id="ref7">[7]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; F. A. P. Petitcolas, «&nbsp;Introduction à l’informatique confidentielle&nbsp;», Smals Research. Consulté le: 9 janvier 2026. [En ligne]. Disponible sur: <a href="https://www.smalsresearch.be/introduction-a-l-informatique-confidentielle/">https://www.smalsresearch.be/introduction-a-l-informatique-confidentielle/</a></p>



<p id="ref8">[8]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; F. A. P. Petitcolas, «&nbsp;Outils pour l’informatique confidentielle&nbsp;», Smals Research. Consulté le: 9 janvier 2026. [En ligne]. Disponible sur: <a href="https://www.smalsresearch.be/outils-pour-linformatique-confidentielle/">https://www.smalsresearch.be/outils-pour-linformatique-confidentielle/</a></p>



<p id="ref9">[9]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; J. De Meulemeester, D. Oswald, I. Verbauwhede, et J. V. Bulck, «&nbsp;Battering RAM: Low-cost interposer attacks on confidential computing via dynamic memory aliasing&nbsp;», présenté à 47th IEEE Symposium on Security and Privacy (S&amp;P), mai 2026.</p>



<p id="ref10">[10]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D. Bogdanov, L. Kamm, B. Kubo, R. Rebane, V. Sokk, et R. Talviste, «&nbsp;Students and taxes: a Privacy-preserving study using secure computation&nbsp;», <em>Proc. Priv. Enhancing Technol.</em>, vol. 2016, n<sup>o</sup> 3, p. 117‑135, juill. 2016, doi: 10.1515/popets-2016-0019.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Je data beschermen tegen beheerders: ‘on-premise’ Confidential Computing</title>
		<link>https://www.smalsresearch.be/je-data-beschermen-tegen-beheerders-on-premise-vertrouwelijke-it/</link>
		
		<dc:creator><![CDATA[Fabien A. P. Petitcolas]]></dc:creator>
		<pubDate>Tue, 17 Mar 2026 07:30:00 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[confidential computing]]></category>
		<category><![CDATA[confidential containers]]></category>
		<category><![CDATA[data center]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[TEE]]></category>
		<category><![CDATA[Trusted Execution Environment]]></category>
		<guid isPermaLink="false">https://www.smalsresearch.be/?p=26512</guid>

					<description><![CDATA[In deze en de volgende blogpost kijken we naar de mogelijkheid om TEE's op onze eigen infrastructuur (on-premise) te gebruiken. Het doel is drieledig: gebruikmaken van de kracht van confidential computing om data te beschermen en nieuwe toepassingen mogelijk te maken, terwijl we een zekere controle behouden over de software- en hardwarestack, en zo het vertrouwen van onze klanten versterken.]]></description>
										<content:encoded><![CDATA[
<p><em>Cet article est aussi disponible&nbsp;en&nbsp;<a href="/proteger-ses-donnees-des-administrateurs-linformatique-confidentielle-on-premise/">français</a>.</em></p>



<p>Wat als je systeembeheerders toegang zouden hebben tot je gevoelige data zonder dat je het weet? <em>Confidential Computing</em> biedt een oplossing: data isoleren, zelfs voor degenen die de infrastructuur beheren. Maar hoe?</p>



<p><em>Confidential Computing</em> omvat een geheel van technologieën waarmee gevoelige data zodanig worden beschermd dat ze niet hoeven te worden ontsleuteld om te worden verwerkt. Hoewel sommige technologieën, zoals homomorfe versleuteling, nog steeds erg complex zijn om te implementeren, zijn <em>Trusted Execution Environments</em> (TEE&#8217;s) inmiddels zo ver ontwikkeld dat ze kunnen worden beschouwd als belangrijke technologie bij databescherming.</p>



<p>Het belangrijkste doel van TEE&#8217;s is om een buffer te vormen tegen de <a href="https://tweakers.net/nieuws/245316/1700-politiemedewerkers-bekeken-dossier-vermoorde-lisa-buitengewoon-kwalijk.html">nieuwsgierigheid</a> van de entiteiten die de infrastructuur beheren. Technische bescherming lost echter niet alles op. Extraterritoriale wetten [<a href="#ref1">1-5</a>] en het gebruik van eigen softwarelibrary&#8217;s die door sommige IT-infrastructuurproviders worden opgelegd, kunnen deze isolatie ondermijnen.</p>



<p>In deze en de volgende blogpost kijken we naar de mogelijkheid om TEE&#8217;s op onze eigen infrastructuur (<em>on-premise</em>) te gebruiken. Het doel is drieledig: gebruikmaken van de kracht van confidential computing om data te beschermen en nieuwe toepassingen mogelijk te maken, terwijl we een zekere controle behouden over de software- en hardwarestack, en zo het vertrouwen van onze klanten versterken.</p>



<h1 class="wp-block-heading">Scheiding van rollen</h1>



<p>Laten we beginnen met een overzicht van de verschillende spelers die betrokken zijn bij de implementatie van een toepassing op een IT-infrastructuur. Hun rollen moeten strikt gescheiden zijn om de integriteit van het systeem te garanderen.</p>



<ul class="wp-block-list">
<li>De <strong>infrastructure operator</strong> beheert de hardware en infrastructuur (computing, storage, network) en onderhoudt de beveiligde runtime-omgevingen. Hij beheert de firmware-updates en de toewijzing van middelen, maar zou geen toegang mogen hebben tot de data of de uitgevoerde workloads.</li>



<li>De <strong>orchestration operator</strong>, die dezelfde kan zijn als de infrastructure operator, is verantwoordelijk voor het beheer van de serverclusters en de implementatie van de workloads. Hij configureert de benodigde middelen voor de toepassing en houdt toezicht op de bijbehorende diensten (logging, monitoring). Ook zijn rechten zouden strikt beperkt moeten blijven om elke vorm van inbreuk op de toepassing te voorkomen, terwijl de noodzakelijke orchestratie wel mogelijk blijft.</li>



<li><strong>De workload provider </strong>ontwerpt de specificaties van de toepassingen en kiest de juiste container images, waarbij hij de conformiteit en integriteit ervan garandeert. Hij moet aan de data owners (zie hieronder) laten zien dat de gebruikte code veilig is en de privacy respecteert, zonder direct toegang te geven tot gevoelige data.</li>



<li><strong>De container image provider</strong> bouwt, ondertekent en versleutelt de container images, zodat hun herkomst en veiligheid gegarandeerd zijn. Hij verstrekt de verificatie en decryptiesleutel. Zijn samenwerking met de toepassingsprovider is cruciaal om de softwareketen te garanderen en ervoor te zorgen dat de geïmplementeerde code precies dezelfde is als de geauditeerde code.</li>



<li>Ten slotte bezit <strong>de data owner</strong> de data die door de toepassingen worden verwerkt en eist hij de vertrouwelijkheid en integriteit ervan. Hij vertrouwt op de code van de toepassing (de container) en de cryptografische bewijzen die door de microprocessor worden geleverd, waardoor infrastructure en orchestration operators buiten zijn vertrouwensbereik vallen. Hij kan extra controles opleggen om ervoor te zorgen dat zijn data niet zichtbaar zijn voor of gemanipuleerd worden door onbevoegde personen.</li>
</ul>



<p>De relaties tussen deze spelers brengen specifieke uitdagingen met zich mee: de data owner moet bijvoorbeeld kunnen vertrouwen op de code van de containers (geleverd door de workload provider) om zijn data te verwerken, terwijl hij deze tegelijkertijd moet beschermen tegen andere spelers, zoals de infrastructure of orchestration operator. Met name de beheerders van deze operators mogen in geen geval toegang hebben tot de data die door de containers worden verwerkt.</p>



<h1 class="wp-block-heading">Betrouwbare runtime-omgeving</h1>



<p>Met TEE&#8217;s kan een technische barrière worden gecreëerd die het vertrouwen van de data owner in de toepassingscontainer versterkt. We hebben al uitvoerig uitgelegd hoe ze werken en wat hun voor- en nadelen zijn in een technisch rapport [<a href="#ref6">6</a>] en blogposts [<a href="#ref7">7</a>], [8]. Hier gaan we even de belangrijkste punten herhalen alvorens we de technologische keuzes voor een implementatie op onze onderzoeksinfrastructuur voorstellen.</p>



<p>Het goed functioneren van TEE&#8217;s hangt af van de hardware. Sommige moderne microprocessors maken het mogelijk om een deel van het RAM-geheugen dat is toegewezen aan een specifieke virtuele machine (VM) te reserveren en te versleutelen. Zo zal een beheerder van de hostmachine, zelfs met de hoogste privileges, alleen versleutelde data zien als hij dit geheugengebied probeert te inspecteren. Hoewel er aanvallen via side-channels bestaan (bijv. [<a href="#ref9">9</a>]), vereisen deze vanwege hun complexiteit doorgaans langdurige fysieke toegang en de toevoeging van kwaadaardige hardwarecomponenten, waardoor ze in de praktijk uiterst moeilijk uit te voeren zijn.</p>



<p>Opdat de data owner er zeker van kan zijn dat zijn toepassing in een veilige omgeving draait, gebruikt hij het <a href="https://www.smalsresearch.be/introduction-a-l-informatique-confidentielle/#Attestation">certificeringsmechanisme</a>. Dit proces genereert een cryptografische handtekening van de inhoud van het geheugen van de VM op het moment dat deze wordt opgestart. Deze handtekening wordt gecertificeerd door de fabrikant van de microprocessor.</p>



<p>Dit proces heeft zijn beperkingen, vooral als de infrastructure operator een buitenlandse onderneming is (bijvoorbeeld Amazon AWS, Google Cloud of Microsoft Azure) die zijn eigen libraries in de VM oplegt om bijvoorbeeld de juiste hardware-abstractielaag te bieden.</p>



<p>Dit heeft ons ertoe aangezet om dit soort hardware op onze eigen infrastructuur binnen het onderzoekslabo te testen, in afwachting van de mogelijkheid om dit op een dag op <a href="https://www.gcloud.belgium.be/">G-Cloud</a> toe te passen. Het voordeel hiervan is dat een klant van SMALS een toepassingscontainer op een veilige manier kan gebruiken, zonder dat een beheerder van SMALS toegang heeft tot de inhoud van de container.</p>



<p>Maar het nut van TEE&#8217;s gaat verder dan alleen bescherming tegen beheerders. Het opent de deur naar andere toepassingen.</p>



<h1 class="wp-block-heading">Use case</h1>



<p>Een eerste voorbeeld is te vinden in de Europese infrastructuur voor <a href="https://health.ec.europa.eu/ehealth-digital-health-and-care/digital-health-and-care/electronic-cross-border-health-services_nl">digitale gezondheidsdiensten (eHDSI)</a>. Daar kunnen zorgverleners in het land waar de behandeling plaatsvindt de relevante gezondheidsdata van de patiënt opvragen in het land waar de patiënt is aangesloten. Technisch gezien wordt de aanvraag via de gateway van het nationale contactpunt voor gezondheidszorg (NCPeH) van het land waar de onverwachte gezondheidsgebeurtenis plaatsvindt, doorgestuurd naar het land waar de patiënt is aangesloten. De gevraagde info moet dan worden opgehaald uit de nationale infrastructuur van het land van aansluiting, vertaald naar het Engels en getranscodeerd (de gezondheidsdata worden omgezet van het nationale coderingssysteem naar het algemeen aanvaarde coderingssysteem, bijvoorbeeld van het <a href="https://www.hl7.org.uk/standards/hl7-standards/fhir/">FHIR</a>&#8211; of <a href="https://www.ehealth.fgov.be/standards/kmehr/en">KMEHR</a>-formaat naar <a href="https://www.hl7.org.uk/standards/hl7-standards/cda-clinical-document-architecture/">CDA</a>), en vervolgens teruggestuurd en gepresenteerd worden aan de zorgverlener in het land van behandeling. Vanwege het gevoelige karakter van de data moeten deze van begin tot eind worden versleuteld, vanaf de gegevensbron op de infrastructuur van het land van aansluiting tot aan de zorgverlener in het land van behandeling. In de praktijk is dit nog niet mogelijk vanwege de grote verschillen tussen de Europese landen. Het zou echter op zijn minst mogelijk moeten zijn om te garanderen dat de data versleuteld en ontoegankelijk blijven voor alle gebruikers of beheerders tussen de bron van de data en de uitgang van de NCPeH-gateway. Een mogelijkheid is dan om TEE&#8217;s te gebruiken voor het vertalen en transcoderen van de data.</p>



<p>Een ander voorbeeld van het gebruik van TEE&#8217;s is de beveiligde samenwerking tussen entiteiten die hun ruwe data niet willen delen. In de onderwijs- en werkgelegenheidssector heeft een experiment van Bogdanov <em>et al.</em> in Estland [<a href="#ref10">10</a>] de kracht van confidential computertechnieken aangetoond. De auteurs van deze studie wilden achterhalen of werken naast een hogere opleiding ertoe leidt dat je je diploma niet op tijd behaalt – een vraag die vooral belangrijk is voor de sector van de informatie- en communicatietechnologie (ICT) in Estland. Om deze probleemstelling te beantwoorden zonder de privacy van persoonlijke data in gevaar te brengen, hebben de onderzoekers de onderwijsregisters van het ministerie van Onderwijs en Onderzoek gecombineerd met de data van de belastingdienst, dankzij een speciale techniek van confidential computing. Maar een simpelere variant met een TEE zou net zo goed hebben gewerkt voor de analyse, terwijl de fiscale vertrouwelijkheid en databescherming gewaarborgd bleven.</p>



<h1 class="wp-block-heading">CoCo</h1>



<p>Om TEE&#8217;s te gebruiken in onze eigen onderzoeksinfrastructuur bestaan er verschillende softwareoplossingen. We hebben gekozen voor het project &#8220;<a href="https://confidentialcontainers.org/">Confidential Containers (CoCo)</a>&#8220;, waarvan de broncode vrij toegankelijk is. Dit project zorgt voor een goede isolatie van de toepassingscontainers en ondersteunt het certificeringsmechanisme op een transparante manier, terwijl de flexibiliteit van de implementatie en de compatibiliteit met het <a href="https://kubernetes.io/">Kubernetes</a>-platform waarop het is gebaseerd, behouden blijven. Elke Kubernetes-pod is geïsoleerd in een zeer lichte Confidential Virtual Machine, om te garanderen dat alleen geautoriseerde applicaties toegang hebben tot gevoelige gegevens.</p>



<p>CoCo&#8217;s bevatten naast de toepassing zelf enkele noodzakelijke softwarecomponenten. Deze maken het mogelijk om de uit te voeren containerimage te downloaden, de verificatie van de certificering te vergemakkelijken en bepaalde beveiligingsbeleidsregels toe te passen. Hun programmeerinterface is relatief klein, vooral vergeleken met een oplossing waarbij een hele Kubernetes-node in een Confidential Virtual Machine wordt geplaatst. Bovendien is de image van de guest-VM statisch en generiek voor alle workloads en zelfs platforms, waardoor het eenvoudiger is om veiligheidsgaranties te bieden. Tegelijkertijd is het makkelijk om dingen te delen tussen containers in dezelfde Kubernetes-pod. De naamruimte van het netwerk van de pod blijft bijvoorbeeld binnen de confidential VM, waardoor de containers daarin zonder extra kosten vertrouwelijk met elkaar kunnen communiceren.</p>



<p>CoCo is gebaseerd op <a href="https://katacontainers.io/">Kata</a>-containers, een ander open source-project, waarmee Kubernetes-pods kunnen worden uitgevoerd binnen zeer lichte Confidential Virtual Machines (zie <a href="#Figuur-1">Figuur 1</a>). CoCo voegt echter twee cruciale componenten toe om vertrouwelijkheid en veiligheid te garanderen (zie <a href="#Figuur-2">Figuur 2</a>).</p>



<ul class="wp-block-list">
<li>De eerste heeft te maken met het <strong>ophalen van containerimages</strong>: deze worden meestal gedownload door de Kubernetes-hoofdnode met behulp van een Container Runtime Interface (CRI) zoals “containerd”, waardoor de images via het bestandssysteem zichtbaar worden voor de hostmachine. Met CoCo worden de images binnen de Confidential Virtual Machine ontsleuteld en uitgepakt, vandaar de noodzaak van de bovengenoemde componenten.</li>



<li>Het tweede onderdeel is het <strong>certificaat</strong>, dat, zoals we al hebben gezien, essentieel is voor het opzetten van een betrouwbare uitvoeringsomgeving. Om bijvoorbeeld een image te ontsleutelen, dient de guest de geheime ontsleutelingssleutel te kunnen verkrijgen, maar deze wordt alleen verstrekt als de guest zijn authenticiteit kan aantonen. Dit is de rol van twee componenten die steunen op een zogenaamd “<em><a href="https://github.com/confidential-containers/trustee">Trustee</a></em>”-systeem, dat buiten de virtuele machine staat en uit twee diensten bestaat: een certificeringsdienst om de vertrouwde runtime te valideren en een key mediation-dienst om de geheime middelen te leveren die de virtuele machine en de toepassing nodig hebben.</li>
</ul>



<figure class="wp-block-image aligncenter size-full is-resized" id="Figuur-1"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture1-Voorbeeld-architectuur.svg"><img decoding="async" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture1-Voorbeeld-architectuur.svg" alt="" class="wp-image-26516" style="width:600px"/></a><figcaption class="wp-element-caption">Figuur 1 &#8211; Voorbeeld van een architectuur met twee Kubernetes-nodes en lichte Kata Confidential Virtual Machines, die zelf weer Kubernetes-pods bevatten. Het aan elke virtuele machine toegewezen geheugen wordt direct versleuteld door de microprocessor van node 2. Dit zorgt ervoor dat elke pod niet alleen sterk geïsoleerd is van de andere, maar ook van de kernel van de hostmachine.</figcaption></figure>



<p>CoCo levert dus de basis voor het bouwen van confidential toepassingscontainers door het mogelijk te maken deze containers binnen confidential virtuel machines uit te voeren, waarbij de geëncrypteerde en ondertekende images van de containers, de verzegelde geheimen en andere kenmerken worden beheerd. Elke container of groep containers van dezelfde toepassing kan worden toegewezen aan een confidential virtuele machine, waarbij niet alleen de werklast wordt meegenomen, maar ook processen waarmee de toepassing bepaalde beveiligingsdiensten kan aanroepen. </p>



<figure class="wp-block-image aligncenter size-full is-resized" id="Figuur-2"><a href="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture2-CoCo-schematische-weergave.svg"><img decoding="async" src="https://www.smalsresearch.be/wp-content/uploads/2026/03/Picture2-CoCo-schematische-weergave.svg" alt="" class="wp-image-26518" style="width:600px"/></a><figcaption class="wp-element-caption">Figuur 2 &#8211; Schematische weergave van een CoCo en zijn omgeving. Door het kubelet-commando te gebruiken om de implementatie van een CoCo te starten, wordt een lichte VM gemaakt met verschillende basisagenten erin. Eén agent zorgt ervoor dat de (versleutelde en ondertekende) image van de app-container wordt gedownload uit een register. De andere zorgen ervoor dat de virtuele machine zich kan authenticeren en de nodige sleutels kan ophalen om de image te ontsleutelen en de handtekening te verifiëren, voordat de container wordt gestart. Gebaseerd op <a href="https://github.com/confidential-containers/confidential-containers/blob/main/images/coco-threat-model.png">dit figuur</a>.</figcaption></figure>



<p>Alles buiten de confidential VM op de host wordt als onbetrouwbaar beschouwd, inclusief de kubelet-tool, de runtime-interface van de containers en de kernel van het besturingssysteem van de host. De uitwisseling van informatie tussen vertrouwde en niet-vertrouwde contexten wordt streng gecontroleerd, met name via dynamische en configureerbare beveiligingsbeleidsregels. Ten slotte wordt de Kubernetes-orkestratie zelf als niet-vertrouwd beschouwd, waardoor de garanties met betrekking tot de planning of de volgorde van uitvoering van de workloads beperkt zijn, met uitzondering van de implementatie ervan in een geauthenticeerde enclave.</p>



<h1 class="wp-block-heading">Conclusie</h1>



<p>Confidential containers maken deel uit van een algemene beveiligingsaanpak, waarbij certificering, verificatie van images en best practices in de softwaretoeleveringsketen worden gecombineerd. Ze maken het mogelijk om use cases eenvoudiger te verwerken dan geavanceerde cryptografie (<em>confidential collaboration, private set intersection, </em>geavanceerde pseudonimisering, enz.). Puristen kunnen natuurlijk aanvoeren dat een oplossing op basis van confidential containers minder veilig is, maar in de praktijk zal deze waarschijnlijk volstaan in een on-premise omgeving, des te meer omdat het veel aspecten vereenvoudigt zodra het eenmaal is geïmplementeerd.</p>



<p>In de volgende blogpost gaan we dieper in op de installatie en het gebruik van confidential CoCo&#8217;s.</p>



<h1 class="wp-block-heading">Referenties</h1>



<p id="ref1">[<a href="https://ref1">1</a>]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C. Bômont, “Strategic Brief no.70 &#8211; 2024 &#8211; Extension of the FISA Law European ‘digital sovereignty’ far from American concerns &#8211; IRSEM”, Institut de Recherche Stratégique de l’Ecole Militaire. Geraadpleegd: 9 februari 2026. [Online]. Beschikbaar op: <a href="https://www.irsem.fr/en/strategic-brief-no-70-2024">https://www.irsem.fr/en/strategic-brief-no-70-2024</a></p>



<p id="ref2">[2]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D. Michels, “Europeans, forget the US Cloud Act… worry about FISA instead (!)”. Geraadpleegd: 1 juli 2025. [Online]. Beschikbaar op: <a href="https://www.linkedin.com/pulse/europeans-forget-us-cloud-act-worry-fisa-instead-dave-michels-anjze">https://www.linkedin.com/pulse/europeans-forget-us-cloud-act-worry-fisa-instead-dave-michels-anjze</a></p>



<p id="ref3">[3]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Paul Kunert, “Microsoft exec admits it ‘cannot guarantee’ data sovereignty”. Geraadpleegd: 9 februari 2026. [Online]. Beschikbaar op: <a href="https://www.theregister.com/2025/07/25/microsoft_admits_it_cannot_guarantee/">https://www.theregister.com/2025/07/25/microsoft_admits_it_cannot_guarantee/</a></p>



<p id="ref4">[4]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; M. Rochefort, “Microsoft face au Sénat : l’aveu qui fait vaciller la souveraineté numérique française”, clubic.com. Geraadpleegd: 9 februari 2026. [Online]. Beschikbaar op: <a href="https://www.clubic.com/actualite-573438-microsoft-face-au-senat-l-aveu-qui-fait-vaciller-la-souverainete-numerique-francaise.html">https://www.clubic.com/actualite-573438-microsoft-face-au-senat-l-aveu-qui-fait-vaciller-la-souverainete-numerique-francaise.html</a></p>



<p id="ref5">[5]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D. Deridder, “Understanding Sovereignty: Who Rules your Cloud?”, Dirk Deridder. Geraadpleegd: 1 juli 2025. [Online]. Beschikbaar op: <a href="https://dirkderidder.wordpress.com/2025/03/13/understanding-sovereignty-who-rules-your-cloud/">https://dirkderidder.wordpress.com/2025/03/13/understanding-sovereignty-who-rules-your-cloud/</a></p>



<p id="ref6">[6]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; F. A. P. Petitcolas, “Informatique confidentielle &#8211; État de l’art”, Smals Research, jul. 2023. [Online]. Beschikbaar op: <a href="https://www.smalsresearch.be/publications/document?docid=269">https://www.smalsresearch.be/publications/document?docid=269</a></p>



<p id="ref7">[7]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; F. A. P. Petitcolas, “Introduction à l’informatique confidentielle”, Smals Research. Geraadpleegd: 9 januari 2026. [Online]. Beschikbaar op: <a href="https://www.smalsresearch.be/introduction-a-l-informatique-confidentielle/">https://www.smalsresearch.be/introduction-a-l-informatique-confidentielle/</a></p>



<p id="ref8">[8]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; F. A. P. Petitcolas, “Outils pour l’informatique confidentielle”, Smals Research. Geraadpleegd: 9 januari 2026. [Online]. Beschikbaar op: <a href="https://www.smalsresearch.be/outils-pour-linformatique-confidentielle/">https://www.smalsresearch.be/outils-pour-linformatique-confidentielle/</a></p>



<p id="ref9">[9]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; J. De Meulemeester, D. Oswald, I. Verbauwhede, en J. V. Bulck, “Battering RAM: Low-cost interposer attacks on confidential computing via dynamic memory aliasing”, gepresenteerd bij 47th IEEE Symposium on Security and Privacy (S&amp;P), mei 2026.</p>



<p id="ref10">[10]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D. Bogdanov, L. Kamm, B. Kubo, R. Rebane, V. Sokk, en R. Talviste, “Students and taxes: a Privacy-preserving study using secure computation”, <em>Proc. </em><em>Priv. Enhancing Technol.</em>, vol. 2016, nr. 3, pp. 117-135, jul. 2016, doi: 10.1515/popets-2016-0019.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>De performance van LLM’s: Een vergelijkende analyse tussen Frans en Nederlands</title>
		<link>https://www.smalsresearch.be/de-performance-van-llms-een-vergelijkende-analyse-tussen-frans-en-nederlands/</link>
		
		<dc:creator><![CDATA[Katy Fokou]]></dc:creator>
		<pubDate>Wed, 04 Mar 2026 15:27:00 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[Artificial intelligence]]></category>
		<category><![CDATA[chatbot]]></category>
		<guid isPermaLink="false">https://www.smalsresearch.be/?p=26548</guid>

					<description><![CDATA[Uit onze evaluatie van een RAG-chatbot blijkt er een prestatieverschil te bestaan tussen het Frans en het Nederlands, wat wijst op een aanhoudende uitdaging bij het gebruik van meertalige grote taalmodellen (LLM’s). Dit prestatieverschil kan deels worden verklaard door de beschikbaarheid van de middelen die worden gebruikt om deze modellen te trainen, maar er kunnen ook andere factoren meespelen.]]></description>
										<content:encoded><![CDATA[
<p><a href="https://www.smalsresearch.be/performance-des-llm-analyse-comparative-entre-le-francais-et-le-neerlandais/" data-type="link" data-id="https://www.smalsresearch.be/performance-des-llm-analyse-comparative-entre-le-francais-et-le-neerlandais/">Version française</a></p>



<p>Het opmerkelijke meertalige potentieel van grote taalmodellen (LLM’s) heeft bijgedragen aan de brede verspreiding en integratie ervan binnen AI-gebaseerde toepassingen. Er bestaan echter prestatieverschillen tussen het Engels en andere talen, met name talen met beperkte middelen.</p>



<p>Bij de evaluatie van een door ons ontwikkelde <a href="https://www.smalsresearch.be/rag-in-practice-webinar-by-smals-research/">RAG-chatbot</a> stelden we een duidelijk verschil vast in de kwaliteit van de antwoorden, afhankelijk van de gebruikte taal. De chatbot leverde namelijk betere antwoorden in het Frans dan in het Nederlands. De in het Frans gegenereerde antwoorden waren vlotter en betrouwbaarder ten opzichte van de door de gebruiker gevraagde informatie. De antwoorden in het Nederlands waren over het algemeen minder relevant. Deze resultaten wijzen op een cruciale uitdaging bij de ontwikkeling van LLM&#8217;s die door chatbots worden gebruikt: hoewel deze indrukwekkende meertalige capaciteiten hebben, vertonen de huidige modellen vaak een uitgesproken voorkeur voor talen met veel middelen, zoals het Engels.</p>



<p>In deze blogpost beschrijven we de resultaten van ons onderzoek naar de door ons vastgestelde taalkloof en tonen we de bevindingen van ons onderzoek.</p>



<h1 class="wp-block-heading">Prestatieverschil tussen het Engels en de andere talen: oorzaken en factoren</h1>



<p>Verschillende factoren dragen bij aan de taalvoorkeur voor het Engels. Deze omvatten:</p>



<ul class="wp-block-list">
<li><strong>Onevenwichtige datasets:</strong> het trainingsproces van grote taalmodellen is gebaseerd op omvangrijke tekstcorpora, maar deze worden sterk gedomineerd door het Engels, gevolgd door talen met veel taalkundige middelen zoals het Chinees, het Frans en het Spaans. Daarentegen zijn de data in talen met beperkte middelen vaak van mindere kwaliteit vanwege het beperkte aantal bronnen. Dit onevenwicht in de data leidt tot slechte prestaties in andere talen dan het Engels, met hogere foutpercentages en hallucinaties tot gevolg. Om dit probleem op te lossen, maken modelontwikkelaars gebruik van een techniek die “interlinguïstische overdracht” genoemd wordt. Hierbij verbetert een model zijn prestaties in minder goed uitgeruste talen door universele of gedeelde taalkundige patronen af te leiden uit talen met veel middelen. Hoewel het exacte percentage Engelstalige data in propriëtaire modellen niet openbaar bekend is, is 93% van de data die worden gebruikt om GPT-3 te trainen in het Engels. Leveranciers van grote taalmodellen, zoals OpenAI en Google, maken vaak gebruik van het Common Crawl-webgegevensarchief, dat zelf wordt gekenmerkt door een dataset waarin het Engels overheerst (44% in het Engels, 4% in het Frans, 2% in het Nederlands). Deze vertekening wordt nog versterkt in gespecialiseerde domeinen zoals financiën en gezondheidszorg, waar hoogwaardige data bijzonder schaars is. Het is belangrijk op te merken dat het Nederlands wordt beschouwd als een taal met hoge middelen in het domein van automatische natuurlijke taalverwerking (NLP), hoewel het over minder middelen beschikt dan het Frans of het Engels.</li>



<li><strong>Morfologie en tokenisatie:</strong> modelarchitecturen zijn vaak geoptimaliseerd voor het Engels. Tokenisatieprocessen kunnen ingewikkeld zijn voor talen die niet met het Latijns alfabet worden geschreven, zoals het Chinees of het Japans, alsook voor talen met een gemiddelde tot hoge morfologische complexiteit, zoals het Nederlands. Engelse tokenizers kunnen het moeilijk hebben met het verwerken van samengestelde woorden (de combinatie van meerdere zelfstandige naamwoorden in een woord), wat kan leiden tot grammaticaal foute resultaten wanneer modellen tekst genereren.</li>
</ul>



<p>Zeer weinig studies hebben de prestaties geanalyseerd van grote taalmodellen in het Frans en het Nederlands. Een onderzoek naar de taalkundige kwaliteit van LLM’s in deze twee talen bracht aan het licht dat de prestaties algemeen beter waren in het Frans dan in het Nederlands, in het bijzonder bij taken waarbij tekst moest worden gegenereerd [1]. Een ander onderzoek rapporteerde betere prestaties van LLM’s in het Engels in vergelijking met het Nederlands bij een vraag-antwoordtaak [2].</p>



<p>In de industrie blijven er grote uitdagingen bestaan met betrekking tot de toepassing van grote taalmodellen op niet-Engelse technische domeinen, met name in de medische en financiële sector. De huidige implementaties vereisen vaak een verfijning van de vooraf getrainde modellen zoals Mistral en Llama om bevredigende prestaties te bereiken.</p>



<p>Een andere bekende uitdaging bij de toepassing van AI-modellen in de Nederlandse taalomgeving is spraakherkenning. Dit is grotendeels een gevolg van de grote variatie in regionale accenten. Onze experimenten met het transcriberen van opnames van Teams-vergaderingen hebben aangetoond dat de Franse transcripties systematisch van betere kwaliteit waren dan de Nederlandse. Gespecialiseerde tools zoals <a href="https://www.sembly.ai/">Sembly</a> leveren echter acceptabele transcriptieresultaten in het Nederlands.</p>



<h1 class="wp-block-heading">Vergelijkende analyse van de prestaties van het Nederlands en het Frans in een chatbot</h1>



<p>Er is een vergelijkende analyse van de prestaties uitgevoerd op een chatbot die is ontwikkeld om vragen van burgers te beantwoorden. Voor de eerste evaluatie van de chatbot hebben we een reeks vragen gebruikt die door experts zijn opgesteld. Deze vragen werden in het Frans en het Nederlands aan de chatbot voorgelegd, waarna de antwoorden door dezelfde expert werden beoordeeld en door twee andere personen werden gecontroleerd. Uit de eerste evaluatie blijkt een aanzienlijk verschil in prestaties tussen de twee talen: de chatbot behaalde een nauwkeurigheid van 95% in het Frans, tegenover 82% in het Nederlands.</p>



<p>Na de implementatie van de chatbot in een productieomgeving werd een tweede evaluatiefase uitgevoerd op basis van vragen die door gebruikers waren ingediend en in een database waren opgeslagen. We merkten opnieuw een verschil in prestaties: 82% nauwkeurigheid in het Frans en 69% in het Nederlands.</p>



<p>Verschillende factoren kunnen bijdragen aan deze waargenomen verschillen, waaronder:</p>



<ul class="wp-block-list">
<li>de vooringenomenheid van de beoordelaars – beoordelaars zijn minder of meer streng in hun beoordelingen;</li>



<li>de variatie in het soort vragen (dubbelzinnig, slecht geformuleerd, niet ter zake) – dezelfde vragen werden niet systematisch in beide talen beoordeeld;</li>



<li>het kwaliteitsverschil bij het ophalen van de bronnen (<em>retrieval</em>) – er zijn verschillen tussen de talen in de data-bronnen die worden opgehaald om de generatie te voeden;</li>



<li>de intrinsieke capaciteiten van het generatieve model (GPT-4o) in beide talen.</li>
</ul>



<p>Er was dus aanvullend onderzoek nodig om de waargenomen verschillen in het Frans en het Nederlands volledig te begrijpen en deze factoren te verminderen.</p>



<h3 class="wp-block-heading"><strong>Test</strong></h3>



<p>Om de prestaties van LLM&#8217;s in zowel het Frans als het Nederlands grondig te evalueren, werd een experiment uitgevoerd met de chatbot. We selecteerden een aantal vragen waarvan de eerdere antwoorden van LLM&#8217;s als onjuist waren beoordeeld, waarbij we ervoor zorgden dat de vragen niet te complex of te simplistisch waren. Het was van cruciaal belang dat elke vraag van een gebruiker tussen het Frans en het Nederlands werd vertaald om een directe vergelijking te vergemakkelijken. Bij het evaluatieproces waren twee onafhankelijke evaluatoren betrokken, een vakexpert en een technisch expert, om vooringenomenheid te beperken en een robuuste evaluatie te garanderen. De evaluatoren beoordeelden de nauwkeurigheid, relevantie en vlotheid van de gegenereerde antwoorden. Daarnaast werden ook andere modellen dan GPT-4o getest.</p>



<p>Naast de tests in het Nederlands en het Frans hebben we ook een test uitgevoerd waarbij vragen in het Nederlands naar het Engels werden vertaald. De antwoorden werden in het Engels gegenereerd en vervolgens opnieuw naar het Nederlands vertaald.</p>



<h3 class="wp-block-heading"><strong>Resultaten</strong></h3>



<p><em>Vraag in het Nederlands, antwoord in het Engels</em></p>



<p>Het experiment waarbij vragen in het Nederlands naar het Engels werden vertaald en hierna de antwoorden naar het Nederlands werden vertaald leverde een genuanceerd resultaat. Hoewel de vertaling van Nederlandstalige vragen naar het Engels leidde tot ietwat betere antwoorden, van 67% naar 73%, verslechterde de kwaliteit van de antwoorden bij het omgekeerde proces, namelijk het vertalen van de gegenereerde Engelse antwoorden naar het Nederlands.</p>



<p><em>Nauwkeurigheid van Franse antwoorden versus nauwkeurigheid van Nederlands antwoorden</em></p>



<p>Tijdens ons experiment hebben we de antwoorden gegenereerd op basis van Nederlandstalige vragen vergeleken met hun Franse equivalenten in verschillende tekstreeksen. We hebben vastgesteld dat de samenstelling van deze reeksen een invloed had op de evaluatie van het model. De scores varieerden namelijk van set tot set voor elk model en elke taal, en de prestatieverschillen tussen de talen kwamen niet altijd tot uiting. Dit onderstreept het belang van het selectieproces van de testvragen: voor onze laatste test hebben we een evenwichtige testset samengesteld met voorbeelden van vragen die door gebruikers in beide talen zijn ingediend en vragen die door domeinexperts zijn opgesteld. In tegenstelling tot wat aanvankelijk werd waargenomen, laten de onderstaande resultaten slechts een klein verschil in nauwkeurigheid zien tussen het Frans en het Nederlands <strong>voor onze use case</strong>.</p>



<p>Tabel 1. Resultaten van de eindevaluatie van de chatbot.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>&nbsp;</td><td><strong>Maximale score</strong><strong></strong></td><td><strong>GPT-5 (OpenAI)</strong><strong></strong></td><td><strong>Gemini (Google)</strong><strong></strong></td><td><strong>o3 (OpenAI)</strong><strong></strong></td><td><strong>Beste score (Gemini)</strong><strong></strong></td></tr><tr><td><strong>FR</strong><strong></strong></td><td>60</td><td>44</td><td><strong>46</strong><strong></strong></td><td>32</td><td><strong>77%</strong><strong></strong></td></tr><tr><td><strong>NL</strong><strong></strong></td><td>60</td><td>38</td><td><strong>43</strong><strong></strong></td><td>32</td><td><strong>72%</strong><strong></strong></td></tr></tbody></table></figure>



<p><em>Opmerking: slecht geformuleerde vragen in het Frans of Nederlands werden uit de testset verwijderd omdat ze moeilijk nauwkeurig in de andere taal te vertalen bleken.</em><em></em></p>



<p><em>Vergelijking van de LLM&#8217;s</em></p>



<p>GPT-5 presteerde goed op het vlak van nauwkeurigheid en beknoptheid. Het vertoonde echter een groter verschil in nauwkeurigheid tussen het Frans en het Nederlands dan de andere modellen. Gemini presteerde weliswaar beter in zowel het Frans als het Nederlands, maar genereerde aanzienlijk langere antwoorden, wat leidde tot een hoger tokengebruik. We hebben ook vastgesteld dat Claude Sonnet, met een vergelijkbare nauwkeurigheid als Gemini, soms Engelse termen invoegde in het gegenereerde antwoord, en dit vaker in het Nederlands dan in het Frans. Na evaluatie concludeerden de experts op dit gebied dat Gemini het meest geschikte model was voor hun use case.</p>



<p><em>Effect van de retrieval</em></p>



<p>Het proces van <a href="https://www.smalsresearch.be/betere-zoekresultaten-met-vector-databases/">retrieval</a> bestaat erin om relevante tekstfragmenten te extraheren om een vraag te beantwoorden vanuit de vector database, afhankelijk van de gelijkenis tussen de vraag en deze fragmenten. Deze gelijkenis wordt berekend met behulp van vectorrepresentaties van de teksten, gegenereerd door een <em>embeddingmodel</em>. We hebben vragen geanalyseerd die aanvankelijk betere resultaten opleverden in het Frans dan in het Nederlands en hebben vastgesteld dat ongeveer 50% van de opgehaalde informatie (context) in beide talen voorkwam. Om de impact van de resterende 50% afwijkende informatie te evalueren, hebben we het model (Gemini) aan identieke contexten onderworpen om zowel Franstalige als Nederlandstalige antwoorden te genereren. Ondanks het gebruik van deze identieke contexten bleef het model prestatieverschillen vertonen tussen het Frans en het Nederlands. Het retrievalproces lijkt dus een beperkte invloed te hebben op het waargenomen prestatieverschil tussen de twee talen.</p>



<h1 class="wp-block-heading">Conclusie en aanbevelingen</h1>



<p>Het prestatieverschil tussen het Nederlands en het Engels in grote taalmodellen is een vaststaand feit, dat geworteld is in de overweldigende dominantie van het Engels in de trainingscorpora. Dit verschil wordt nog versterkt door de specifieke morfologie van het Nederlands. Ter vergelijking: als LLM&#8217;s over het algemeen betere resultaten opleveren in het Frans, is dat te danken aan een betere vertegenwoordiging van de taal in de trainingscorpora.</p>



<p>Ons experiment heeft waardevolle informatie opgeleverd over de prestaties van LLM&#8217;s in een RAG-toepassing (Retrieval Augmented Generation) in het Nederlands en het Frans. Hoewel we aanvankelijk een significant verschil in nauwkeurigheid tussen de antwoorden in het Nederlands en de antwoorden in het Frans constateerden, bleek uit grondig onderzoek dat andere factoren dan de capaciteit van het model de resultaten konden beïnvloeden. Het prestatieverschil is dus minder groot dan we dachten. Bovendien hebben we vastgesteld dat variaties in de samenstelling van de testset kleine schommelingen in de resultaten veroorzaakten. Deze conclusies tonen aan dat de prestaties van LLM&#8217;s zeer gevoelig zijn voor de context en de specifieke formulering van de vragen. We hebben ook een lichte kwaliteitsverbetering&nbsp; van de antwoorden waargenomen bij de Engelse vertaling van Nederlandstalige vragen; dit voordeel werd echter grotendeels tenietgedaan door de daaropvolgende Nederlandse vertaling van deze Engelse antwoorden.</p>



<p>De bovenstaande conclusies gelden voor een chatbot die zorgvuldig opgestelde inhoud in algemene taal gebruikt om vragen te beantwoorden. Ze zijn niet noodzakelijkerwijs van toepassing op andere use cases. Het is daarom essentieel om voor elk geval grondige evaluaties uit te voeren, zeker wanneer men in specifieke domeinen zoals gezondheidszorg, financiën, recht, enzovoort werkt.</p>



<p><strong>Moeten we een eentalig model gebruiken?</strong></p>



<p>We hebben deze vraag niet grondig kunnen onderzoeken. Ons literatuuronderzoek heeft geen overtuigend bewijs opgeleverd dat LLM&#8217;s voor het Nederlands de prestaties verbeteren; integendeel, de aanwezigheid van talen met veel bronnen in meertalige modellen lijkt de prestaties van minder goed bedeelde talen tot op zekere hoogte te verbeteren. Er zijn echter verschillende initiatieven genomen om LLM&#8217;s voor het Nederlands te ontwikkelen. De meest opvallende zijn:</p>



<p>&#8211; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GEITje: model gebaseerd op Mistral 7B en verfijnd voor het Nederlands. Dit model is niet langer beschikbaar vanwege auteursrechtelijke problemen.</p>



<p>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="https://gpt-nl.nl/gpt-nl/">GPT-NL</a>: lopend initiatief, ondersteund door Nederland, om een LLM te ontwikkelen die is aangepast aan de Nederlandse taal en cultuur.</p>



<p>Referenties</p>



<ol class="wp-block-list">
<li><a href="https://aclanthology.org/2024.humeval-1.2/">Exploratory Study on the Impact of English Bias of Generative Large Language Models in Dutch and French</a>&nbsp;(Rigouts Terryn &amp; de Lhoneux, HumEval 2024)</li>



<li><a href="https://documentserver.uhasselt.be/bitstream/1942/46335/1/__TRBWS07_FileUploads_2024%20AM%20Presentations_23064_Presentation-137767_23064_TRBAM-25-02712_2025-02-03-05-58-09.pdf">Performance of Large Language Models in Domain-Specific and Underrepresented Languages: A Case Study on the Transportation Domain and Dutch Language</a> (UHasselt)</li>



<li><a href="https://arxiv.org/pdf/2303.12528">MEGA: Multilingual Evaluation of Generative AI</a> (Ahuja et al., 2023)</li>



<li><a href="https://arxiv.org/html/2410.12835v1">A Dutch Financial Large Language Model</a> (Sander Noels, Jorne De Blaere &amp; Tijl De Bie, 2024)</li>



<li><a href="https://blog.premai.io/multilingual-llms-progress-challenges-and-future-directions/">Multilingual LLMs: Progress, Challenges, and Future Directions</a> (PremAI blogpost)</li>



<li><a href="https://hogent-cads.github.io/blog/posts/vlaamse-spraakherkenning/">https://hogent-cads.github.io/blog/posts/vlaamse-spraakherkenning/</a> (HoGent blogpost)</li>



<li><a href="https://www.smalsresearch.be/rag-in-practice-webinar-by-smals-research/">Webinar Smals Research – Generatieve AI: verder dan de hype | Smals Research</a></li>
</ol>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Made by Smals Research &#8211; Privacyvriendelijk Kruisen van Persoonsgegevens</title>
		<link>https://www.smalsresearch.be/innovatiesmals-privacyvriendelijk-kruisen-van-persoonsgegevevens/</link>
		
		<dc:creator><![CDATA[Kristof Verslype]]></dc:creator>
		<pubDate>Thu, 26 Feb 2026 06:30:00 +0000</pubDate>
				<category><![CDATA[[NL]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[cryptography]]></category>
		<category><![CDATA[Privacy]]></category>
		<category><![CDATA[Privacy by design]]></category>
		<category><![CDATA[privacy-enhancing technologies]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Security]]></category>
		<guid isPermaLink="false">https://staging.smalsresearch.be/?p=26251</guid>

					<description><![CDATA[In samenwerking met internationaal toonaangevende universiteiten werkte Smals aan een prototype om met behulp van geavanceerde cryptografie het pseudonimiseren en kruisen van persoonsgegevens voor secundaire doeleinden aanzienlijk te vereenvoudigen.]]></description>
										<content:encoded><![CDATA[
<p><em>Cet article est aussi disponible&nbsp;en&nbsp;<a href="/innovationsmals-croisement-des-donnees-a-caractere-personnel-dans-le-respect-de-la-vie-privee/">français</a>.</em></p>



<p>Digitale persoonsgegevens vormen <span data-olk-copy-source="MessageBody">binnen een overheidscontext</span> een bron van inzichten die innovatie, welzijn en beleidsvorming ten goede komen. Die persoonsgegevens zijn over heel wat organisaties verspreid; de ene organisatie heeft informatie over kanker, de andere over medicijngebruik en nog een andere bewaart inkomensgegevens. In de praktijk worden geregeld persoonsgegevens afkomstig van verschillende organisaties samengevoegd om op specifieke vragen van onderzoekers en beleidsmakers te kunnen antwoorden.</p>



<p>De huidige processen garanderen dat dit met respect voor de privacy gebeurt. Helaas is het – mede daardoor – ook te vaak een complexe, dure en tijdrovende aangelegenheid. In samenwerking met internationaal toonaangevende universiteiten werkte Smals Research daarom aan een prototype om met behulp van geavanceerde cryptografie deze processen aanzienlijk te vereenvoudigen.</p>



<h1 class="wp-block-heading">Probleemstellig op basis van concrete case</h1>



<p>We vertrokken van een <a href="https://www.ehealth.fgov.be/ehealthplatform/file/cc73d96153bbd5448a56f19d925d05b1379c7f21/5749691d1687866fa0e6852fe4536cb54f2bf4ad/20-020-n042-behandeling-herstellende-multiple-sclerose.pdf">concrete onderzoeksvraag</a>:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Lopen MS-patiënten die medicijnen met de moleculen teriflunomide of alemtuzumab gebruiken een verhoogd risico op kanker in vergelijking met MS-patiënten die met andere medicijnen worden behandeld?</p>
</blockquote>



<p>Om die – op zich eenvoudige – vraag te kunnen beantwoorden moeten medische gegevens over MS-patiënten afkomstig van twee organisaties, met name het <a href="https://kankerregister.org/nl">Belgisch Kankerregister (BCR)</a> en het <a href="https://www.ima-aim.be/">InterMutualistisch Agentschap (IMA)</a> gekruist worden.</p>



<p>Beide organisaties beheren de gegevens onder aparte pseudoniemen voor meer privacy; unieke codes ter vervanging van rijksregisternummers.</p>



<ul class="wp-block-list">
<li>Het BCR beheert gegevens met betrekking tot kanker over mensen die een kankerdiagnose kregen. Het BCR weet niet welke records betrekking hebben op MS-patiënten.</li>



<li>Het IMA kent gegevens m.b.t. voorgeschreven medicijnen en kan de records selecteren van MS-patiënten.</li>
</ul>



<p>De onderzoekers dienen in een beveiligde omgeving (<a href="https://www.european-health-data-space.com/European_Health_Data_Space_Article_50_(Proposal_3.5.2022).html">SPE = Secure Processing Environment</a>) toegang te krijgen tot gegevens afkomstig van het BCR en het IMA, over alle MS-patiënten. Gegevens over dezelfde patiënt maar afkomstig van verschillende bronnen moeten aan elkaar gekoppeld kunnen worden op basis van een uniek pseudoniem dat enkel gebruikt wordt in het kader van die specifieke onderzoeksvraag. Dit wordt geïllustreerd in figuur 1.</p>



<figure class="wp-block-image aligncenter wp-image-24710"><a href="https://staging.smalsresearch.be/wp-content/uploads/2025/12/set.png"><img loading="lazy" decoding="async" width="598" height="154" src="https://staging.smalsresearch.be/wp-content/uploads/2025/12/set.png" alt="" class="wp-image-24710" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/12/set.png 598w, https://www.smalsresearch.be/wp-content/uploads/2025/12/set-300x77.png 300w" sizes="auto, (max-width: 598px) 100vw, 598px" /></a><figcaption class="wp-element-caption">Figuur 1: Links de verzameling van MS-patiënten, rechts de verzameling van burgers die de kankerdiagnose kregen. Enkel gegevens over burgers in de twee groene regio&#8217;s mogen aan de beveiligde omgeving gepseudonimiseerd prijsgegeven worden.&nbsp;</figcaption></figure>



<p>De centrale vraag luidt als volgt:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><em>Hoe kan het BCR <u>enkel </u>records over MS-patiënten aanleveren aan de beveiligde omgeving zonder te weten te komen wie MS heeft of welke records die het beheert betrekking hebben op MS-patiënten?</em></p>
</blockquote>



<p>In een klassieke benadering zal ofwel het BCR te veel informatie naar de beveiligde omgeving sturen – met name gegevens over elke kankerpatiënt – ofwel lekt er informatie naar het BCR – waarbij het BCR te weten komt welke records betrekking hebben op MS-patiënten. Een laatste mogelijkheid is het inschakelen van een vertrouwde centrale partij die weliswaar persoonsgegevens te weten komt, maar vertrouwd wordt daar niets onrechtmatigs mee te doen.</p>



<p>Geen van deze aanpakken is ideaal. Vandaag wordt in binnen- en buitenland ofwel beroep gedaan op – sterk gereguleerde – centrale partijen ofwel is duur en traag maatwerk vereist, waarbij voor elke onderzoeksvraag een nieuwe flow uitgetekend, gevalideerd en uitgevoerd wordt om de privacy maximaal te beschermen.</p>



<p>We geven nog mee dat de onderzoeker doorgaans toegang nodig heeft tot de ruwe data, waardoor oplossingen gebaseerd op <a href="https://www.smalsresearch.be/secure-multiparty-computation-collectieve-berekeningen-op-verspreide-gevoelige-gegevens/">secure multi-party computation</a> ongeschikt zijn.&nbsp;</p>



<h1 class="wp-block-heading">Ons voorstel tot oplossing</h1>



<p>Laat ons even vertrekken van een fictief scenario waarbij gewerkt wordt met een vertrouwde intermediaire partij en het – voor de eenvoud – IMA en BCR de persoonsgegevens niet onder pseudoniemen beheren, maar onder rijksregisternummers. IMA en BCR sturen beiden alle gegevens die potentieel relevant zijn naar de vertrouwde tussenpartij. </p>



<p>Het BCR stuurt naar de intermediaire partij geïdentificeerde kankergegevens over <em>alle</em> burgers die de kankerdiagnose kregen, wat uiteraard veel meer is dan nodig voor de onderzoeker. De intermediaire partij krijgt ook alle geïdentificeerde medicatiegegevens over MS-patiënten van het IMA en weet op basis daarvan welke door het BCR aangeleverde records betrekking hebben op MS-patiënten en dus relevant zijn in het kader van de onderzoeksvraag. De intermediaire partij voert nu de volgende stappen uit:</p>



<ol class="wp-block-list">
<li>Het verwijdert de niet relevante records, dus de records over alle burgers die de kankerdiagnose kregen maar geen MS hebben.</li>



<li>Het voegt records over dezelfde burgers samen en vervangt in de samengevoegde records de rijksregisternummers door unieke pseudoniemen</li>



<li>Het stuurt het resultaat &#8211; enkel samengevoegde records &#8211; naar de <a href="https://www.european-health-data-space.com/European_Health_Data_Space_Article_50_(Proposal_3.5.2022).html">beveiligde omgeving</a>.</li>



<li>Het verwijdert alle ontvangen en afgeleide gegevens.</li>
</ol>



<p>In dit scenario zijn er geen onbedoelde datalekken naar de databronnen en ontvangt de beveiligde omgeving enkel de minimaal noodzakelijke, gepseudonimiseerde persoonsgegevens.</p>



<p>Ons prototype doet exact dit, maar dan <strong>zonder de vertrouwde partij</strong>. De rol van de vertrouwde partij wordt gedistribueerd: <em>Data holders</em> &#8211; in dit geval het IMA en het BCR &#8211; en een <em>data collector</em> &#8211; in dit geval de beveiligde omgeving &#8211; interageren met elkaar om samen de rol van de vertrouwde partij over te nemen. Daarbij worden de veiligheidseigenschappen uit de vorige paragraaf behouden; er lekt dus niet onbedoeld informatie naar de data holders en de data collector komt enkel de minimaal noodzakelijke gepseudonimiseerde gegevens te weten. De oplossing blijft niettemin praktisch en efficiënt. Dit alles is mogelijk dankzij geavanceerde cryptografie.</p>



<p>We schreven eerder dat het IMA en het BCR de data bewaren onder pseudoniemen. Er bestaan procedures om die op een gecontroleerde wijze om te zetten in rijksregisternummers. De partij die data beheert komt daarbij nooit rijksregisternummers te weten en de partij die pseudoniemen kan koppelen aan rijksregisternummers heeft op geen enkel moment toegang tot de eigenlijke persoonsgegevens. Om redenen van eenvoud gaan we er de rest van dit artikel vanuit dat de data holders de data kennen onder rijksregisternummers. Ons concept kan ook op een veilige manier overweg weg met de meer realistische situaties waarbij dit niet het geval is.</p>



<h1 class="wp-block-heading">In de praktijk</h1>



<p><a href="https://www.smalsresearch.be/wp-content/uploads/2025/12/Wilhelm_Wandschneider_-_Lethe_Modell.jpg"><img loading="lazy" decoding="async" width="150" height="106" class="alignright size-medium wp-image-23397" src="https://www.smalsresearch.be/wp-content/uploads/2025/12/Wilhelm_Wandschneider_-_Lethe_Modell.jpg" alt=""></a>Smals Research werkte samen met academische partners het concept uit. Initieel luisterde het naar de naam <em>Oblivious Join</em>, maar in academische context werd het herdoopt naar <em>LetheLink</em>. <a href="https://nl.wikipedia.org/wiki/Lethe_(mythologie)">Lethe</a> (Λήθη) is in de Griekse mythologie de godin van de vergetelheid en een van de vijf rivieren in de onderwereld, waaruit de doden drinken om hun aardse leven te vergeten. Ondanks die vergetelheid &#8211; of beter, gebrek aan kennis &#8211; slagen de interagerende partijen er toch in de noodzakelijke data aan elkaar te linken. Centraal in de ontwikkeling van dit concept stonden gebruiksvriendelijkheid en efficiëntie.</p>



<p>Smals Research heeft een demonstreerbaar prototype uitgewerkt dat alvast een zicht geeft op hoe een enterprise-ready oplossing zou kunnen werken. Het gebruik van het prototype wordt geïllustreerd in figuur 2 en bestaat uit de volgende stappen:</p>



<ol class="wp-block-list">
<li><strong>Creatie JSON-bestand.</strong> Een organisatie die als aanspreekpunt kan dienen (vb, de <a href="https://www.hda.belgium.be/nl">HDA</a> of de <a href="https://www.ksz-bcss.fgov.be/nl">KSZ</a>) krijgt een vraag binnen van een onderzoeker. Wanneer de juridische basis voor deze gegevensverwerking er is, stelt deze organisatie een digitaal ondertekend JSON-bestand op. Dat bestand bevat in een gestructureerde vorm alle informatie om het protocol voor het beveiligd kruisen van de gegevens van de data holders op een correcte manier uit te kunnen voeren: connectiegegevens van de clients van zowel data holders als de data collector, de cryptografische parameters, publieke sleutels, informatie over welke data holder welke data moet aanleveren, etc. In de praktijk zal men vertrekken van templates, van waaruit met een minimale inspanning JSON-bestanden afgeleid kunnen worden.</li>



<li><strong>Distributie JSON-bestand.</strong> Dit JSON-bestand wordt bezorgd aan zowel de data collector als de data holders. Allen verifiëren de digitale handtekening. Alle betrokken partijen weten nu hoe ze het protocol moeten uitvoeren en hoe ze de andere betrokken partijen veilig kunnen contacteren.</li>



<li><strong>Downloaden client.</strong> Indien dit nog niet gebeurd is, downloaden de data collector en data holders de LetheLink client.</li>



<li><strong>Creatie CSV-bestanden.</strong> Op basis van het JSON-bestand genereert elke data holder een CSV-bestand die alle potentieel relevante geïdentificeerde data bevat. In de eerder geschetste use case zou dit voor het SKR alle gevraagde geïdentificeerde informatie bevatten over alle burgers die de kankerdiagnose kregen. De creatie van dit bestand valt buiten de scope van LetheLink. In ons prototype worden enkel CSV-bestanden ondersteund, maar dit kan uitgebreid worden.</li>



<li><strong>Invoer client.</strong> Elke participant geeft het JSON-bestand als invoer aan zijn lokale LetheLink client. De data holders geven daarnaast ook hun lokaal gegenereerde CSV-bestand aan hun client. Data worden in klaar aangeleverd en de client neemt de versleuteling op zich.</li>



<li><strong>Uitvoering protocol.</strong> Het protocol wordt uitgevoerd. Dit resulteert aan de kant van de data collector (SPE) in een CSV bestand dat enkel de gepseudonimiseerde, minimaal noodzakelijke gegevens bevat. &nbsp;</li>
</ol>



<figure class="wp-block-image aligncenter"><a href="https://staging.smalsresearch.be/wp-content/uploads/2025/12/gebruik-1.png"><img loading="lazy" decoding="async" width="1024" height="572" src="https://staging.smalsresearch.be/wp-content/uploads/2025/12/gebruik-1-1024x572.png" alt="" class="wp-image-24742" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/12/gebruik-1-1024x572.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/12/gebruik-1-300x168.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/12/gebruik-1-768x429.png 768w, https://www.smalsresearch.be/wp-content/uploads/2025/12/gebruik-1-1536x858.png 1536w, https://www.smalsresearch.be/wp-content/uploads/2025/12/gebruik-1-2048x1144.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Figuur 2. Overzicht van het gebruik van LetheLink in de praktijk</figcaption></figure>



<p>Het voordeel van deze benadering is de flexibele inzetbaarheid. Er zijn data holders die maar heel af en toe in dergelijke kruisingsprojecten betrokken zijn en niet alle data holders beschikken over evenveel middelen. Dankzij de LetheLink benadering zijn geen grote investeringen of voorbereidingen nodig. De installatie van de client en creatie van de CSV file volstaan.</p>



<p>Figuur 3 geeft een fictief voorbeeld van dergelijke CSV bestanden. Bovenaan staan extracten van CSV bestanden&nbsp; die de – in dit geval drie – data holders elk als invoer aan hun LetheLink client geven. Onderaan de figuur is een extract te zien van het CSV bestand dat de client van de data collector als output genereert als resultaat van de protocoluitvoering. In ons fictieve voorbeeld is de onderzoeker enkel geïnteresseerd in data in de doorsnede; dus in data over de 50 000 MS-patiënten die de kankerdiagnose kregen en een hoog risicoprofiel hebben. De persoon met rijksregisternummer 60.01.05-045.05 behoort tot die groep. De data collector ziet de gecombineerde informatie over deze burger, niet onder dit rijksregisternummer, maar onder het pseudoniem “153807…”.</p>



<figure class="wp-block-image aligncenter"><a href="https://staging.smalsresearch.be/wp-content/uploads/2025/12/fictional_data-1.png"><img loading="lazy" decoding="async" width="1024" height="574" src="https://staging.smalsresearch.be/wp-content/uploads/2025/12/fictional_data-1-1024x574.png" alt="" class="wp-image-24717" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/12/fictional_data-1-1024x574.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/12/fictional_data-1-300x168.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/12/fictional_data-1-768x430.png 768w, https://www.smalsresearch.be/wp-content/uploads/2025/12/fictional_data-1-1536x860.png 1536w, https://www.smalsresearch.be/wp-content/uploads/2025/12/fictional_data-1-2048x1147.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Figuur 3. Fictief voorbeeld met exctracten van drie input CSV bestanden (boven) en het resulterende output bestand (onder)</figcaption></figure>



<h1 class="wp-block-heading">Performantie</h1>



<p>In het kader van de academische samenwerking werd de performantie in meerdere iteraties grondig verbeterd, zowel op het niveau van het algoritme, als op het niveau van de implementatie. De voornaamste testresultaten zijn weergegeven in tabel 1. Een beetje duiding:</p>



<ul class="wp-block-list">
<li>De testen werden uitgevoerd op op AWS EC2 r7i.8xlarge VMs, met 32 vCPU&#8217;s (Intel Xeon Platinum 8588C @ 3.2 GHz) en 256 GB RAM.</li>



<li>Er wordt een onderscheid gemaakt tussen een uitvoering op een LAN aan een snelheid van 1 Gbps en op een WAN aan een snelheid van 150 Mbps.</li>



<li>De variable <em>m</em> representeert het aantal records dat door elk van de databronnen meegegeven wordt. Het is in onze testen minimaal 2<sup>16</sup> = 65 536 en maximaal 2<sup>24</sup> = 16 777 216. In werkelijkheid is het aantal records uiteraard verschillend per databron, maar deze resultaten geven alvast een bovengrens.</li>



<li>De variable κ (kappa) representeert het computationele veiligheidsniveau. 128 bit security volstaat vandaag, al wordt voor data die lange tijd gevoelig blijft toch 192 of zelfs 256 bit security aanbevolen. De variable λ (lambda) representeert de corresponderende statistische veiligheidsparameter.&nbsp;</li>



<li>De variabele <em>n</em> representeert het aantal data holders. We deden testen met 3, 5 en 7 data holders, maar er zijn geen technische beperkingen voor een veel groter aantal.</li>
</ul>



<figure class="wp-block-image aligncenter"><a href="https://www.smalsresearch.be/wp-content/uploads/2025/12/results.png"><img loading="lazy" decoding="async" width="1024" height="255" src="https://www.smalsresearch.be/wp-content/uploads/2025/12/results-1024x255.png" alt="" class="wp-image-24718" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/12/results-1024x255.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/12/results-300x75.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/12/results-768x191.png 768w, https://www.smalsresearch.be/wp-content/uploads/2025/12/results-1536x382.png 1536w, https://www.smalsresearch.be/wp-content/uploads/2025/12/results.png 1713w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption"><em>Performantieresultaten (in seconden) van het LetheLink prototype</em></figcaption></figure>



<p>Nu we weten hoe deze tabel te interpreteren, zien we dat er bijvoorbeeld 25 seconden nodig zijn om het protocol uit te voeren waarbij drie databronnen elk 1 miljoen (2<sup>20</sup>) records aanleveren over een WAN, met een veiligheidsniveau van 256 bits. De hoeveelheid meegeleverde data heeft eveneens impact op de uitvoeringstijd, maar daarvoor verwijzen we naar tabel 3 in onze gemeenschappelijke <a href="https://arxiv.org/abs/2512.08558">publicatie</a>. <strong>Samengevat zijn zowel het protocol als de implementatie ervan bijzonder efficiënt. </strong>Figuur 4 geeft, ter afronding, een sfeerbeeld van het uitvoeren van de testen.</p>



<figure class="wp-block-image aligncenter"><a href="https://www.smalsresearch.be/wp-content/uploads/2025/12/1000014576-scaled.jpg"><img loading="lazy" decoding="async" width="1024" height="611" src="https://www.smalsresearch.be/wp-content/uploads/2025/12/1000014576-1024x611.jpg" alt="" class="wp-image-24721" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/12/1000014576-1024x611.jpg 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/12/1000014576-768x459.jpg 768w, https://www.smalsresearch.be/wp-content/uploads/2025/12/1000014576-2048x1223.jpg 2048w, https://www.smalsresearch.be/wp-content/uploads/2025/12/1000014576-300x179.jpg 300w, https://www.smalsresearch.be/wp-content/uploads/2025/12/1000014576-1536x917.jpg 1536w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Figuur 4. Sfeerbeeld bij het uitvoeren van de testen</figcaption></figure>



<h1 class="wp-block-heading">Verhouding tot eHealths Blinde Pseudonimiseringsdienst</h1>



<p>Smals Research ontwikkelde in de periode 2021-2022 de <a href="https://www.smalsresearch.be/basisprincipes-voor-een-moderne-pseudonimiseringsdienst/">blinde pseudonimiseringsdienst voor eHealth</a>. Daarmee kunnen rijksregisternummers omgezet worden in pseudoniemen – unieke codes – en vice versa. Die omzetting gebeurt door een pseudonimiseringsdienst die echter blind is: het ziet rijksregisternummers noch pseudoniemen. Deze dienst kan <a href="https://www.smalsresearch.be/kruisen-van-persoonsgegevens-met-ehealths-blinde-pseudonimiseringsdienst-2/">eveneens</a> gebruikt worden om gegevens te pseudonimiseren én te kruisen. Wat zijn dan de verschillen?</p>



<ul class="wp-block-list">
<li><strong>Status.</strong> De blinde pseudonimiseringsdienst staat reeds in productie, terwijl LetheLink slechts een prototype is.</li>



<li><strong>Datalekkage.</strong> Voor complexere kruisingsprojecten, zoals diegene waar in dit artikel van vertrokken wordt, zal de blinde pseudonimiseringsdienst niet altijd kunnen verhinderen dat er datalekken optreden. Met name zal er sprake zijn van gegevenslekkage wanneer een databron niet autonoom kan bepalen welke records relevant zijn om de onderzoeksvraag te kunnen beantwoorden. Afhankelijk van de use case kan dit gaan om een aanvaardbaar residuele datalekkage, of het kan gaan over meer substantiële datalekken, die effectief de privacy van betrokkenen aantasten. Anderzijds ontstaan er bij LetheLink risico&#8217;s wanneer één entiteit zowel data holder als data collector is.</li>



<li><strong>Snelheid.</strong> eHealths blinde pseudonimiseringsdienst is weliswaar erg snel – het kan duizenden conversies per seconde aan -, maar LetheLink is bliksemsnel – het doet tienduizenden conversies per seconde en onder bepaalde omstandigheden kan het over de honderduizend gaan. Veel zal natuurlijk afhangen van de gebruikte infrastructuur.</li>



<li><strong>Infrastructuur.</strong> eHealths blinde pseudonimiseringsdienst is sowieso een centrale entiteit die over voldoende capaciteit moet beschikken. LetheLink daarentegen is gedistribueerd, waardoor een dergelijke centrale partij niet langer vereist is: het volstaat dat elke partij de LetheLink client draait op zijn bestaande machines. Dat kunnen zelfs reguliere laptops zijn.</li>



<li><strong>Integratie.</strong> Om gebruik te maken van de blinde pseudonimiseringsdienst moet een organisatie logica integreren in zijn clienttoepassing. Uit ervaring weten we dat dit gelukkig relatief eenvoudig is, maar het blijft niettemin een investering. LetheLink is een standalone client en dus is er geen integratietraject nodig.</li>



<li><strong>Type aanvragen.</strong> eHealths blinde pseudonimiseringsdienst kan overweg met zowel batch aanvragen als met aanvragen die in real-time afgehandeld moeten worden. LetheLink kan enkel overweg met verwerkingen in batch.</li>
</ul>



<p>Deze positionering van LetheLink en eHealths blinde pseudonimiseringsdienst ten opzichte van elkaar zou organisaties moeten helpen om te bepalen welke technologie het meest geschikt is voor hun use cases.</p>



<h1 class="wp-block-heading">Uitbreidingen</h1>



<p>Er zullen een aantal uitbreidingen van LetheLink nodig zijn om het ook daadwerkelijk in de praktijk te kunnen inzetten. Alle voorgestelde uitbreidingen zijn conceptueel alvast mogelijk, maar niet steeds in het prototype geïntegreerd. <strong>Dit zal enkel gebeuren indien er een concrete vraag komt.</strong></p>



<ul class="wp-block-list">
<li><strong>Minimale grootte resultaatset.</strong> Indien de gepseudonimiseerde resultaatset voor de data collector onvoldoende records bevat is er een risico voor de privacy van de betrokkenen en is het onmogelijk om statistisch relevant onderzoek te doen. Daarom ondersteunt het prototype vandaag reeds de mogelijkheid om een minimale grootte mee te geven in het JSON bestand.</li>



<li><strong>Gecontroleerde re-identificatie.</strong> Indien onderzoekers merken dat een bepaalde burger een hoog risico heeft om een bepaalde ziekte te ontwikkelen, moet het mogelijk zijn deze burger daarvan op de hoogte te stellen. Ook wanneer bij een fraudeonderzoek er een sterk vermoeden van fraude is door bepaalde burgers, moet het mogelijk zijn de bevoegde instantie op de hoogte te brengen. <span data-olk-copy-source="MessageBody">Er moet dus&nbsp;</span>in een mogelijkheid voorzien worden om in uitzonderlijke situaties op gecontroleerde wijze de identiteit van een burger te achterhalen.</li>



<li><strong>Data holder pseudoniemen.</strong> Zoals eerder in dit artikel aangegeven, hebben data holders vaak zelf geen toegang tot het rijksregisternummer van de burgers waarover ze data beheren. Ook in dergelijk gevallen moet het protocol efficiënt uit te voeren zijn.</li>



<li><strong>Selectieve prijsgave.</strong> Momenteel focust het prototype op doorsnedes; enkel indien <em>alle</em> data holders records over eenzelfde burger aanleveren, wordt het samengestelde record zichtbaar voor de data collector. In de praktijk is er meer flexibiliteit nodig, zoals aangegeven in figuur 5. In de use case waarmee we dit artikel begonnen had de onderzoeker gepseudonimiseerde gegevens nodig over alle MS-patiënten, terwijl ons protoype op dit moment enkel gepseudonimiseerde gegevens aanlevert over alle MS-patiënten die <em>ook</em> de kankerdiagnose kregen.&nbsp;</li>



<li><strong>Multi-batch transfer.</strong> In sommige gevallen moeten data holders meermaals data aanleveren aan de data collector, bijvoorbeeld in het kader van longitudinaal onderzoek. De data collector moet in staat zijn doorheen de tijd data over eenzelfde burger aan elkaar te koppelen.</li>



<li><strong>Vereenvoudigde communicatie.</strong> In het prototype communiceren alle betrokken data holders met elkaar, om vervolgens individueel vercijferde data naar de data collector te sturen. In een aangepast protocol zouden data holders enkel data uitwisselen met en via de data collector, bijvoorbeeld via een REST-interface. In de praktijk is dit de meer wenselijke benadering.</li>
</ul>



<p>Laat ons weten indien u andere nuttige uitbreidingen ziet.</p>



<figure class="wp-block-image aligncenter"><a href="https://www.smalsresearch.be/wp-content/uploads/2025/12/selective_disclosure.png"><img loading="lazy" decoding="async" width="1024" height="570" src="https://www.smalsresearch.be/wp-content/uploads/2025/12/selective_disclosure-1024x570.png" alt="" class="wp-image-24754" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/12/selective_disclosure-1024x570.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/12/selective_disclosure-300x167.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/12/selective_disclosure-768x428.png 768w, https://www.smalsresearch.be/wp-content/uploads/2025/12/selective_disclosure-1536x855.png 1536w, https://www.smalsresearch.be/wp-content/uploads/2025/12/selective_disclosure.png 1882w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Figuur 5. Een mogelijke uibreiding, waarbij de resultaatset meer kan zijn dan enkel de records over burgers waar elke betrokken data holder informatie over aanlevert</figcaption></figure>



<h1 class="wp-block-heading">Referenties</h1>



<p>Het initiële concept alsook het prototype en de performantietesten werden uitgevoerd door Smals Research. De academische partners, met name de <a href="https://www.esat.kuleuven.be/cosic/">COSIC</a> groep en de <a href="https://distrinet.cs.kuleuven.be/">DistriNet</a> groep aan de KU Leuven, alsook de <a href="https://crysp.uwaterloo.ca/">CrySP</a> groep aan Waterloo University in Canada, focusten zich op de theoretische uitwerking. Dit resulteerde in 2025 in twee publicaties:</p>



<ul class="wp-block-list">
<li><a href="https://eur06.safelinks.protection.outlook.com/?url=https%3A%2F%2Flink.springer.com%2Fchapter%2F10.1007%2F978-3-031-84748-6_6&amp;data=05%7C02%7Ckristof.verslype%40smals.be%7C68b705fdb22f4881110008de3bb9eb83%7C578bcd46a26646edac84b52b4ebacd22%7C0%7C0%7C639013866892057810%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&amp;sdata=Yo%2F02a8KKrOvYRkjqLNpVqlXRrS%2BP8W95v6yVUBBrsQ%3D&amp;reserved=0">Springer publicatie &#8211; Privacy-By-Design in the Belgian Public Sector</a>. Dit toegankelijke document bespreekt twee innovatieve oplossingen bedacht door Smals Research voor het pseudonimiseren en kruisen van persoonsgegevens; Lethelink en<a href="https://www.smalsresearch.be/kruisen-van-persoonsgegevens-met-ehealths-blinde-pseudonimiseringsdienst-2/"> eHealths blinde pseudonimiseringsdienst</a>.</li>



<li><a href="https://eur06.safelinks.protection.outlook.com/?url=https%3A%2F%2Farxiv.org%2Fabs%2F2512.08558&amp;data=05%7C02%7Ckristof.verslype%40smals.be%7C68b705fdb22f4881110008de3bb9eb83%7C578bcd46a26646edac84b52b4ebacd22%7C0%7C0%7C639013866892083584%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&amp;sdata=Bom%2Fw3Um684o6Y4kJ9Gf8AT3UgIPUwjOVxBZUBQ3oC8%3D&amp;reserved=0">Arxiv publicatie &#8211; Labeled Delegated PSI and its Applications in the Public Sector</a>.&nbsp; Dit academisch artikel beschijft formeel LetheLink, bewijst de correctheid, bespreekt de performantie en positioneert het werkt t.o.v. bestaand academisch werk.</li>
</ul>



<p>Daarnaast verwijs ik graag naar mijn <a href="https://www.youtube.com/watch?v=-mx9vmdezL4">Devoxx talk</a> en <a href="https://www.smalsresearch.be/wp-content/uploads/2024/06/20240606_webinar_pseudonimisatie_PRINT.pdf">Webinar</a> uit 2024 getiteld “<em>Privacy in Practice with Smart Pseudonymisation</em>”. LetheLink/Oblivious Join is één van de drie pseudonimiseringstechnieken die ik er bespreek.</p>



<p>Ten slotte zijn er nog <a href="/wp-content/uploads/2025/12/OJ-simple.pptx">slides</a> beschikbaar voor diegenen die graag snel een intuïtief beeld ontwikkelen over de basisprincipes van Oblivious Join. De bijhorende nota’s geven extra uitleg.</p>



<h1 class="wp-block-heading">Conclusie</h1>



<p>Secundair gebruik van persoonsgegevens kan ons heel wat inzichten verschaffen die beleidsvorming ondersteunen en wetenschappelijk onderzoek stimuleren. Om die inzichten te ontsluiten moeten gegevens afkomstig van verschillende bronnen op een efficiënte wijze verzameld kunnen worden, met respect voor de privacy. Dat wil zeggen dat enkel de noodzakelijke persoonsgegevens gepseudonimiseerd en gekruist worden en dat participerende partijen in dit proces geen persoonsgegevens te weten komen. Dit was in de praktijk verre van evident.</p>



<p>In samenwerking met internationaal toonaangevende universiteiten werkte Smals Research daarom een concept uit dat met behulp van geavanceerde cryptografie dit op een efficiënte wijze mogelijk maakt. Verder werd een demonstreerbaar prototype gebouwd, wat een eerste stap is om dit effectief in de praktijk te kunnen gaan inzetten.</p>



<p>We hebben de voorbije jaren met heel wat partijen samen gezeten. Iedereen vindt het een zeer nuttige tool, maar vooralsnog missen we de commitment van onze partners om dit in de praktijk om te zetten.</p>



<p><strong>De voornaamste uitdaging vandaag is dan ook het productieklaar krijgen van deze oplossing. Neem dus zeker contact met ons op indien u interesse heeft in deze oplossing en eventueel mee uw schouders hieronder wil zetten.</strong></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Made by Smals Research – Croisement des données à caractère personnel dans le respect de la vie privée</title>
		<link>https://www.smalsresearch.be/innovationsmals-croisement-des-donnees-a-caractere-personnel-dans-le-respect-de-la-vie-privee/</link>
		
		<dc:creator><![CDATA[Kristof Verslype]]></dc:creator>
		<pubDate>Thu, 26 Feb 2026 06:30:00 +0000</pubDate>
				<category><![CDATA[[FR]]]></category>
		<category><![CDATA[Blog post]]></category>
		<category><![CDATA[cryptography]]></category>
		<category><![CDATA[Privacy]]></category>
		<category><![CDATA[Privacy by design]]></category>
		<category><![CDATA[privacy-enhancing technologies]]></category>
		<category><![CDATA[Productivity]]></category>
		<category><![CDATA[Security]]></category>
		<guid isPermaLink="false">https://staging.smalsresearch.be/?p=26246</guid>

					<description><![CDATA[En collaboration avec des universités de renommée internationale, Smals a travaillé sur un prototype visant à simplifier considérablement la pseudonymisation et le croisement des données personnelles à des fins secondaires grâce à la cryptographie avancée.]]></description>
										<content:encoded><![CDATA[
<p><em>Dit artikel is ook beschikbaar&nbsp;in het&nbsp;<a href="/innovatiesmals-privacyvriendelijk-kruisen-van-persoonsgegevevens/" data-type="post" data-id="21119">Nederlands</a>.</em></p>



<p>Les données personnelles numériques constituent une source d&#8217;informations qui favorise l&#8217;innovation, le bien-être et la formulation de politiques. Ces données personnelles se trouvent dispersées dans de nombreuses organisations&nbsp;: l&#8217;une détient des données sur le cancer, une autre sur la consommation de médicaments et une autre encore sur les revenus. Dans la pratique, les données personnelles provenant de différentes organisations sont régulièrement regroupées afin de répondre à des questions spécifiques posées par des chercheurs et des décideurs politiques.</p>



<p>Les processus actuels garantissent que le respect de la vie privée dans ce contexte. Il s&#8217;agit malheureusement trop souvent d&#8217;une opération complexe, coûteuse et chronophage. En collaboration avec des universités de renommée internationale, Smals Research a donc travaillé à l&#8217;élaboration d&#8217;un prototype visant à simplifier considérablement ces processus à l&#8217;aide d&#8217;une cryptographie avancée.</p>



<h1 class="wp-block-heading">Problématique basée sur un cas concret</h1>



<p>Nous sommes partis d&#8217;une <a href="https://www.ehealth.fgov.be/ehealthplatform/file/cc73d96153bbd5448a56f19d925d05b1379c7f21/5749691d1687866fa0e6852fe4536cb54f2bf4ad/20-020-n042-behandeling-herstellende-multiple-sclerose.pdf">question de recherche concrète</a>&nbsp;:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><em>Les patients atteints de SEP (sclérose en plaques) sous traitement à base de molécules de tériflunomide ou d&#8217;alemtuzumab courent-ils un risque accru de cancer par rapport aux patients atteints de SEP traités avec d&#8217;autres médicaments&nbsp;?</em></p>
</blockquote>



<p>Pour répondre à cette question, simple en soi, il est nécessaire de croiser les données médicales relatives aux patients atteints de SEP provenant de deux organisations, à savoir le <a href="https://kankerregister.org/fr">Registre belge du cancer (BCR)</a> et l&#8217;<a href="https://www.ima-aim.be/">Agence InterMutualiste (AIM)</a>.</p>



<p>Les deux organisations gèrent les données sous des pseudonymes distincts pour plus de confidentialité ; des codes uniques remplacent les numéros de registre national.</p>



<ul class="wp-block-list">
<li>Le BCR gère les données relatives au cancer concernant les personnes qui ont reçu un diagnostic de cancer. Le BCR ne sait pas quels enregistrements concernent des patients atteints de SEP.</li>



<li>L&#8217;AIM dispose de données relatives aux médicaments prescrits et peut sélectionner les enregistrements des patients atteints de SEP.</li>
</ul>



<p>Les chercheurs doivent avoir accès, dans un environnement sécurisé (<a href="https://www.european-health-data-space.com/European_Health_Data_Space_Article_50_(Proposal_3.5.2022).html">SPE = Secure Processing Environment</a>), aux données provenant du BCR et de l&#8217;AIM concernant tous les patients atteints de SEP. Les données relatives à un même patient mais issues de sources différentes doivent pouvoir être reliées entre elles sur la base d&#8217;un pseudonyme unique utilisé uniquement dans le cadre de cette question de recherche spécifique. Ceci est représenté dans l&#8217;illustration 1.</p>



<figure class="wp-block-image aligncenter wp-image-24710"><a href="https://staging.smalsresearch.be/wp-content/uploads/2025/12/set.png"><img loading="lazy" decoding="async" width="598" height="154" src="https://staging.smalsresearch.be/wp-content/uploads/2025/12/set.png" alt="" class="wp-image-24710" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/12/set.png 598w, https://www.smalsresearch.be/wp-content/uploads/2025/12/set-300x77.png 300w" sizes="auto, (max-width: 598px) 100vw, 598px" /></a><figcaption class="wp-element-caption">Illustration 1&nbsp;: à gauche, l&#8217;ensemble des patients atteints de SEP, à droite, l&#8217;ensemble des citoyens ayant reçu un diagnostic de cancer. Seules les données relatives aux citoyens des deux régions vertes peuvent être divulguées sous forme pseudonymisée à l&#8217;environnement sécurisé.</figcaption></figure>



<p>La question centrale est la suivante&nbsp;:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><em>Comment le BCR peut-il fournir uniquement des enregistrements sur les patients atteints de SEP à l&#8217;environnement sécurisé sans savoir qui est atteint de SEP ou quels enregistrements qu&#8217;il gère concernent des patients atteints de SEP&nbsp;?</em></p>
</blockquote>



<p>Dans une approche classique, soit le BCR enverra trop d&#8217;informations à l&#8217;environnement sécurisé – notamment des données sur chaque patient atteint d&#8217;un cancer –, soit des informations seront divulguées au BCR – qui découvrira alors quels enregistrements concernent des patients atteints de SEP. Une dernière possibilité consiste à faire appel à une entité centrale de confiance qui, certes, aura connaissance des données à caractère personnel, mais à qui l&#8217;on peut faire confiance pour ne pas en faire un usage illicite.</p>



<p>Aucune de ces approches n&#8217;est idéale. Aujourd&#8217;hui, tant au niveau national qu&#8217;international, on fait appel à des intermédiaires centraux fortement réglementés ou on opte pour des solutions sur mesure coûteuses et lentes, dans lesquelles un nouveau flux est défini, validé et mis en œuvre pour chaque question de recherche afin de protéger au maximum la vie privée.</p>



<p>De plus, le chercheur a généralement besoin d&#8217;accéder aux données brutes, ce qui rend les solutions basées sur le <a href="/secure-multiparty-computation-collectieve-berekeningen-op-verspreide-gevoelige-gegevens/">secure multi-party computation</a> inadaptées.&nbsp;</p>



<h1 class="wp-block-heading">Notre proposition de solution</h1>



<p>Partons d&#8217;un scénario fictif dans lequel nous travaillons avec un intermédiaire de confiance et où, pour simplifier, l&#8217;AIM et le BCR ne gèrent pas les données à caractère personnel sous des pseudonymes, mais sous des numéros de registre national. L&#8217;AIM et le BCR envoient tous deux toutes les données potentiellement pertinentes à l&#8217;intermédiaire de confiance.</p>



<p>Le BCR envoie à l&#8217;intermédiaire les données identifiées relatives au cancer de tous les citoyens qui ont reçu un diagnostic de cancer, ce qui est bien sûr beaucoup plus que ce dont le chercheur a besoin. L&#8217;intermédiaire reçoit également toutes les données identifiées relatives aux médicaments prescrits aux patients atteints de SEP de l&#8217;AIM et sait ainsi, sur cette base. </p>



<p><!--StartFragment --><span class="cf0">L&#8217;intermédiaire reçoit également toutes les données identifiées relatives aux médicaments prescrits aux patients atteints de SEP de l&#8217;AIM. Il sait ainsi quels enregistrements fournis par le BCR concernent des patients atteints de SEP et donc quels enregistrements sont pertinents dans le cadre de la question de recherche</span>. L&#8217;intermédiaire entreprend alors les étapes suivantes&nbsp;:</p>



<ol class="wp-block-list">
<li>Il supprime les enregistrements non pertinents, c&#8217;est-à-dire les enregistrements concernant tous les citoyens qui ont reçu un diagnostic de cancer mais qui ne sont pas atteints de SEP.</li>



<li>Il fusionne les enregistrements concernant les mêmes citoyens et remplace les numéros de registre national par des pseudonymes uniques dans les enregistrements fusionnés.</li>



<li>Il envoie le résultat – uniquement les enregistrements fusionnés – vers l&#8217;environnement sécurisé.</li>



<li>Il supprime toutes les données reçues et dérivées.</li>
</ol>



<p>Dans ce scénario, il n&#8217;y a pas de fuite involontaire de données vers les sources de données et l&#8217;environnement sécurisé ne reçoit que les données personnelles pseudonymisées minimales nécessaires.</p>



<p>Notre prototype fait exactement cela, mais <strong>sans l&#8217;intermédiaire de confiance</strong>. Le rôle de l&#8217;intermédiaire de confiance est distribué&nbsp;: les détenteurs de données – dans ce cas, l&#8217;AIM et le BCR – et un collecteur de données – dans ce cas, l&#8217;environnement sécurisé – interagissent pour assumer ensemble le rôle de l&#8217;intermédiaire de confiance. Les caractéristiques de sécurité mentionnées dans le paragraphe précédent sont conservées ; aucune information n&#8217;est donc divulguée involontairement aux détenteurs de données et le collecteur de données ne prend connaissance que des données pseudonymisées strictement nécessaires. La solution reste néanmoins pratique et efficace. Tout cela est possible grâce à une cryptographie avancée.</p>



<p>Comme nous l&#8217;avons mentionné précédemment, l&#8217;AIM et le BCR conservent les données sous des pseudonymes. Il existe des procédures permettant de les convertir de manière contrôlée en numéros de registre national. L&#8217;entité qui gère les données n&#8217;a jamais connaissance des registres nationaux et l&#8217;entité qui peut associer les pseudonymes aux numéros de registre national n&#8217;a à aucun moment accès aux données à caractère personnel proprement dites. Par souci de simplicité et pour la suite de cet article, nous partons du principe que les détenteurs de données connaissent les données identifiées par les numéros de registre national plutôt que par les pseudonymes. Notre concept peut également s&#8217;appliquer de manière sécurisée à des situations plus réalistes où ce n&#8217;est pas le cas.</p>



<h1 class="wp-block-heading">Dans la pratique</h1>



<p><a href="/wp-content/uploads/2025/12/Wilhelm_Wandschneider_-_Lethe_Modell.jpg"><img loading="lazy" decoding="async" width="150" height="106" class="alignright size-medium wp-image-23397" src="/wp-content/uploads/2025/12/Wilhelm_Wandschneider_-_Lethe_Modell.jpg" alt=""></a>Smals Research a développé ce concept en collaboration avec des partenaires universitaires. Initialement baptisé Oblivious Join, il a été renommé <em>LetheLink</em> dans le contexte universitaire.&nbsp;<a href="https://fr.wikipedia.org/wiki/L%C3%A9th%C3%A9">Lethe</a> (Λήθη) est, dans la mythologie grecque, la déesse de l&#8217;oubli et l&#8217;un des cinq fleuves des enfers, au bord duquel les morts s&#8217;abreuvent pour oublier leur vie terrestre. Malgré cet oubli – ou plutôt ce manque de connaissance –, les entités en interaction parviennent à relier entre elles les données nécessaires. La convivialité et l&#8217;efficacité ont été au cœur du développement de ce concept.</p>



<p>Smals Research a développé un prototype démontrable qui donne déjà un aperçu du fonctionnement d&#8217;une solution entreprise-ready. L&#8217;utilisation du prototype est présentée dans l&#8217;illustration 2 et comprend les étapes suivantes&nbsp;:</p>



<ol class="wp-block-list">
<li><strong>Création d&#8217;un fichier JSON.</strong> Une organisation pouvant servir de point de contact (par exemple, la <a href="https://www.hda.belgium.be/fr">HDA</a> ou la <a href="https://www.ksz-bcss.fgov.be/fr">BCSS</a>) reçoit une demande d&#8217;un chercheur. Lorsque la base juridique pour ce traitement de données existe, cette organisation établit un fichier JSON signé numériquement. Ce fichier JSON contient, sous une forme structurée, toutes les informations nécessaires à l&#8217;exécution correcte du protocole pour le croisement sécurisé des données des détenteurs de données&nbsp;: les données de connexion des clients des détenteurs de données et du collecteur de données, les paramètres cryptographiques, les clés publiques, les informations sur les données que chaque détenteur de données doit fournir, etc. Dans la pratique, on partira de templates à partir desquels on pourra dériver des fichiers JSON avec un minimum d&#8217;effort.</li>



<li><strong>Distribution du fichier JSON.</strong> Ce fichier JSON est envoyé à la fois au collecteur de données et aux détenteurs de données. Tous vérifient la signature numérique. Toutes les entités concernées savent désormais comment exécuter le protocole et comment contacter les autres entités concernées en toute sécurité.</li>



<li><strong>Téléchargement du client.</strong> Si ce n&#8217;est pas déjà fait, le collecteur de données et les détenteurs de données téléchargent le client LetheLink.</li>



<li><strong>Création de fichiers CSV.</strong> Sur la base du fichier JSON, chaque détenteur de données génère un fichier CSV contenant toutes les données identifiées potentiellement pertinentes. Dans le scénario décrit précédemment, cela inclurait, pour le BCR, toutes les informations identifiées demandées concernant tous les citoyens ayant reçu un diagnostic de cancer. La création de ce fichier ne relève pas du champ d&#8217;application de LetheLink. Notre prototype ne prend en charge que les fichiers CSV, mais cette fonctionnalité peut être étendue.</li>



<li><strong>Importation du client.</strong> Chaque participant fournit le fichier JSON à son client LetheLink local. Les détenteurs de données fournissent également leur fichier CSV généré localement à leur client. Les données sont livrées en clair et le client se charge du chiffrement.</li>



<li><strong>Exécution du protocole.</strong> Le protocole est exécuté. Du côté du collecteur (SPE) des données, cela donne un fichier CSV qui ne contient que les données pseudonymisées et minimales nécessaires.</li>
</ol>



<figure class="wp-block-image aligncenter"><a href="/wp-content/uploads/2025/12/gebruik-1.png"><img loading="lazy" decoding="async" width="1024" height="572" src="/wp-content/uploads/2025/12/gebruik-1-1024x572.png" alt="" class="wp-image-24742" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/12/gebruik-1-1024x572.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/12/gebruik-1-300x168.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/12/gebruik-1-768x429.png 768w, https://www.smalsresearch.be/wp-content/uploads/2025/12/gebruik-1-1536x858.png 1536w, https://www.smalsresearch.be/wp-content/uploads/2025/12/gebruik-1-2048x1144.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Illustration 2. Aperçu de l&#8217;utilisation de LetheLink dans la pratique</figcaption></figure>



<p>L&#8217;avantage de cette approche réside dans sa flexibilité d&#8217;utilisation. Certains détenteurs de données ne sont impliqués que très occasionnellement dans de tels projets croisés et tous les détenteurs de données ne disposent pas des mêmes ressources. Grâce à l&#8217;approche LetheLink, nul besoin de réaliser d&#8217;importants investissements ou préparatifs. Il suffit d&#8217;installer le client et de créer le fichier CSV.</p>



<p>L&#8217;illustration 3 présente un exemple fictif de tels fichiers CSV. En haut figurent des extraits de fichiers CSV que les détenteurs de données (trois dans le cas présent) fournissent chacun en entrée à leur client LetheLink. Au bas de l&#8217;illustration, un extrait du fichier CSV généré en sortie par le client du collecteur de données à la suite de l&#8217;exécution du protocole est présenté. Dans notre exemple fictif, le chercheur s&#8217;intéresse uniquement aux données transversales, c&#8217;est-à-dire aux données relatives aux 50&nbsp;000 patients atteints de SEP qui ont reçu un diagnostic de cancer et présentent un profil de risque élevé. La personne dont le numéro de registre national est 60.01.05-045.05 appartient à ce groupe. Le collecteur de données voit les informations combinées sur ce citoyen, non pas sous ce numéro de registre national, mais sous le pseudonyme &#8220;153807&#8230;&#8221;.</p>



<figure class="wp-block-image aligncenter"><a href="/wp-content/uploads/2025/12/fictional_data-1.png"><img loading="lazy" decoding="async" width="1024" height="574" src="/wp-content/uploads/2025/12/fictional_data-1-1024x574.png" alt="" class="wp-image-24717" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/12/fictional_data-1-1024x574.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/12/fictional_data-1-300x168.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/12/fictional_data-1-768x430.png 768w, https://www.smalsresearch.be/wp-content/uploads/2025/12/fictional_data-1-1536x860.png 1536w, https://www.smalsresearch.be/wp-content/uploads/2025/12/fictional_data-1-2048x1147.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Illustration 3. Exemple fictif avec des extraits de trois fichiers CSV d&#8217;entrée (en haut) et le fichier de sortie résultant (en bas)</figcaption></figure>



<h1 class="wp-block-heading">Performance</h1>



<p>Dans le cadre de la collaboration académique, la performance a été considérablement améliorée au cours de plusieurs itérations, tant au niveau de l&#8217;algorithme qu&#8217;au niveau de la mise en œuvre. Les principaux résultats des tests sont présentés dans le tableau 1. Quelques précisions&nbsp;:</p>



<ul class="wp-block-list">
<li>Les tests ont été effectués sur des machines virtuelles AWS EC2 r7i.8xlarge, avec 32 vCPU (Intel Xeon Platinum 8588C @ 3,2 GHz) et 256 Go de RAM.</li>



<li>Une distinction est opérée entre une exécution sur un LAN à une vitesse de 1 Gbps et sur un WAN à une vitesse de 150 Mbps.</li>



<li>La variable <em>m</em> représente le nombre d&#8217;enregistrements fournis par chacune des sources de données. Dans nos tests, elle est comprise entre un minimum de 2<sup>16</sup>= 65.536 et maximum de 2<sup>24</sup>= 16.777.216. En réalité, le nombre d&#8217;enregistrements varie bien sûr selon la source de données, mais ces résultats fournissent déjà une limite supérieure.</li>



<li>La variable κ (kappa) représente le niveau de sécurité computationnel. Une sécurité de 128 bits est suffisante aujourd&#8217;hui, mais une sécurité de 192 ou même de 256 bits est recommandée pour les données qui restent sensibles pendant une longue période. La variable λ (lambda) représente le paramètre de sécurité statique correspondant.&nbsp;</li>



<li>La variable <em>n</em> représente le nombre de détenteurs de données. Nous avons effectué des tests avec 3, 5 et 7 détenteurs de données, mais il n&#8217;y a aucune limitation technique pour un nombre beaucoup plus important.</li>
</ul>



<figure class="wp-block-image alignnone"><a href="/wp-content/uploads/2025/12/results.png"><img loading="lazy" decoding="async" width="1024" height="255" src="/wp-content/uploads/2025/12/results-1024x255.png" alt="" class="wp-image-24718" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/12/results-1024x255.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/12/results-300x75.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/12/results-768x191.png 768w, https://www.smalsresearch.be/wp-content/uploads/2025/12/results-1536x382.png 1536w, https://www.smalsresearch.be/wp-content/uploads/2025/12/results.png 1713w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Résultats de performance (en secondes) du prototype LetheLink</figcaption></figure>



<p>Maintenant que nous savons comment interpréter ce tableau, nous constatons par exemple qu&#8217;il faut 25 secondes pour exécuter le protocole lorsque trois sources de données fournissent chacune 1 million (2<sup>20</sup>) d&#8217;enregistrements sur un WAN. La quantité de données fournies a également un impact sur le temps d&#8217;exécution, mais pour cela, nous vous renvoyons au tableau 3 de notre <a href="https://arxiv.org/abs/2512.08558">publication</a> commune.&nbsp;<strong>En résumé, tant le protocole que sa mise en œuvre sont particulièrement efficaces.&nbsp;</strong>Pour conclure, l&#8217;illustration 4 donne une idée générale de la réalisation des tests.</p>



<figure class="wp-block-image aligncenter"><a href="/wp-content/uploads/2025/12/1000014576-scaled.jpg"><img loading="lazy" decoding="async" width="1024" height="611" src="/wp-content/uploads/2025/12/1000014576-1024x611.jpg" alt="" class="wp-image-24721" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/12/1000014576-1024x611.jpg 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/12/1000014576-768x459.jpg 768w, https://www.smalsresearch.be/wp-content/uploads/2025/12/1000014576-2048x1223.jpg 2048w, https://www.smalsresearch.be/wp-content/uploads/2025/12/1000014576-300x179.jpg 300w, https://www.smalsresearch.be/wp-content/uploads/2025/12/1000014576-1536x917.jpg 1536w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Illustration 4. Illustration de l&#8217;exécution des tests</figcaption></figure>



<h1 class="wp-block-heading">Relation avec le service de pseudonymisation à l&#8217;aveugle d&#8217;eHealth</h1>



<p>Smals Research a développé le <a href="/basisprincipes-voor-een-moderne-pseudonimiseringsdienst-2/">service de pseudonymisation à l&#8217;aveugle pour eHealth</a> au cours de la période 2021-2022. Ce service permet de convertir les numéros de registre national en pseudonymes (codes uniques) et vice versa. Cette conversion est effectuée par un service de pseudonymisation qui est toutefois aveugle&nbsp;: il ne voit ni les numéros de registre national ni les pseudonymes. Ce service peut <a href="/kruisen-van-persoonsgegevens-met-ehealths-blinde-pseudonimiseringsdienst/">également</a> être utilisé pour pseudonymiser et croiser des données. Quelles sont les différences&nbsp;?</p>



<ul class="wp-block-list">
<li><strong>Statut.</strong>&nbsp;Le service de pseudonymisation à l&#8217;aveugle est déjà en production, tandis que LetheLink n&#8217;est qu&#8217;un prototype.</li>



<li><strong>Fuite de données.</strong>&nbsp;Pour les projets de recoupement plus complexes, tels que ceux évoqués dans cet article, le service de pseudonymisation à l&#8217;aveugle ne pourra pas toujours empêcher les fuites de données. Il y aura notamment des fuites de données lorsqu&#8217;une source de données ne peut pas déterminer de manière autonome quels enregistrements sont pertinents pour répondre à la question de recherche. Selon le use case, il peut s&#8217;agir d&#8217;une fuite de données résiduelle acceptable ou de fuites de données plus substantielles, qui portent effectivement atteinte à la vie privée des personnes concernées. D&#8217;autre part, LetheLink présente des risques lorsqu&#8217;une seule entité est à la fois détentrice et collectrice de données.</li>



<li><strong>Rapidité.</strong> Le service de pseudonymisation à l&#8217;aveugle d&#8217;eHealth est certes très rapide &#8211; il peut effectuer des milliers de conversions par seconde -, mais LetheLink est ultra-rapide &#8211; il effectue des dizaines de milliers de conversions par seconde et, dans certaines circonstances, peut dépasser les cent mille. Tout dépendra bien sûr de l&#8217;infrastructure utilisée.</li>



<li><strong>Infrastructure.</strong> Le service de pseudonymisation à l&#8217;aveugle d&#8217;eHealth est dans tous les cas une entité centrale qui doit disposer d&#8217;une capacité suffisante. LetheLink, en revanche, est distribué, ce qui rend inutile une telle entité centrale&nbsp;: il suffit que chaque entité exécute le client LetheLink sur ses machines existantes. Il peut même s&#8217;agir d&#8217;ordinateurs portables classiques.</li>



<li><strong>Intégration.</strong>&nbsp;Afin d&#8217;utiliser le service de pseudonymisation à l&#8217;aveugle, une organisation doit intégrer une logique dans son application client. Nous savons par expérience que cela est relativement simple, mais cela reste néanmoins un investissement. LetheLink est un client autonome et ne nécessite donc aucun processus d&#8217;intégration.</li>



<li><strong>Types de demandes.</strong> Le service de pseudonymisation à l&#8217;aveugle d&#8217;eHealth peut traiter tant les demandes en batch que les demandes qui doivent être traitées en temps réel. LetheLink ne prend en charge que les traitements en batch.</li>
</ul>



<p>Ce positionnement respectif de LetheLink et du service de pseudonymisation à l&#8217;aveugle d&#8217;eHealth devrait aider les organisations à déterminer la technologie la plus adaptée à leurs use cases.</p>



<h1 class="wp-block-heading">Extensions</h1>



<p>Un certain nombre d&#8217;extensions de LetheLink seront nécessaires pour pouvoir l&#8217;utiliser dans la pratique. Toutes les extensions proposées sont déjà conceptuellement possibles, mais ne sont pas toujours intégrées dans le prototype.&nbsp;<strong>Cela ne se fera que si une demande concrète est formulée.</strong></p>



<ul class="wp-block-list">
<li><strong>Taille minimale de l&#8217;ensemble de résultats.</strong>&nbsp;Si l&#8217;ensemble de résultats pseudonymisés pour le collecteur de données ne contient pas suffisamment d&#8217;enregistrements, il existe un risque pour la vie privée des personnes concernées et il est impossible de mener des recherches statistiquement pertinentes. C&#8217;est pourquoi le prototype prend déjà en charge la possibilité d&#8217;indiquer une taille minimale dans le fichier JSON.</li>



<li><strong>Réidentification contrôlée.</strong>&nbsp;Si les chercheurs constatent qu&#8217;un citoyen donné présente un risque élevé de développer une certaine maladie, il doit être possible d&#8217;en informer ce citoyen. De même, lorsqu&#8217;une enquête sur une fraude révèle une forte suspicion de fraude de la part de certains citoyens, il doit être possible d&#8217;en informer l&#8217;autorité compétente. Il doit donc être possible, dans des situations exceptionnelles, de vérifier l&#8217;identité d&#8217;un citoyen de manière contrôlée.</li>



<li><strong>Pseudonymes des détenteurs de données.</strong>&nbsp;Comme indiqué précédemment dans cet article, les détenteurs de données n&#8217;ont souvent pas eux-mêmes accès au numéro de registre national des citoyens dont ils gèrent les données. Dans de tels cas également, le protocole doit pouvoir être mis en œuvre efficacement.</li>



<li><strong>Divulgation sélective.</strong>&nbsp;Actuellement, le prototype se concentre sur des moyennes&nbsp;; ce n&#8217;est que si <em>tous</em> les détenteurs de données fournissent des enregistrements sur un même citoyen que l&#8217;enregistrement composite devient visible pour le collecteur de données. Dans la pratique, une plus grande flexibilité est requise, comme l&#8217;indique l&#8217;illustration 5. Dans le cas d&#8217;utilisation présenté en introduction de cet article, le chercheur avait besoin de données pseudonymisées sur tous les patients atteints de SEP, alors que notre prototype ne fournit actuellement que des données pseudonymisées sur tous les patients atteints de SEP ayant également reçu un diagnostic de cancer.</li>



<li><strong>Transfert multi-batch.</strong>&nbsp;Dans certains cas, les détenteurs de données doivent fournir des données à plusieurs reprises au collecteur de données, par exemple dans le cadre d&#8217;une étude longitudinale. Le collecteur de données doit être capable de relier entre elles les données relatives à un même citoyen au fil du temps.</li>



<li><strong>Communication simplifiée.</strong>&nbsp;Dans le prototype, tous les détenteurs de données concernés communiquent entre eux, puis envoient individuellement des données cryptées au collecteur de données. Dans un protocole adapté, les détenteurs de données n&#8217;échangeraient des données qu&#8217;avec et via le collecteur de données, par exemple via une interface REST. Dans la pratique, cette approche est plus souhaitable.</li>
</ul>



<p>Veuillez nous faire part de toute autre extension utile que vous pourriez envisager.</p>



<figure class="wp-block-image aligncenter"><a href="/wp-content/uploads/2025/12/selective_disclosure.png"><img loading="lazy" decoding="async" width="1024" height="570" src="/wp-content/uploads/2025/12/selective_disclosure-1024x570.png" alt="" class="wp-image-24754" srcset="https://www.smalsresearch.be/wp-content/uploads/2025/12/selective_disclosure-1024x570.png 1024w, https://www.smalsresearch.be/wp-content/uploads/2025/12/selective_disclosure-300x167.png 300w, https://www.smalsresearch.be/wp-content/uploads/2025/12/selective_disclosure-768x428.png 768w, https://www.smalsresearch.be/wp-content/uploads/2025/12/selective_disclosure-1536x855.png 1536w, https://www.smalsresearch.be/wp-content/uploads/2025/12/selective_disclosure.png 1882w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></a><figcaption class="wp-element-caption">Illustration 5. Une possible extension, dans laquelle l&#8217;ensemble des résultats peut être plus que les simples enregistrements sur les citoyens pour lesquels chaque détenteur de données concerné fournit des informations</figcaption></figure>



<h1 class="wp-block-heading">Références</h1>



<p>Le concept initial ainsi que le prototype et les tests de performance ont été réalisés par Smals Research. Les partenaires universitaires, notamment le groupe <a href="https://www.esat.kuleuven.be/cosic/">COSIC</a> et le groupe <a href="https://distrinet.cs.kuleuven.be/">DistriNet</a> de la KU Leuven, ainsi que le groupe <a href="https://crysp.uwaterloo.ca/">CrySP</a> de l&#8217;université de Waterloo au Canada, se sont concentrés sur l&#8217;élaboration théorique. Cela a donné lieu à deux publications en 2025&nbsp;:</p>



<ul class="wp-block-list">
<li><a href="https://eur06.safelinks.protection.outlook.com/?url=https%3A%2F%2Flink.springer.com%2Fchapter%2F10.1007%2F978-3-031-84748-6_6&amp;data=05%7C02%7Ckristof.verslype%40smals.be%7C68b705fdb22f4881110008de3bb9eb83%7C578bcd46a26646edac84b52b4ebacd22%7C0%7C0%7C639013866892057810%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&amp;sdata=Yo%2F02a8KKrOvYRkjqLNpVqlXRrS%2BP8W95v6yVUBBrsQ%3D&amp;reserved=0">Publication de Springer&nbsp;:Privacy-By-Design in the Belgian Public Sector</a> Ce document accessible traite de deux solutions innovantes conçues par Smals Research pour la pseudonymisation et le croisement des données à caractère personnel&nbsp;: Lethelink et <a href="/kruisen-van-persoonsgegevens-met-ehealths-blinde-pseudonimiseringsdienst/">le service de pseudonymisation à l&#8217;aveugle d&#8217;eHealth</a>.</li>



<li><a href="https://eur06.safelinks.protection.outlook.com/?url=https%3A%2F%2Flink.springer.com%2Fchapter%2F10.1007%2F978-3-031-84748-6_6&amp;data=05%7C02%7Ckristof.verslype%40smals.be%7C68b705fdb22f4881110008de3bb9eb83%7C578bcd46a26646edac84b52b4ebacd22%7C0%7C0%7C639013866892057810%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&amp;sdata=Yo%2F02a8KKrOvYRkjqLNpVqlXRrS%2BP8W95v6yVUBBrsQ%3D&amp;reserved=0">Publication de Springer&nbsp;:Privacy-By-Design in the Belgian Public Sector</a> Ce document accessible traite de deux solutions innovantes conçues par Smals Research pour la pseudonymisation et le croisement des données à caractère personnel&nbsp;: Lethelink et <a href="/kruisen-van-persoonsgegevens-met-ehealths-blinde-pseudonimiseringsdienst/">le service de pseudonymisation à l&#8217;aveugle d&#8217;eHealth</a>.</li>
</ul>



<p>Je vous invite également à consulter ma <a href="https://www.youtube.com/watch?v=-mx9vmdezL4">contribution à la conférence Devoxx</a> et mon <a href="https://www.smalsresearch.be/wp-content/uploads/2024/06/20240606_webinar_pseudonimisatie_PRINT.pdf">webinaire</a> de 2024 intitulé <em>&#8220;Privacy in Practice with Smart Pseudonymisation&#8221;.</em> LetheLink/Oblivious Join est l&#8217;une des trois techniques de pseudonymisation que j&#8217;y aborde.</p>



<p>Enfin, des <a href="/wp-content/uploads/2025/12/OJ-simple.pptx">slides</a> sont disponibles pour ceux qui souhaitent se faire rapidement une idée intuitive des principes de base de l&#8217;Oblivious Join. Les notes correspondantes fournissent des explications supplémentaires.</p>



<h2 class="wp-block-heading"><strong>Conclusion</strong></h2>



<p>L&#8217;utilisation secondaire des données à caractère personnel peut nous fournir de nombreuses informations qui soutiennent l&#8217;élaboration des politiques et stimulent la recherche scientifique. Pour exploiter ces informations, les données provenant de différentes sources doivent pouvoir être collectées de manière efficace, dans le respect de la vie privée. Cela signifie que seules les données à caractère personnel nécessaires sont pseudonymisées et croisées et que les autres entités participant à ce processus n&#8217;ont pas accès aux données à caractère personnel. Dans la pratique, cela était loin d&#8217;être évident.</p>



<p>En collaboration avec des universités de renommée internationale, Smals Research a donc élaboré un concept qui, grâce à une cryptographie avancée, permet de le faire de manière efficace. Un prototype démontrable a également été construit, ce qui constitue une première étape vers une mise en œuvre effective dans la pratique.</p>



<p>Au cours des dernières années, nous avons rencontré de nombreuses entités. Tout le monde considère qu&#8217;il s&#8217;agit d&#8217;un outil très utile, mais nous ne disposons pour l&#8217;instant pas de l&#8217;engagement de nos partenaires pour le mettre en pratique.</p>



<p><strong>Le défi principal aujourd&#8217;hui est donc de rendre cette solution prête à la production. N&#8217;hésitez pas à nous contacter si cette solution vous intéresse et si vous souhaitez éventuellement y contribuer.</strong></p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
