Créer et signer un fichier .isof

Trois approches pour produire un fichier .isof valide : export depuis l'interface IsoFind, via l'API locale, ou construction programmatique depuis Python ou un LIMS tiers.

Un fichier .isof peut être créé depuis l'interface IsoFind, depuis l'API locale, ou programmatiquement via Python. Cette page couvre les trois méthodes et les options de signature disponibles. Pour comprendre le mécanisme de signature, voir Signatures numériques.

Depuis l'interface IsoFind

Export d'un projet ou d'une sélection

Fichier Exporter projet (.isof)

IsoFind ouvre une fenêtre d'options d'export avec les paramètres suivants :

OptionDescription
PérimètreProjet entier, sélection d'échantillons, ou filtre par élément.
Inclure les méthodesEmbarque les protocoles analytiques dans le fichier.
Inclure les rendements de purificationEmbarque le bloc purification.
Signer (niveau 1)Ajoute l'empreinte SHA-256. Disponible avec toutes les licences.
Signer (niveau 2)Ajoute la signature ECDSA. Nécessite un certificat de laboratoire actif et une licence Pro.
OpérateurNom affiché dans created_by.operator.
OrganisationNom affiché dans created_by.organisation et dans la signature.
Fenêtre d'export .isof avec options de signature Figure 1 : Fenêtre d'export avec les options de signature niveau 1 et niveau 2.

Signer un fichier existant

Un fichier .isof déjà produit peut être signé ultérieurement sans re-exporter les données.

Fichier Signer un fichier .isof Choisir le fichier Sélectionner le niveau
Signer un fichier qui contient déjà une signature du même niveau la remplace. Signer un fichier niveau 1 avec une signature niveau 2 conserve la signature niveau 1 et ajoute la signature niveau 2.

Depuis l'API locale

Exporter et signer en une seule requête

import requests, json # Construire le payload d'export payload = { "sample_ids": [1, 2, 3], # None = projet entier "include_methods": True, "include_purification": True, "sign": True, "sign_level": 1, # 1 = SHA-256, 2 = ECDSA "operator": "Colin Ferrari", "organisation": "IsoFind SAS" } r = requests.post( "http://127.0.0.1:8001/api/isof/export", json=payload, headers=HEADERS ) # Sauvegarder le fichier retourné with open("export.isof", "w", encoding="utf-8") as f: json.dump(r.json(), f, indent=2, ensure_ascii=False)

Signer un fichier existant via l'API

# POST /api/isof/sign : multipart : fichier + clé privée + certificat with open("export.isof") as fi, \ open("lab.key") as fk, \ open("lab.crt") as fc: r = requests.post( "http://127.0.0.1:8001/api/isof/sign", files={ "isof_file": ("export.isof", fi), "private_key": ("lab.key", fk), "certificate": ("lab.crt", fc), }, headers=HEADERS ) signed = r.json() print(signed["signature"]["signed_by"])

Depuis Python (construction manuelle)

Pour construire un fichier .isof depuis zéro : par exemple pour exporter des données depuis un LIMS ou un autre logiciel : voici la structure minimale valide.

import json, hashlib from datetime import datetime, timezone doc = { "isof_version": "1.0", "created_at": datetime.now(timezone.utc).isoformat(), "created_by": { "software": "MonLIMS", "software_version": "3.2", "operator": "Sophie Martin", "organisation": "CNRS : CRPG Nancy" }, "samples": [ { "id": "S01", "name": "ANT-BO-24-003", "material_type": "concentré de flottation", "sector": "Bolivie", "isotope_data": [ { "element": "Sb", "system": "123Sb/121Sb", "ratio": 0.74815, "ratio_2se": 0.00012, "standard": "NIST SRM 3102a" } ] } ] } # Ajouter une signature niveau 1 scope = ["created_by", "isof_version", "created_at", "samples"] payload = {k: doc[k] for k in scope} digest = hashlib.sha256( json.dumps(payload, sort_keys=True, separators=(",", ":"), ensure_ascii=False).encode() ).hexdigest() doc["signature"] = { "level": 1, "algorithm": "SHA-256", "scope": scope, "hash": digest, "signed_at": datetime.now(timezone.utc).isoformat(), "signed_by": "CNRS : CRPG Nancy" } with open("export.isof", "w", encoding="utf-8") as f: json.dump(doc, f, indent=2, ensure_ascii=False)
Le scope de signature doit inclure tous les blocs qui contiennent des données analytiques. Omettre created_by ou created_at du scope permet de modifier les métadonnées sans invalider la signature : cela affaiblit la garantie d'authenticité. IsoFind inclut systématiquement ces 7 blocs dans le scope par défaut.

Nommage des fichiers

La convention recommandée par la spécification ISOF est la suivante :

{projet}_{date}_{laboratoire}.isof # Exemple SDAT-2025-007_20250310_IsoFind.isof

Ce nommage permet un tri chronologique naturel et identifie l'origine du fichier sans l'ouvrir.