mercredi, 1 avril, 2026
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 :
| Option | Description |
|---|---|
| Périmètre | Projet entier, sélection d'échantillons, ou filtre par élément. |
| Inclure les méthodes | Embarque les protocoles analytiques dans le fichier. |
| Inclure les rendements de purification | Embarque 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érateur | Nom affiché dans created_by.operator. |
| Organisation | Nom affiché dans created_by.organisation et dans la 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.